Ignore:
Timestamp:
May 7, 2009, 11:47:19 PM (16 years ago)
Author:
[email protected]
Message:

Fix <https://bugs.webkit.org/show_bug.cgi?id=25640>.
Bug 25640: Crash on quit in r43384 nightly build on Leopard w/ Safari 4 beta installed

Rubber-stamped by Oliver Hunt.

Roll out r43366 as it removed symbols that Safari 4 Beta uses.

File:
1 edited

Legend:

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

    r43366 r43392  
    9999namespace WTF {
    100100
    101 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const
    102 {
    103     return m_platformId == another.m_platformId;
    104 }
    105 
    106 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const
    107 {
    108     return m_platformId != another.m_platformId;
    109 }
    110 
    111101// MS_VC_EXCEPTION, THREADNAME_INFO, and setThreadNameInternal all come from <http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx>.
    112102static const DWORD MS_VC_EXCEPTION = 0x406D1388;
     
    150140static ThreadIdentifier mainThreadIdentifier;
    151141
     142static Mutex& threadMapMutex()
     143{
     144    static Mutex mutex;
     145    return mutex;
     146}
     147
    152148void initializeThreading()
    153149{
    154150    if (!atomicallyInitializedStaticMutex) {
    155151        atomicallyInitializedStaticMutex = new Mutex;
     152        threadMapMutex();
    156153        initializeRandomNumberGenerator();
    157154        initializeMainThread();
     
    161158}
    162159
     160static HashMap<DWORD, HANDLE>& threadMap()
     161{
     162    static HashMap<DWORD, HANDLE> map;
     163    return map;
     164}
     165
     166static void storeThreadHandleByIdentifier(DWORD threadID, HANDLE threadHandle)
     167{
     168    MutexLocker locker(threadMapMutex());
     169    ASSERT(!threadMap().contains(threadID));
     170    threadMap().add(threadID, threadHandle);
     171}
     172
     173static HANDLE threadHandleForIdentifier(ThreadIdentifier id)
     174{
     175    MutexLocker locker(threadMapMutex());
     176    return threadMap().get(id);
     177}
     178
     179static void clearThreadHandleForIdentifier(ThreadIdentifier id)
     180{
     181    MutexLocker locker(threadMapMutex());
     182    ASSERT(threadMap().contains(id));
     183    threadMap().remove(id);
     184}
     185
    163186struct ThreadFunctionInvocation {
    164187    ThreadFunctionInvocation(ThreadFunction function, void* data) : function(function), data(data) {}
     
    186209{
    187210    unsigned threadIdentifier = 0;
     211    ThreadIdentifier threadID = 0;
    188212    ThreadFunctionInvocation* invocation = new ThreadFunctionInvocation(entryPoint, data);
    189213    HANDLE threadHandle = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, wtfThreadEntryPoint, invocation, 0, &threadIdentifier));
    190214    if (!threadHandle) {
    191215        LOG_ERROR("Failed to create thread at entry point %p with data %p: %ld", entryPoint, data, errno);
    192         return ThreadIdentifier();
    193     }
    194     // Closes handle only, since we don't need it. The new thread runs until it exits.
    195     CloseHandle(threadHandle);
    196 
    197     return ThreadIdentifier(threadIdentifier);
     216        return 0;
     217    }
     218
     219    threadID = static_cast<ThreadIdentifier>(threadIdentifier);
     220    storeThreadHandleByIdentifier(threadIdentifier, threadHandle);
     221
     222    return threadID;
    198223}
    199224
    200225int waitForThreadCompletion(ThreadIdentifier threadID, void** result)
    201226{
    202     ASSERT(threadID.isValid());
     227    ASSERT(threadID);
    203228   
    204     unsigned threadIdentifier = threadID.platformId();
    205     HANDLE threadHandle = OpenThread(SYNCHRONIZE, FALSE, threadIdentifier);
    206     // If thread already exited, return immediately.
     229    HANDLE threadHandle = threadHandleForIdentifier(threadID);
    207230    if (!threadHandle)
    208         return WAIT_OBJECT_0;
     231        LOG_ERROR("ThreadIdentifier %u did not correspond to an active thread when trying to quit", threadID);
    209232 
    210233    DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE);
    211234    if (joinResult == WAIT_FAILED)
    212         LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", threadHandle);
     235        LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID);
    213236
    214237    CloseHandle(threadHandle);
     238    clearThreadHandleForIdentifier(threadID);
    215239
    216240    return joinResult;
    217241}
    218242
    219 void detachThread(ThreadIdentifier)
    220 {
     243void detachThread(ThreadIdentifier threadID)
     244{
     245    ASSERT(threadID);
     246   
     247    HANDLE threadHandle = threadHandleForIdentifier(threadID);
     248    if (threadHandle)
     249        CloseHandle(threadHandle);
     250    clearThreadHandleForIdentifier(threadID);
    221251}
    222252
    223253ThreadIdentifier currentThread()
    224254{
    225     return ThreadIdentifier(GetCurrentThreadId());
     255    return static_cast<ThreadIdentifier>(GetCurrentThreadId());
    226256}
    227257
     
    441471}
    442472
    443 // Deprecated functions. The current build of Safari 4 beta is linked with them so we need to provide
    444 // the implementation taking PlatformThreadIdentifier instead of ThreadIdentifier. These are not declared
    445 // in .h file so the next time Safari is built it will 'automatically' switch to new functions.
    446 // Then deprecated ones can be removed from this file and from JavaScriptCore.def and WebKit.def files.
    447 // In WebKit.def file, these functions are 'renamed' so their name does not have 'Deprecated' part - this
    448 // is to avoid having 2 functions with only different type of return value.
    449 void detachThreadDeprecated(PlatformThreadIdentifier)
    450 {
    451 }
    452 
    453 int waitForThreadCompletionDeprecated(PlatformThreadIdentifier threadID, void** result)
    454 {
    455     ASSERT(threadID);
    456 
    457     unsigned threadIdentifier = static_cast<unsigned>(threadID);
    458     HANDLE threadHandle = OpenThread(SYNCHRONIZE, FALSE, threadIdentifier);
    459     // If thread already exited, return immediately.
    460     if (!threadHandle)
    461         return WAIT_OBJECT_0;
    462 
    463     DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE);
    464     if (joinResult == WAIT_FAILED)
    465         LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", threadHandle);
    466 
    467     CloseHandle(threadHandle);
    468 
    469     return joinResult;
    470 }
    471 
    472 PlatformThreadIdentifier currentThreadDeprecated()
    473 {
    474     return static_cast<PlatformThreadIdentifier>(GetCurrentThreadId());
    475 }
    476 
    477 PlatformThreadIdentifier createThreadDeprecated(ThreadFunction entryPoint, void* data, const char* name)
    478 {
    479     ThreadIdentifier threadID = createThread(entryPoint, data, name);
    480     return static_cast<PlatformThreadIdentifier>(threadID.platformId());
    481 }
    482 
    483473} // namespace WTF
Note: See TracChangeset for help on using the changeset viewer.