VirtualBox

Changeset 22952 in vbox


Ignore:
Timestamp:
Sep 11, 2009 12:00:48 PM (15 years ago)
Author:
vboxsync
Message:

Runtime/semevent: Fix part II for the Linux-specific RTSemEvent* implementation (adjusting the relative timeout)

Location:
trunk/src/VBox/Runtime/r3/linux
Files:
2 edited

Legend:

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

    r22950 r22952  
    197197     */
    198198    struct timespec ts;
     199    struct timespec tsEnd;
    199200    struct timespec *pTimeout = NULL;
    200     if (cMillies != RT_INDEFINITE_WAIT)
     201    if (RT_UNLIKELY(cMillies != RT_INDEFINITE_WAIT))
    201202    {
    202203        ts.tv_sec  = cMillies / 1000;
    203204        ts.tv_nsec = (cMillies % 1000) * 1000000;
     205        clock_gettime(CLOCK_REALTIME, &tsEnd);
     206        tsEnd.tv_sec  += ts.tv_sec;
     207        tsEnd.tv_nsec += ts.tv_nsec;
     208        if (tsEnd.tv_nsec >= 1000000000)
     209        {
     210            tsEnd.tv_nsec -= 1000000000;
     211            tsEnd.tv_sec++;
     212        }
    204213        pTimeout = &ts;
    205214    }
     
    246255            break;
    247256        }
     257        /* adjust the relative timeout */
     258        if (RT_UNLIKELY(pTimeout))
     259        {
     260            clock_gettime(CLOCK_REALTIME, &ts);
     261            ts.tv_nsec = tsEnd.tv_nsec - ts.tv_nsec;
     262            ts.tv_sec  = tsEnd.tv_nsec - ts.tv_sec;
     263            if (ts.tv_nsec < 0)
     264            {
     265                ts.tv_nsec += 1000000000; /* not correct if ts.tv_sec is negative but we
     266                                             leave on negative timeouts in any case */
     267                ts.tv_nsec--;
     268            }
     269            /* don't wait for less than 1 microsecond */
     270            if (   ts.tv_sec < 0
     271                || (ts.tv_sec == 0 && ts.tv_nsec < 1000))
     272            {
     273                rc = VERR_TIMEOUT;
     274                break;
     275            }
     276        }
    248277    }
    249278
  • trunk/src/VBox/Runtime/r3/linux/semeventmulti-linux.cpp

    r14468 r22952  
    218218     */
    219219    struct timespec ts;
     220    struct timespec tsEnd;
    220221    struct timespec *pTimeout = NULL;
    221     if (cMillies != RT_INDEFINITE_WAIT)
     222    if (RT_UNLIKELY(cMillies != RT_INDEFINITE_WAIT))
    222223    {
    223224        ts.tv_sec  = cMillies / 1000;
    224225        ts.tv_nsec = (cMillies % 1000) * 1000000;
     226        clock_gettime(CLOCK_REALTIME, &tsEnd);
     227        tsEnd.tv_sec  += ts.tv_sec;
     228        tsEnd.tv_nsec += ts.tv_nsec;
     229        if (tsEnd.tv_nsec >= 1000000000)
     230        {
     231            tsEnd.tv_nsec -= 1000000000;
     232            tsEnd.tv_sec++;
     233        }
    225234        pTimeout = &ts;
    226235    }
     
    240249            ||  ASMAtomicCmpXchgS32(&pThis->iState, 1, 0))
    241250        {
     251            /* adjust the relative timeout */
     252            if (RT_UNLIKELY(pTimeout))
     253            {
     254                clock_gettime(CLOCK_REALTIME, &ts);
     255                ts.tv_nsec = tsEnd.tv_nsec - ts.tv_nsec;
     256                ts.tv_sec  = tsEnd.tv_nsec - ts.tv_sec;
     257                if (ts.tv_nsec < 0)
     258                {
     259                    ts.tv_nsec += 1000000000; /* not correct if ts.tv_sec is negative but we
     260                                                 leave on negative timeouts in any case */
     261                    ts.tv_nsec--;
     262                }
     263                /* don't wait for less than 1 microsecond */
     264                if (   ts.tv_sec < 0
     265                    || (ts.tv_sec == 0 && ts.tv_nsec < 1000))
     266                    return VERR_TIMEOUT;
     267            }
    242268            long rc = sys_futex(&pThis->iState, FUTEX_WAIT, 1, pTimeout, NULL, 0);
    243269            if (RT_UNLIKELY(pThis->iMagic != RTSEMEVENTMULTI_MAGIC))
Note: See TracChangeset for help on using the changeset viewer.

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