VirtualBox

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


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

iprt: Added RTSemEventMultiCreateEx and did some cleanups of the RTSemEventMultiDestroy behavior wrt NIL handles.

File:
1 edited

Legend:

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

    r25704 r25720  
    8686
    8787
    88 RTDECL(int)  RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem)
    89 {
     88RTDECL(int)  RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem)
     89{
     90    return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL);
     91}
     92
     93
     94RTDECL(int)  RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass,
     95                                     const char *pszNameFmt, ...)
     96{
     97    AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER);
     98
     99    /*
     100     * Allocate semaphore handle.
     101     */
    90102    int rc;
    91 
    92     /*
    93      * Allocate semaphore handle.
    94      */
    95103    struct RTSEMEVENTMULTIINTERNAL *pThis = (struct RTSEMEVENTMULTIINTERNAL *)RTMemAlloc(sizeof(struct RTSEMEVENTMULTIINTERNAL));
    96104    if (pThis)
     
    122130                        ASMAtomicXchgU32(&pThis->cWaiters, 0);
    123131#ifdef RTSEMEVENTMULTI_STRICT
    124                         RTLockValidatorRecSharedInit(&pThis->Signallers,
    125                                                      NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_ANY,
    126                                                      pThis, true /*fSignaller*/, true /*fEnabled*/, "RTSemEvent");
     132                        va_list va;
     133                        va_start(va, pszNameFmt);
     134                        RTLockValidatorRecSharedInitV(&pThis->Signallers, hClass, RTLOCKVAL_SUB_CLASS_ANY, pThis,
     135                                                      true /*fSignaller*/, !(fFlags & RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL),
     136                                                      pszNameFmt, va);
     137                        va_end(va);
    127138                        pThis->fEverHadSignallers = false;
    128139#endif
    129140
    130                         *pEventMultiSem = pThis;
     141                        *phEventMultiSem = pThis;
    131142                        return VINF_SUCCESS;
    132143                    }
     
    150161
    151162
    152 RTDECL(int)  RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)
     163RTDECL(int)  RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem)
    153164{
    154165    /*
    155166     * Validate handle.
    156167     */
    157     struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;
     168    struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;
    158169    if (pThis == NIL_RTSEMEVENTMULTI)
    159170        return VINF_SUCCESS;
     
    177188    if (rc)
    178189    {
    179         AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", EventMultiSem, rc));
     190        AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", hEventMultiSem, rc));
    180191        return RTErrConvertFromErrno(rc);
    181192    }
     
    194205    if (rc)
    195206    {
    196         AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", EventMultiSem, rc));
     207        AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", hEventMultiSem, rc));
    197208        return RTErrConvertFromErrno(rc);
    198209    }
     
    209220
    210221
    211 RTDECL(int)  RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)
     222RTDECL(int)  RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem)
    212223{
    213224    /*
    214225     * Validate input.
    215226     */
    216     struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;
     227    struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;
    217228    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    218229    uint32_t u32 = pThis->u32State;
     
    234245    if (rc)
    235246    {
    236         AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", EventMultiSem, rc));
     247        AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", hEventMultiSem, rc));
    237248        return RTErrConvertFromErrno(rc);
    238249    }
     
    245256        ASMAtomicXchgU32(&pThis->u32State, EVENTMULTI_STATE_SIGNALED);
    246257        rc = pthread_cond_broadcast(&pThis->Cond);
    247         AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", EventMultiSem, rc));
     258        AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", hEventMultiSem, rc));
    248259    }
    249260    else if (pThis->u32State == EVENTMULTI_STATE_SIGNALED)
    250261    {
    251262        rc = pthread_cond_broadcast(&pThis->Cond); /* give'm another kick... */
    252         AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", EventMultiSem, rc));
     263        AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", hEventMultiSem, rc));
    253264    }
    254265    else
     
    259270     */
    260271    int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    261     AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", EventMultiSem, rc));
     272    AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", hEventMultiSem, rc));
    262273    if (rc)
    263274        return RTErrConvertFromErrno(rc);
     
    269280
    270281
    271 RTDECL(int)  RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)
     282RTDECL(int)  RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem)
    272283{
    273284    /*
    274285     * Validate input.
    275286     */
    276     struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;
     287    struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;
    277288    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    278289    uint32_t u32 = pThis->u32State;
     
    285296    if (rc)
    286297    {
    287         AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     298        AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    288299        return RTErrConvertFromErrno(rc);
    289300    }
     
    303314    if (rc)
    304315    {
    305         AssertMsgFailed(("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     316        AssertMsgFailed(("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    306317        return RTErrConvertFromErrno(rc);
    307318    }
     
    312323
    313324
    314 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fAutoResume)
     325static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fAutoResume)
    315326{
    316327    PCRTLOCKVALSRCPOS pSrcPos = NULL;
     
    319330     * Validate input.
    320331     */
    321     struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;
     332    struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;
    322333    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    323334    uint32_t u32 = pThis->u32State;
     
    333344        if (rc)
    334345        {
    335             AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     346            AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    336347            return RTErrConvertFromErrno(rc);
    337348        }
     
    345356                ASMAtomicDecU32(&pThis->cWaiters);
    346357                rc = pthread_mutex_unlock(&pThis->Mutex);
    347                 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);
     358                AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc);
    348359                return VINF_SUCCESS;
    349360            }
     
    351362            {
    352363                rc = pthread_mutex_unlock(&pThis->Mutex);
    353                 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);
     364                AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc);
    354365                return VERR_SEM_DESTROYED;
    355366            }
     
    377388            if (rc)
    378389            {
    379                 AssertMsgFailed(("Failed to wait on event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     390                AssertMsgFailed(("Failed to wait on event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    380391                ASMAtomicDecU32(&pThis->cWaiters);
    381392                int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    382                 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc2)); NOREF(rc2);
     393                AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc2)); NOREF(rc2);
    383394                return RTErrConvertFromErrno(rc);
    384395            }
     
    421432        if (rc)
    422433        {
    423             AssertMsg(rc == ETIMEDOUT, ("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     434            AssertMsg(rc == ETIMEDOUT, ("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    424435            return RTErrConvertFromErrno(rc);
    425436        }
     
    433444                ASMAtomicDecU32(&pThis->cWaiters);
    434445                rc = pthread_mutex_unlock(&pThis->Mutex);
    435                 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);
     446                AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc);
    436447                return VINF_SUCCESS;
    437448            }
     
    439450            {
    440451                rc = pthread_mutex_unlock(&pThis->Mutex);
    441                 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);
     452                AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc);
    442453                return VERR_SEM_DESTROYED;
    443454            }
     
    473484            if (rc && (rc != EINTR || !fAutoResume)) /* according to SuS this function shall not return EINTR, but linux man page says differently. */
    474485            {
    475                 AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event multi sem %p, rc=%d.\n", EventMultiSem, rc));
     486                AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event multi sem %p, rc=%d.\n", hEventMultiSem, rc));
    476487                ASMAtomicDecU32(&pThis->cWaiters);
    477488                int rc2 = pthread_mutex_unlock(&pThis->Mutex);
    478                 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc2)); NOREF(rc2);
     489                AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc2)); NOREF(rc2);
    479490                return RTErrConvertFromErrno(rc);
    480491            }
     
    484495
    485496
    486 RTDECL(int)  RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)
    487 {
    488     int rc = rtSemEventMultiWait(EventMultiSem, cMillies, true);
     497RTDECL(int)  RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies)
     498{
     499    int rc = rtSemEventMultiWait(hEventMultiSem, cMillies, true);
    489500    Assert(rc != VERR_INTERRUPTED);
    490501    return rc;
     
    492503
    493504
    494 RTDECL(int)  RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)
    495 {
    496     return rtSemEventMultiWait(EventMultiSem, cMillies, false);
     505RTDECL(int)  RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies)
     506{
     507    return rtSemEventMultiWait(hEventMultiSem, cMillies, false);
    497508}
    498509
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