diff --git a/include/wx/msw/private/fswatcher.h b/include/wx/msw/private/fswatcher.h index 1442432a35..6e1044ea1d 100644 --- a/include/wx/msw/private/fswatcher.h +++ b/include/wx/msw/private/fswatcher.h @@ -206,6 +206,7 @@ public: { wxCHECK_MSG( m_iocp != INVALID_HANDLE_VALUE, false, "IOCP not init" ); + // The special values of 0 will make GetStatus() return Status_Exit. int ret = PostQueuedCompletionStatus(m_iocp, 0, 0, NULL); if (!ret) { @@ -215,25 +216,41 @@ public: return ret != 0; } + // Possible return values of GetStatus() + enum Status + { + // Status successfully retrieved into the provided arguments. + Status_OK, + + // Special status indicating that we should exit retrieved. + Status_Exit, + + // Some error occurred. + Status_Error + }; + // Wait for completion status to arrive. // This function can block forever in it's wait for completion status. // Use PostEmptyStatus() to wake it up (and end the worker thread) - bool GetStatus(unsigned long* count, wxFSWatchEntryMSW** watch, - OVERLAPPED** overlapped) + Status + GetStatus(unsigned long* count, wxFSWatchEntryMSW** watch, + OVERLAPPED** overlapped) { - wxCHECK_MSG( m_iocp != INVALID_HANDLE_VALUE, false, "IOCP not init" ); - wxCHECK_MSG( count != NULL, false, "Null out parameter 'count'"); - wxCHECK_MSG( watch != NULL, false, "Null out parameter 'watch'"); - wxCHECK_MSG( overlapped != NULL, false, - "Null out parameter 'overlapped'"); + wxCHECK_MSG( m_iocp != INVALID_HANDLE_VALUE, Status_Error, + "Invalid IOCP object" ); + wxCHECK_MSG( count && watch && overlapped, Status_Error, + "Output parameters can't be NULL" ); int ret = GetQueuedCompletionStatus(m_iocp, count, (ULONG_PTR *)watch, overlapped, INFINITE); - if (!ret) + if ( ret != 0 ) { - wxLogSysError(_("Unable to dequeue completion packet")); + return *count || *watch || *overlapped ? Status_OK : Status_Exit; } - return ret != 0; + + wxLogSysError(_("Unable to dequeue completion packet")); + + return Status_Error; } protected: diff --git a/src/msw/fswatcher.cpp b/src/msw/fswatcher.cpp index d179f67155..98b1c1609f 100644 --- a/src/msw/fswatcher.cpp +++ b/src/msw/fswatcher.cpp @@ -224,12 +224,17 @@ bool wxIOCPThread::ReadEvents() unsigned long count = 0; wxFSWatchEntryMSW* watch = NULL; OVERLAPPED* overlapped = NULL; - if (!m_iocp->GetStatus(&count, &watch, &overlapped)) - return true; // error was logged already, we don't want to exit + switch ( m_iocp->GetStatus(&count, &watch, &overlapped) ) + { + case wxIOCPService::Status_OK: + break; // nothing special to do, continue normally - // this is our exit condition, so we return false - if (!count && !watch && !overlapped) - return false; + case wxIOCPService::Status_Error: + return true; // error was logged already, we don't want to exit + + case wxIOCPService::Status_Exit: + return false; // stop reading events + } // if the thread got woken up but we got an empty packet it means that // there was an overflow, too many events and not all could fit in