VirtualBox

Changeset 25717 in vbox for trunk/src/VBox/Runtime/r3/posix


Ignore:
Timestamp:
Jan 11, 2010 1:24:09 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
56457
Message:

iprt: Added RTSemEventCreateEx and did some cleanups of the RTSemEventDestroy behavior wrt NIL handles.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/posix/semevent-posix.cpp

    r25704 r25717  
    9696
    9797
    98 RTDECL(int)  RTSemEventCreate(PRTSEMEVENT pEventSem)
    99 {
     98RTDECL(int)  RTSemEventCreate(PRTSEMEVENT phEventSem)
     99{
     100    return RTSemEventCreateEx(phEventSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL);
     101}
     102
     103
     104RTDECL(int)  RTSemEventCreateEx(PRTSEMEVENT phEventSem, uint32_t fFlags, RTLOCKVALCLASS hClass, const char *pszNameFmt, ...)
     105{
     106    AssertReturn(!(fFlags & ~RTSEMEVENT_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER);
     107
     108    /*
     109     * Allocate semaphore handle.
     110     */
    100111    int rc;
    101 
    102     /*
    103      * Allocate semaphore handle.
    104      */
    105112    struct RTSEMEVENTINTERNAL *pThis = (struct RTSEMEVENTINTERNAL *)RTMemAlloc(sizeof(struct RTSEMEVENTINTERNAL));
    106113    if (pThis)
     
    132139                        ASMAtomicXchgU32(&pThis->cWaiters, 0);
    133140#ifdef RTSEMEVENT_STRICT
    134                         RTLockValidatorRecSharedInit(&pThis->Signallers,
    135                                                      NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_ANY,
    136                                                      pThis, true /*fSignaller*/, true /*fEnabled*/, "RTSemEvent");
     141                        va_list va;
     142                        va_start(va, pszNameFmt);
     143                        RTLockValidatorRecSharedInitV(&pThis->Signallers, hClass, RTLOCKVAL_SUB_CLASS_ANY, pThis,
     144                                                      true /*fSignaller*/, !(fFlags & RTSEMEVENT_FLAGS_NO_LOCK_VAL),
     145                                                      pszNameFmt, va);
     146                        va_end(va);
    137147                        pThis->fEverHadSignallers = false;
    138148#endif
    139149
    140                         *pEventSem = pThis;
     150                        *phEventSem = pThis;
    141151                        return VINF_SUCCESS;
    142152                    }
     153
    143154                    pthread_mutexattr_destroy(&MutexAttr);
    144155                }
     
    158169
    159170
    160 RTDECL(int)  RTSemEventDestroy(RTSEMEVENT EventSem)
     171RTDECL(int)  RTSemEventDestroy(RTSEMEVENT hEventSem)
    161172{
    162173    /*
    163174     * Validate handle.
    164175     */
    165     struct RTSEMEVENTINTERNAL *pThis = EventSem;
    166     if (pThis == NIL_RTSEMEVENT)        /* don't bitch */
    167         return VERR_INVALID_HANDLE;
     176    struct RTSEMEVENTINTERNAL *pThis = hEventSem;
     177    if (pThis == NIL_RTSEMEVENT)
     178        return VINF_SUCCESS;
    168179    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    169180    uint32_t    u32 = pThis->u32State;
     
    185196    if (rc)
    186197    {
    187         AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", EventSem, rc));
     198        AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", pThis, rc));
    188199        return RTErrConvertFromErrno(rc);
    189200    }
     
    202213    if (rc)
    203214    {
    204         AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", EventSem, rc));
     215        AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", pThis, rc));
    205216        return RTErrConvertFromErrno(rc);
    206217    }
     
    217228
    218229
    219 RTDECL(int)  RTSemEventSignal(RTSEMEVENT EventSem)
     230RTDECL(int)  RTSemEventSignal(RTSEMEVENT hEventSem)
    220231{
    221232    /*
    222233     * Validate input.
    223234     */
    224     struct RTSEMEVENTINTERNAL *pThis = EventSem;
     235    struct RTSEMEVENTINTERNAL *pThis = hEventSem;
    225236    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    226237    uint32_t    u32 = pThis->u32State;
     
    242253    if (rc)
    243254    {
    244         AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", EventSem, rc));
     255        AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", hEventSem, rc));
    245256        return RTErrConvertFromErrno(rc);
    246257    }
     
    253264        ASMAtomicXchgU32(&pThis->u32State, EVENT_STATE_SIGNALED);
    254265        rc = pthread_cond_signal(&pThis->Cond);
    255         AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", EventSem, rc));
     266        AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", hEventSem, rc));
    256267    }
    257268    else if (pThis->u32State == EVENT_STATE_SIGNALED)
    258269    {
    259270        rc = pthread_cond_signal(&pThis->Cond); /* give'm another kick... */
    260         AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", EventSem, rc));
     271        AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", hEventSem, rc));
    261272    }
    262273    else
     
    267278     */
    268279    int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    269     AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc));
     280    AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc));
    270281    if (rc)
    271282        return RTErrConvertFromErrno(rc);
     
    277288
    278289
    279 DECL_FORCE_INLINE(int) rtSemEventWait(RTSEMEVENT EventSem, unsigned cMillies, bool fAutoResume)
     290DECL_FORCE_INLINE(int) rtSemEventWait(RTSEMEVENT hEventSem, unsigned cMillies, bool fAutoResume)
    280291{
    281292    PCRTLOCKVALSRCPOS  pSrcPos = NULL;
     
    284295     * Validate input.
    285296     */
    286     struct RTSEMEVENTINTERNAL *pThis = EventSem;
     297    struct RTSEMEVENTINTERNAL *pThis = hEventSem;
    287298    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    288299    uint32_t    u32 = pThis->u32State;
     
    304315        {
    305316            ASMAtomicDecU32(&pThis->cWaiters);
    306             AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", EventSem, rc));
     317            AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", hEventSem, rc));
    307318            return RTErrConvertFromErrno(rc);
    308319        }
     
    316327                ASMAtomicDecU32(&pThis->cWaiters);
    317328                rc = pthread_mutex_unlock(&pThis->Mutex);
    318                 AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc)); NOREF(rc);
     329                AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc)); NOREF(rc);
    319330                return VINF_SUCCESS;
    320331            }
     
    322333            {
    323334                rc = pthread_mutex_unlock(&pThis->Mutex);
    324                 AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc)); NOREF(rc);
     335                AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc)); NOREF(rc);
    325336                return VERR_SEM_DESTROYED;
    326337            }
     
    348359            if (rc)
    349360            {
    350                 AssertMsgFailed(("Failed to wait on event sem %p, rc=%d.\n", EventSem, rc));
     361                AssertMsgFailed(("Failed to wait on event sem %p, rc=%d.\n", hEventSem, rc));
    351362                ASMAtomicDecU32(&pThis->cWaiters);
    352363                int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    353                 AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc2)); NOREF(rc2);
     364                AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc2)); NOREF(rc2);
    354365                return RTErrConvertFromErrno(rc);
    355366            }
     
    390401        {
    391402            ASMAtomicDecU32(&pThis->cWaiters);
    392             AssertMsg(rc == ETIMEDOUT, ("Failed to lock event sem %p, rc=%d.\n", EventSem, rc));
     403            AssertMsg(rc == ETIMEDOUT, ("Failed to lock event sem %p, rc=%d.\n", hEventSem, rc));
    393404            return RTErrConvertFromErrno(rc);
    394405        }
     
    402413                ASMAtomicDecU32(&pThis->cWaiters);
    403414                rc = pthread_mutex_unlock(&pThis->Mutex);
    404                 AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc)); NOREF(rc);
     415                AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc)); NOREF(rc);
    405416                return VINF_SUCCESS;
    406417            }
     
    408419            {
    409420                rc = pthread_mutex_unlock(&pThis->Mutex);
    410                 AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", EventSem, rc)); NOREF(rc);
     421                AssertMsg(!rc, ("Failed to unlock event sem %p, rc=%d.\n", hEventSem, rc)); NOREF(rc);
    411422                return VERR_SEM_DESTROYED;
    412423            }
     
    442453            if (rc && (rc != EINTR || !fAutoResume)) /* according to SuS this function shall not return EINTR, but linux man page says differently. */
    443454            {
    444                 AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event sem %p, rc=%d.\n", EventSem, rc));
     455                AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event sem %p, rc=%d.\n", hEventSem, rc));
    445456                ASMAtomicDecU32(&pThis->cWaiters);
    446457                int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    447                 AssertMsg(!rc2, ("Failed to unlock event sem %p, rc2=%d.\n", EventSem, rc2)); NOREF(rc2);
     458                AssertMsg(!rc2, ("Failed to unlock event sem %p, rc2=%d.\n", hEventSem, rc2)); NOREF(rc2);
    448459                return RTErrConvertFromErrno(rc);
    449460            }
     
    453464
    454465
    455 RTDECL(int)  RTSemEventWait(RTSEMEVENT EventSem, unsigned cMillies)
    456 {
    457     int rc = rtSemEventWait(EventSem, cMillies, true);
     466RTDECL(int)  RTSemEventWait(RTSEMEVENT hEventSem, unsigned cMillies)
     467{
     468    int rc = rtSemEventWait(hEventSem, cMillies, true);
    458469    Assert(rc != VERR_INTERRUPTED);
    459470    return rc;
     
    461472
    462473
    463 RTDECL(int)  RTSemEventWaitNoResume(RTSEMEVENT EventSem, unsigned cMillies)
    464 {
    465     return rtSemEventWait(EventSem, cMillies, false);
     474RTDECL(int)  RTSemEventWaitNoResume(RTSEMEVENT hEventSem, unsigned cMillies)
     475{
     476    return rtSemEventWait(hEventSem, cMillies, false);
    466477}
    467478
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