mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
fix shutdown bug
This commit is contained in:
parent
ea863f74c2
commit
7be91525a1
@ -662,6 +662,8 @@ PageThreadManager(int num_threads) :
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void VertexDataPage::PageThreadManager::
|
void VertexDataPage::PageThreadManager::
|
||||||
add_page(VertexDataPage *page, RamClass ram_class) {
|
add_page(VertexDataPage *page, RamClass ram_class) {
|
||||||
|
nassertv(!_shutdown);
|
||||||
|
|
||||||
if (page->_pending_ram_class == ram_class) {
|
if (page->_pending_ram_class == ram_class) {
|
||||||
// It's already queued.
|
// It's already queued.
|
||||||
nassertv(page->get_lru() == &_pending_lru);
|
nassertv(page->get_lru() == &_pending_lru);
|
||||||
@ -704,7 +706,7 @@ remove_page(VertexDataPage *page) {
|
|||||||
nassertv(page != (VertexDataPage *)NULL);
|
nassertv(page != (VertexDataPage *)NULL);
|
||||||
|
|
||||||
PageThreads::iterator ti;
|
PageThreads::iterator ti;
|
||||||
for (ti = _threads.begin(); ti != _threads.begin(); ++ti) {
|
for (ti = _threads.begin(); ti != _threads.end(); ++ti) {
|
||||||
PageThread *thread = (*ti);
|
PageThread *thread = (*ti);
|
||||||
if (page == thread->_working_page) {
|
if (page == thread->_working_page) {
|
||||||
// Oops, this thread is currently working on this one. We'll have
|
// Oops, this thread is currently working on this one. We'll have
|
||||||
@ -763,10 +765,12 @@ stop_threads() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageThreads::iterator ti;
|
PageThreads::iterator ti;
|
||||||
for (ti = _threads.begin(); ti != _threads.begin(); ++ti) {
|
for (ti = _threads.begin(); ti != _threads.end(); ++ti) {
|
||||||
PageThread *thread = (*ti);
|
PageThread *thread = (*ti);
|
||||||
thread->join();
|
thread->join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nassertv(_pending_reads.empty() && _pending_writes.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -200,12 +200,15 @@ write_data(const unsigned char *data, size_t size, bool compressed) {
|
|||||||
overlapped.Offset = block->get_start();
|
overlapped.Offset = block->get_start();
|
||||||
|
|
||||||
DWORD bytes_written = 0;
|
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);
|
BOOL success = WriteFile(_handle, data, size, &bytes_written, &overlapped);
|
||||||
while (!success) {
|
while (!success) {
|
||||||
DWORD error = GetLastError();
|
DWORD error = GetLastError();
|
||||||
if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) {
|
if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) {
|
||||||
// Wait for more later.
|
// Wait for more later.
|
||||||
Thread::force_yield();
|
Thread::force_yield();
|
||||||
|
++num_passes;
|
||||||
} else {
|
} else {
|
||||||
gobj_cat.error()
|
gobj_cat.error()
|
||||||
<< "Error writing " << size
|
<< "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);
|
success = GetOverlappedResult(_handle, &overlapped, &bytes_written, false);
|
||||||
}
|
}
|
||||||
nassertr(bytes_written == size, NULL);
|
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
|
#else
|
||||||
// Posix case.
|
// Posix case.
|
||||||
if (lseek(_fd, block->get_start(), SEEK_SET) == -1) {
|
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();
|
overlapped.Offset = block->get_start();
|
||||||
|
|
||||||
DWORD bytes_read = 0;
|
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);
|
BOOL success = ReadFile(_handle, data, size, &bytes_read, &overlapped);
|
||||||
while (!success) {
|
while (!success) {
|
||||||
DWORD error = GetLastError();
|
DWORD error = GetLastError();
|
||||||
if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) {
|
if (error == ERROR_IO_INCOMPLETE || error == ERROR_IO_PENDING) {
|
||||||
// Wait for more later.
|
// Wait for more later.
|
||||||
Thread::force_yield();
|
Thread::force_yield();
|
||||||
|
++num_passes;
|
||||||
} else {
|
} else {
|
||||||
gobj_cat.error()
|
gobj_cat.error()
|
||||||
<< "Error reading " << size
|
<< "Error reading " << size
|
||||||
@ -292,6 +302,12 @@ read_data(unsigned char *data, size_t size, VertexDataSaveBlock *block) {
|
|||||||
success = GetOverlappedResult(_handle, &overlapped, &bytes_read, false);
|
success = GetOverlappedResult(_handle, &overlapped, &bytes_read, false);
|
||||||
}
|
}
|
||||||
nassertr(bytes_read == size, NULL);
|
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
|
#else
|
||||||
// Posix case.
|
// Posix case.
|
||||||
if (lseek(_fd, block->get_start(), SEEK_SET) == -1) {
|
if (lseek(_fd, block->get_start(), SEEK_SET) == -1) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user