diff options
author | jian liang <jianliang79@gmail.com> | 2012-02-19 22:09:44 +0800 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-22 00:07:31 +0100 |
commit | 4b30882a3f74914156f165a0a062b54ad3686c45 (patch) | |
tree | fc2781d8e58d58c7700d28d4bc75764311ddef34 | |
parent | 28401bf747d8ca81c9fe3179e8e59f779828a4a3 (diff) |
Fix potential race condition in data structure of adopted thread watcher
Fix potential race condition in data structure of adopted thread watcher
in Windows. Since QVector is not thread safe, it is not safe to read and
append data to qt_adopted_thread_handles or qt_adopted_qthread
simultaneously in qthread_win.cpp. This patch fix this race condition.
Change-Id: I2d0c7a4cdde5390d38d15c98343f0fc6ddd24aba
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
-rw-r--r-- | src/corelib/thread/qthread_win.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp index bdee6d6b7c..afcfb2c949 100644 --- a/src/corelib/thread/qthread_win.cpp +++ b/src/corelib/thread/qthread_win.cpp @@ -224,7 +224,9 @@ void qt_adopted_thread_watcher_function(void *) // printf("(qt) - qt_adopted_thread_watcher_function... called\n"); const int qthreadIndex = handleIndex - 1; + qt_adopted_thread_watcher_mutex.lock(); QThreadData *data = QThreadData::get2(qt_adopted_qthreads.at(qthreadIndex)); + qt_adopted_thread_watcher_mutex.unlock(); if (data->isAdopted) { QThread *thread = data->thread; Q_ASSERT(thread); @@ -234,10 +236,10 @@ void qt_adopted_thread_watcher_function(void *) } data->deref(); + QMutexLocker lock(&qt_adopted_thread_watcher_mutex); #if !defined(Q_OS_WINCE) || (defined(_WIN32_WCE) && (_WIN32_WCE>=0x600)) CloseHandle(qt_adopted_thread_handles.at(handleIndex)); #endif - QMutexLocker lock(&qt_adopted_thread_watcher_mutex); qt_adopted_thread_handles.remove(handleIndex); qt_adopted_qthreads.remove(qthreadIndex); } |