Ignore:
Timestamp:
Jun 13, 2009, 10:52:44 AM (16 years ago)
Author:
[email protected]
Message:

2009-06-12 Dave Hyatt <[email protected]>

Reviewed by Anders Carlsson.

https://bugs.webkit.org/show_bug.cgi?id=26373

Add a new class to Threading in wtf called ReadWriteLock that handles single writer/multiple reader locking.
Provide a pthreads-only implementation of the lock for now, as this class is only going to be used
on Snow Leopard at first.

  • wtf/Threading.h: (WTF::ReadWriteLock::impl):
  • wtf/ThreadingPthreads.cpp: (WTF::ReadWriteLock::ReadWriteLock): (WTF::ReadWriteLock::~ReadWriteLock): (WTF::ReadWriteLock::readLock): (WTF::ReadWriteLock::tryReadLock): (WTF::ReadWriteLock::writeLock): (WTF::ReadWriteLock::tryWriteLock): (WTF::ReadWriteLock::unlock):
File:
1 edited

Legend:

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

    r44504 r44651  
    268268}
    269269
     270
     271ReadWriteLock::ReadWriteLock()
     272{
     273    pthread_rwlock_init(&m_readWriteLock, NULL);
     274}
     275
     276ReadWriteLock::~ReadWriteLock()
     277{
     278    pthread_rwlock_destroy(&m_readWriteLock);
     279}
     280
     281void ReadWriteLock::readLock()
     282{
     283    int result = pthread_rwlock_rdlock(&m_readWriteLock);
     284    ASSERT_UNUSED(result, !result);
     285}
     286
     287bool ReadWriteLock::tryReadLock()
     288{
     289    int result = pthread_rwlock_tryrdlock(&m_readWriteLock);
     290
     291    if (result == 0)
     292        return true;
     293    if (result == EBUSY || result == EAGAIN)
     294        return false;
     295
     296    ASSERT_NOT_REACHED();
     297    return false;
     298}
     299
     300void ReadWriteLock::writeLock()
     301{
     302    int result = pthread_rwlock_wrlock(&m_readWriteLock);
     303    ASSERT_UNUSED(result, !result);
     304}
     305
     306bool ReadWriteLock::tryWriteLock()
     307{
     308    int result = pthread_rwlock_trywrlock(&m_readWriteLock);
     309
     310    if (result == 0)
     311        return true;
     312    if (result == EBUSY || result == EAGAIN)
     313        return false;
     314
     315    ASSERT_NOT_REACHED();
     316    return false;
     317}
     318
     319void ReadWriteLock::unlock()
     320{
     321    int result = pthread_rwlock_unlock(&m_readWriteLock);
     322    ASSERT_UNUSED(result, !result);
     323}
     324
    270325ThreadCondition::ThreadCondition()
    271326{
Note: See TracChangeset for help on using the changeset viewer.