From 7be91525a124cfe04e19b890bd733bdf5902d9e9 Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 14 Jul 2008 23:24:45 +0000 Subject: [PATCH] fix shutdown bug --- panda/src/gobj/vertexDataPage.cxx | 8 ++++++-- panda/src/gobj/vertexDataSaveFile.cxx | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/panda/src/gobj/vertexDataPage.cxx b/panda/src/gobj/vertexDataPage.cxx index f01386098a..d3fb0d3355 100644 --- a/panda/src/gobj/vertexDataPage.cxx +++ b/panda/src/gobj/vertexDataPage.cxx @@ -662,6 +662,8 @@ PageThreadManager(int num_threads) : //////////////////////////////////////////////////////////////////// void VertexDataPage::PageThreadManager:: add_page(VertexDataPage *page, RamClass ram_class) { + nassertv(!_shutdown); + if (page->_pending_ram_class == ram_class) { // It's already queued. nassertv(page->get_lru() == &_pending_lru); @@ -704,7 +706,7 @@ remove_page(VertexDataPage *page) { nassertv(page != (VertexDataPage *)NULL); PageThreads::iterator ti; - for (ti = _threads.begin(); ti != _threads.begin(); ++ti) { + for (ti = _threads.begin(); ti != _threads.end(); ++ti) { PageThread *thread = (*ti); if (page == thread->_working_page) { // Oops, this thread is currently working on this one. We'll have @@ -763,10 +765,12 @@ stop_threads() { } PageThreads::iterator ti; - for (ti = _threads.begin(); ti != _threads.begin(); ++ti) { + for (ti = _threads.begin(); ti != _threads.end(); ++ti) { PageThread *thread = (*ti); thread->join(); } + + nassertv(_pending_reads.empty() && _pending_writes.empty()); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/gobj/vertexDataSaveFile.cxx b/panda/src/gobj/vertexDataSaveFile.cxx index 16c3275ecb..067e3f7a25 100644 --- a/panda/src/gobj/vertexDataSaveFile.cxx +++ b/panda/src/gobj/vertexDataSaveFile.cxx @@ -200,12 +200,15 @@ write_data(const unsigned char *data, size_t size, bool compressed) { overlapped.Offset = block->get_start(); DWORD bytes_written = 0; + double start_time = ClockObject::get_global_clock()->get_real_time(); + int num_passes = 0; BOOL success = WriteFile(_handle, data, size, &bytes_written, &overlapped); while (!success) { DWORD error = GetLastError(); if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) { // Wait for more later. Thread::force_yield(); + ++num_passes; } else { gobj_cat.error() << "Error writing " << size @@ -216,7 +219,11 @@ write_data(const unsigned char *data, size_t size, bool compressed) { success = GetOverlappedResult(_handle, &overlapped, &bytes_written, false); } nassertr(bytes_written == size, NULL); - + double finish_time = ClockObject::get_global_clock()->get_real_time(); + if (gobj_cat.is_debug()) { + gobj_cat.debug() + << "Wrote " << size << " bytes in " << *Thread::get_current_thread() << " over " << floor((finish_time - start_time) * 1000.0) << " ms and " << num_passes << " passes.\n"; + } #else // Posix case. if (lseek(_fd, block->get_start(), SEEK_SET) == -1) { @@ -276,12 +283,15 @@ read_data(unsigned char *data, size_t size, VertexDataSaveBlock *block) { overlapped.Offset = block->get_start(); DWORD bytes_read = 0; + double start_time = ClockObject::get_global_clock()->get_real_time(); + int num_passes = 0; BOOL success = ReadFile(_handle, data, size, &bytes_read, &overlapped); while (!success) { DWORD error = GetLastError(); if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) { // Wait for more later. Thread::force_yield(); + ++num_passes; } else { gobj_cat.error() << "Error reading " << size @@ -292,6 +302,12 @@ read_data(unsigned char *data, size_t size, VertexDataSaveBlock *block) { success = GetOverlappedResult(_handle, &overlapped, &bytes_read, false); } nassertr(bytes_read == size, NULL); + double finish_time = ClockObject::get_global_clock()->get_real_time(); + if (gobj_cat.is_debug()) { + gobj_cat.debug() + << "Read " << size << " bytes in " << *Thread::get_current_thread() << " over " << floor((finish_time - start_time) * 1000.0) << " ms and " << num_passes << " passes.\n"; + } + #else // Posix case. if (lseek(_fd, block->get_start(), SEEK_SET) == -1) {