Ignore:
Timestamp:
Dec 27, 2008, 6:54:12 PM (16 years ago)
Author:
[email protected]
Message:

<rdar://problem/6467376> Race condition in WTF::currentThread can lead to a thread using two different identifiers during its lifetime

If a newly-created thread calls WTF::currentThread() before WTF::createThread calls establishIdentifierForPthreadHandle
then more than one identifier will be used for the same thread. We can avoid this by adding some extra synchronization
during thread creation that delays the execution of the thread function until the thread identifier has been set up, and
an assertion to catch this problem should it reappear in the future.

Reviewed by Alexey Proskuryakov.

  • wtf/Threading.cpp: Added.

(WTF::NewThreadContext::NewThreadContext):
(WTF::threadEntryPoint):
(WTF::createThread): Add cross-platform createThread function that delays the execution of the thread function until
after the thread identifier has been set up.

  • wtf/Threading.h:
  • wtf/ThreadingGtk.cpp:

(WTF::establishIdentifierForThread):
(WTF::createThreadInternal):

  • wtf/ThreadingNone.cpp:

(WTF::createThreadInternal):

  • wtf/ThreadingPthreads.cpp:

(WTF::establishIdentifierForPthreadHandle):
(WTF::createThreadInternal):

  • wtf/ThreadingQt.cpp:

(WTF::identifierByQthreadHandle):
(WTF::establishIdentifierForThread):
(WTF::createThreadInternal):

  • wtf/ThreadingWin.cpp:

(WTF::storeThreadHandleByIdentifier):
(WTF::createThreadInternal):

Add Threading.cpp to the build.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/ThreadingWin.cpp

    r39337 r39487  
    151151{
    152152    MutexLocker locker(threadMapMutex());
     153    ASSERT(!threadMap().contains(threadID));
    153154    threadMap().add(threadID, threadHandle);
    154155}
     
    189190}
    190191
    191 ThreadIdentifier createThread(ThreadFunction entryPoint, void* data, const char* threadName)
     192ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char* threadName)
    192193{
    193194    unsigned threadIdentifier = 0;
     
    207208
    208209    return threadID;
    209 }
    210 
    211 // This function is deprecated but needs to be kept around for backward
    212 // compatibility. Use the 3-argument version of createThread above.
    213 ThreadIdentifier createThread(ThreadFunction entryPoint, void* data)
    214 {
    215     return createThread(entryPoint, data, 0);
    216210}
    217211
Note: See TracChangeset for help on using the changeset viewer.