David Rose 17 éve
szülő
commit
7be91525a1

+ 6 - 2
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());
 }
 
 ////////////////////////////////////////////////////////////////////

+ 17 - 1
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) {