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/ThreadingPthreads.cpp

    r43366 r43392  
    4949namespace WTF {
    5050
    51 bool ThreadIdentifier::operator==(const ThreadIdentifier& another) const
    52 {
    53     return pthread_equal(m_platformId, another.m_platformId);
    54 }
    55 
    56 bool ThreadIdentifier::operator!=(const ThreadIdentifier& another) const
    57 {
    58     return !pthread_equal(m_platformId, another.m_platformId);
    59 }
     51typedef HashMap<ThreadIdentifier, pthread_t> ThreadMap;
    6052
    6153static Mutex* atomicallyInitializedStaticMutex;
     
    6557#endif
    6658
     59static Mutex& threadMapMutex()
     60{
     61    DEFINE_STATIC_LOCAL(Mutex, mutex, ());
     62    return mutex;
     63}
     64
    6765void initializeThreading()
    6866{
    6967    if (!atomicallyInitializedStaticMutex) {
    7068        atomicallyInitializedStaticMutex = new Mutex;
     69        threadMapMutex();
    7170        initializeRandomNumberGenerator();
    7271#if !PLATFORM(DARWIN) || PLATFORM(CHROMIUM)
     
    8685{
    8786    atomicallyInitializedStaticMutex->unlock();
     87}
     88
     89static ThreadMap& threadMap()
     90{
     91    DEFINE_STATIC_LOCAL(ThreadMap, map, ());
     92    return map;
     93}
     94
     95static ThreadIdentifier identifierByPthreadHandle(const pthread_t& pthreadHandle)
     96{
     97    MutexLocker locker(threadMapMutex());
     98
     99    ThreadMap::iterator i = threadMap().begin();
     100    for (; i != threadMap().end(); ++i) {
     101        if (pthread_equal(i->second, pthreadHandle))
     102            return i->first;
     103    }
     104
     105    return 0;
     106}
     107
     108static ThreadIdentifier establishIdentifierForPthreadHandle(pthread_t& pthreadHandle)
     109{
     110    ASSERT(!identifierByPthreadHandle(pthreadHandle));
     111
     112    MutexLocker locker(threadMapMutex());
     113
     114    static ThreadIdentifier identifierCount = 1;
     115
     116    threadMap().add(identifierCount, pthreadHandle);
     117   
     118    return identifierCount++;
     119}
     120
     121static pthread_t pthreadHandleForIdentifier(ThreadIdentifier id)
     122{
     123    MutexLocker locker(threadMapMutex());
     124   
     125    return threadMap().get(id);
     126}
     127
     128static void clearPthreadHandleForIdentifier(ThreadIdentifier id)
     129{
     130    MutexLocker locker(threadMapMutex());
     131
     132    ASSERT(threadMap().contains(id));
     133   
     134    threadMap().remove(id);
    88135}
    89136
     
    118165    if (pthread_create(&threadHandle, 0, runThreadWithRegistration, static_cast<void*>(threadData))) {
    119166        LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data);
    120         return ThreadIdentifier();
    121     }
    122     return ThreadIdentifier(threadHandle);
     167        return 0;
     168    }
     169    return establishIdentifierForPthreadHandle(threadHandle);
    123170}
    124171#else
     
    128175    if (pthread_create(&threadHandle, 0, entryPoint, data)) {
    129176        LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data);
    130         return ThreadIdentifier();
    131     }
    132 
    133     return ThreadIdentifier(threadHandle);
     177        return 0;
     178    }
     179
     180    return establishIdentifierForPthreadHandle(threadHandle);
    134181}
    135182#endif
     
    146193int waitForThreadCompletion(ThreadIdentifier threadID, void** result)
    147194{
    148     ASSERT(threadID.isValid());
    149    
    150     pthread_t pthreadHandle = threadID.platformId();
     195    ASSERT(threadID);
     196   
     197    pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);
    151198 
    152199    int joinResult = pthread_join(pthreadHandle, result);
    153200    if (joinResult == EDEADLK)
    154         LOG_ERROR("ThreadIdentifier %p was found to be deadlocked trying to quit", pthreadHandle);
     201        LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID);
    155202       
     203    clearPthreadHandleForIdentifier(threadID);
    156204    return joinResult;
    157205}
     
    159207void detachThread(ThreadIdentifier threadID)
    160208{
    161     ASSERT(threadID.isValid());
    162    
    163     pthread_t pthreadHandle = threadID.platformId();
     209    ASSERT(threadID);
     210   
     211    pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);
    164212   
    165213    pthread_detach(pthreadHandle);
     214   
     215    clearPthreadHandleForIdentifier(threadID);
    166216}
    167217
    168218ThreadIdentifier currentThread()
    169219{
    170     return ThreadIdentifier(pthread_self());
     220    pthread_t currentThread = pthread_self();
     221    if (ThreadIdentifier id = identifierByPthreadHandle(currentThread))
     222        return id;
     223    return establishIdentifierForPthreadHandle(currentThread);
    171224}
    172225
Note: See TracChangeset for help on using the changeset viewer.