Ignore:
Timestamp:
Apr 17, 2008, 9:04:48 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Maciej.

Thread static data destructors are not guaranteed to be called in any particular order;
turn ThreadSpecific into a phoenix-style singleton to avoid accessing freed memory when
deleted objects are interdependent (e.g. CommonIdentifiers and internal identifier tables).

No change on SunSpider.

  • wtf/ThreadSpecific.h: (WTF::ThreadSpecific::Data::Data): (WTF::::get): (WTF::::set): (WTF::::destroy):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/ThreadSpecific.h

    r31944 r32000  
    5454
    5555#if USE(PTHREADS) || PLATFORM(WIN)
     56    struct Data : Noncopyable {
     57        Data(T* value, ThreadSpecific<T>* owner) : value(value), owner(owner) {}
     58
     59        T* value;
     60        ThreadSpecific<T>* owner;
     61    };
     62
    5663    pthread_key_t m_key;
    5764#endif
     
    7481inline T* ThreadSpecific<T>::get()
    7582{
    76     return static_cast<T*>(pthread_getspecific(m_key));
     83    Data* data = static_cast<Data*>(pthread_getspecific(m_key));
     84    return data ? data->value : 0;
    7785}
    7886
     
    8189{
    8290    ASSERT(!get());
    83     pthread_setspecific(m_key, ptr);
     91    pthread_setspecific(m_key, new Data(ptr, this));
    8492}
    8593
     
    8795inline void ThreadSpecific<T>::destroy(void* ptr)
    8896{
    89     delete static_cast<T*>(ptr);
     97    Data* data = static_cast<Data*>(ptr);
     98    pthread_setspecific(data->owner->m_key, 0);
     99    delete data->value;
     100    delete data;
    90101}
    91102
Note: See TracChangeset for help on using the changeset viewer.