VirtualBox

Changeset 32946 in vbox for trunk/src/VBox/Runtime/r3/linux


Ignore:
Timestamp:
Oct 6, 2010 2:21:29 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66441
Message:

iprt/semaphore.h: Started adding RTSem*<Wait|Request>Ex[Debug].

File:
1 edited

Legend:

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

    r28800 r32946  
    55
    66/*
    7  * Copyright (C) 2006-2007 Oracle Corporation
     7 * Copyright (C) 2006-2010 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    248248
    249249
    250 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies, bool fAutoResume)
    251 {
    252     PCRTLOCKVALSRCPOS pSrcPos = NULL;
    253 
     250
     251DECLINLINE(int) rtSemEventLnxMultiWait(struct RTSEMEVENTMULTIINTERNAL *pThis, uint32_t fFlags, uint64_t uTimeout,
     252                                       PCRTLOCKVALSRCPOS pSrcPos)
     253{
    254254    /*
    255255     * Validate input.
    256256     */
    257     struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;
    258     AssertReturn(VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC,
    259                  VERR_INVALID_HANDLE);
     257    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     258    AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE);
     259    AssertReturn(RTSEMWAIT_FLAGS_ARE_VALID(fFlags), VERR_INVALID_PARAMETER);
    260260
    261261    /*
     
    268268
    269269    /*
    270      * Convert the timeout value.
     270     * Check and convert the timeout value.
    271271     */
    272272    struct timespec ts;
    273273    struct timespec *pTimeout = NULL;
    274     uint64_t u64End = 0; /* shut up gcc */
    275     if (cMillies != RT_INDEFINITE_WAIT)
     274    uint64_t u64Deadline = 0; /* shut up gcc */
     275    if (!(fFlags & RTSEMWAIT_FLAGS_INDEFINITE))
    276276    {
    277277        /* If the timeout is zero, then we're done. */
    278         if (!cMillies)
     278        if (!uTimeout)
    279279            return VERR_TIMEOUT;
    280         ts.tv_sec  = cMillies / 1000;
    281         ts.tv_nsec = (cMillies % 1000) * UINT32_C(1000000);
    282         u64End = RTTimeSystemNanoTS() + cMillies * UINT64_C(1000000);
    283         pTimeout = &ts;
     280
     281        /* Convert it to a deadline + interval timespec. */
     282        if (fFlags & RTSEMWAIT_FLAGS_MILLISECS)
     283            uTimeout = uTimeout < UINT64_MAX / UINT32_C(1000000) * UINT32_C(1000000)
     284                     ? uTimeout * UINT32_C(1000000)
     285                     : UINT64_MAX;
     286        if (uTimeout != UINT64_MAX) /* unofficial way of indicating an indefinite wait */
     287        {
     288            if (fFlags & RTSEMWAIT_FLAGS_RELATIVE)
     289                u64Deadline = RTTimeSystemNanoTS();
     290            else
     291            {
     292                uint64_t u64Now = RTTimeSystemNanoTS();
     293                if (uTimeout <= u64Now)
     294                    return VERR_TIMEOUT;
     295                u64Deadline = uTimeout;
     296                uTimeout   -= u64Now;
     297            }
     298            if (   sizeof(ts.tv_sec) >= sizeof(uint64_t)
     299                || uTimeout <= UINT64_C(1000000000) * UINT32_MAX)
     300            {
     301                ts.tv_nsec = uTimeout % UINT32_C(1000000000);
     302                ts.tv_sec  = uTimeout / UINT32_C(1000000000);
     303                pTimeout = &ts;
     304            }
     305        }
    284306    }
    285307
     
    306328            if (pTimeout)
    307329            {
    308                 int64_t i64Diff = u64End - RTTimeSystemNanoTS();
     330                int64_t i64Diff = u64Deadline - RTTimeSystemNanoTS();
    309331                if (i64Diff < 1000)
    310332                    return VERR_TIMEOUT;
     
    316338            {
    317339                int rc9 = RTLockValidatorRecSharedCheckBlocking(&pThis->Signallers, hThreadSelf, pSrcPos, false,
    318                                                                 cMillies, RTTHREADSTATE_EVENT_MULTI, true);
     340                                                                uTimeout / UINT32_C(1000000), RTTHREADSTATE_EVENT_MULTI, true);
    319341                if (RT_FAILURE(rc9))
    320342                    return rc9;
     
    344366            else if (rc == -EINTR)
    345367            {
    346                 if (!fAutoResume)
     368                if (fFlags & RTSEMWAIT_FLAGS_NORESUME)
    347369                    return VERR_INTERRUPTED;
    348370            }
     
    360382
    361383
    362 RTDECL(int)  RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies)
    363 {
    364     int rc = rtSemEventMultiWait(hEventMultiSem, cMillies, true);
    365     Assert(rc != VERR_INTERRUPTED);
    366     return rc;
    367 }
    368 
    369 
    370 RTDECL(int)  RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies)
    371 {
    372     return rtSemEventMultiWait(hEventMultiSem, cMillies, false);
     384#undef RTSemEventMultiWaitEx
     385RTDECL(int)  RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout)
     386{
     387#ifndef RTSEMEVENT_STRICT
     388    return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, NULL);
     389#else
     390    RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_NORMAL_API();
     391    return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, &SrcPos);
     392#endif
     393}
     394
     395
     396RTDECL(int)  RTSemEventMultiWaitExDebug(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout,
     397                                        RTHCUINTPTR uId, RT_SRC_POS_DECL)
     398{
     399    RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_DEBUG_API();
     400    return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, &SrcPos);
    373401}
    374402
     
    411439}
    412440
     441#include "../../generic/RTSemEventMultiWait-2-ex-generic.cpp"
     442#include "../../generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp"
     443
    413444#endif /* glibc < 2.6 || IPRT_WITH_FUTEX_BASED_SEMS */
    414445
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