VirtualBox

Changeset 8119 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Apr 17, 2008 6:26:08 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
29822
Message:

Main: AutoLock: Switched to RTSemRW on POSIX platforms but disabled until missing RTSemRW bits are done.

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/AutoLock.cpp

    r8083 r8119  
    2525RWLockHandle::RWLockHandle()
    2626{
    27     RTCritSectInit (&mCritSect);
    28     RTSemEventCreate (&mGoWriteSem);
    29     RTSemEventMultiCreate (&mGoReadSem);
     27#ifdef VBOX_MAIN_USE_SEMRW
     28
     29    int vrc = RTSemRWCreate (&mSemRW);
     30    AssertRC (vrc);
     31
     32#else /* VBOX_MAIN_USE_SEMRW */
     33
     34    int vrc = RTCritSectInit (&mCritSect);
     35    AssertRC (vrc);
     36    vrc = RTSemEventCreate (&mGoWriteSem);
     37    AssertRC (vrc);
     38    vrc = RTSemEventMultiCreate (&mGoReadSem);
     39    AssertRC (vrc);
    3040
    3141    mWriteLockThread = NIL_RTTHREAD;
     
    3444    mWriteLockLevel = 0;
    3545    mWriteLockPending = 0;
     46
     47#endif /* VBOX_MAIN_USE_SEMRW */
    3648}
    3749
    3850RWLockHandle::~RWLockHandle()
    3951{
     52#ifdef VBOX_MAIN_USE_SEMRW
     53
     54    RTSemRWDestroy (mSemRW);
     55
     56#else /* VBOX_MAIN_USE_SEMRW */
     57
    4058    RTSemEventMultiDestroy (mGoReadSem);
    4159    RTSemEventDestroy (mGoWriteSem);
    4260    RTCritSectDelete (&mCritSect);
     61
     62#endif /* VBOX_MAIN_USE_SEMRW */
    4363}
    4464
    4565bool RWLockHandle::isWriteLockOnCurrentThread() const
    4666{
     67#ifdef VBOX_MAIN_USE_SEMRW
     68
     69    return RTSemRWIsWriteOwner (mSemRW);
     70
     71#else /* VBOX_MAIN_USE_SEMRW */
     72
    4773    RTCritSectEnter (&mCritSect);
    4874    bool locked = mWriteLockThread == RTThreadSelf();
    4975    RTCritSectLeave (&mCritSect);
    5076    return locked;
     77
     78#endif /* VBOX_MAIN_USE_SEMRW */
    5179}
    5280
    5381void RWLockHandle::lockWrite()
    5482{
     83#ifdef VBOX_MAIN_USE_SEMRW
     84
     85    int vrc = RTSemRWRequestWrite (mSemRW, RT_INDEFINITE_WAIT);
     86    AssertRC (vrc);
     87
     88#else /* VBOX_MAIN_USE_SEMRW */
     89
    5590    RTCritSectEnter (&mCritSect);
    5691
     
    79114
    80115    RTCritSectLeave (&mCritSect);
     116
     117#endif /* VBOX_MAIN_USE_SEMRW */
    81118}
    82119
    83120void RWLockHandle::unlockWrite()
    84121{
     122#ifdef VBOX_MAIN_USE_SEMRW
     123
     124    int vrc = RTSemRWReleaseWrite (mSemRW);
     125    AssertRC (vrc);
     126
     127#else /* VBOX_MAIN_USE_SEMRW */
     128
    85129    RTCritSectEnter (&mCritSect);
    86130
     
    103147
    104148    RTCritSectLeave (&mCritSect);
     149
     150#endif /* VBOX_MAIN_USE_SEMRW */
    105151}
    106152
    107153void RWLockHandle::lockRead()
    108154{
     155#ifdef VBOX_MAIN_USE_SEMRW
     156
     157    int vrc = RTSemRWRequestRead (mSemRW, RT_INDEFINITE_WAIT);
     158    AssertRC (vrc);
     159
     160#else /* VBOX_MAIN_USE_SEMRW */
     161
    109162    RTCritSectEnter (&mCritSect);
    110163
     
    146199    if (isWriteLock)
    147200        RTSemEventMultiWait (mGoReadSem, RT_INDEFINITE_WAIT);
     201
     202#endif /* VBOX_MAIN_USE_SEMRW */
    148203}
    149204
    150205void RWLockHandle::unlockRead()
    151206{
     207#ifdef VBOX_MAIN_USE_SEMRW
     208
     209    int vrc = RTSemRWReleaseRead (mSemRW);
     210    AssertRC (vrc);
     211
     212#else /* VBOX_MAIN_USE_SEMRW */
     213
    152214    RTCritSectEnter (&mCritSect);
    153215
     
    177239
    178240    RTCritSectLeave (&mCritSect);
     241
     242#endif /* VBOX_MAIN_USE_SEMRW */
    179243}
    180244
    181245uint32_t RWLockHandle::writeLockLevel() const
    182246{
     247#ifdef VBOX_MAIN_USE_SEMRW
     248
     249    return RTSemRWGetWriteRecursion (mSemRW);
     250
     251#else /* VBOX_MAIN_USE_SEMRW */
     252
    183253    Assert (mWriteLockLevel != 0);
    184254
    185255    return mWriteLockLevel;
     256
     257#endif /* VBOX_MAIN_USE_SEMRW */
    186258}
    187259
  • trunk/src/VBox/Main/Makefile.kmk

    r8059 r8119  
    4949 VBOX_MAIN_DEFS += VBOX_WITH_UNIXY_TAP_NETWORKING
    5050endif
     51## @todo later when RTSemRWIsWriteOwner and RTSemRWGetWriteRecursion are done
     52#ifeq ($(filter-out linux darwin freebsd solaris,$(BUILD_TARGET)),)
     53# VBOX_MAIN_DEFS += VBOX_MAIN_USE_SEMRW
     54#endif
     55
    5156## @todo eliminate or expand VBOX_MAIN_DEFS.
    5257
  • trunk/src/VBox/Main/include/AutoLock.h

    r8083 r8119  
    2525#include <iprt/semaphore.h>
    2626
     27#include <iprt/err.h>
    2728#include <iprt/assert.h>
    2829
    2930#if defined(DEBUG)
    3031# include <iprt/asm.h> // for ASMReturnAddress
     32#endif
     33
     34#ifdef VBOX_MAIN_USE_SEMRW
     35# include <iprt/semaphore.h>
    3136#endif
    3237
     
    172177    uint32_t writeLockLevel() const;
    173178
     179#ifdef VBOX_MAIN_USE_SEMRW
     180
     181    RTSEMRW mSemRW;
     182
     183#else /* VBOX_MAIN_USE_SEMRW */
     184
    174185    mutable RTCRITSECT mCritSect;
    175186    RTSEMEVENT mGoWriteSem;
     
    181192    uint32_t mWriteLockLevel;
    182193    uint32_t mWriteLockPending;
     194
     195#endif /* VBOX_MAIN_USE_SEMRW */
    183196};
    184197
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette