VirtualBox

Changeset 33384 in vbox for trunk


Ignore:
Timestamp:
Oct 24, 2010 2:57:44 PM (14 years ago)
Author:
vboxsync
Message:

FreeBSD: More fixes to the RTSemEventWaitEx code. tstSupSem passes completely now.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/freebsd/sleepqueue-r0drv-freebsd.h

    r33381 r33384  
    3636#include <iprt/time.h>
    3737
    38 /** The resolution (nanoseconds) specified when using
    39  *  schedule_hrtimeout_range. */
    40 #define RTR0SEMLNXWAIT_RESOLUTION   50000
    41 
    42 
    4338/**
    4439 * Kernel mode Linux wait state structure.
     
    4641typedef struct RTR0SEMBSDSLEEP
    4742{
     43    /** The absolute timeout given as nano seconds since the start of the
     44     *  monotonic clock. */
     45    uint64_t        uNsAbsTimeout;
    4846    /** The timeout in ticks. Updated after waiting. */
    4947    int             iTimeout;
     
    6563
    6664/**
     65 * Updates the timeout of the FreeBSD wait.
     66 *
     67 * @returns RTSEMWAIT_FLAGS_INDEFINITE if the timeout value is too big.
     68 *          0 otherwise
     69 * @param   pWait               The wait structure.
     70 * @param   uTimeout            The relative timeout in nanoseconds.
     71 */
     72DECLINLINE(uint32_t) rtR0SemBsdWaitUpdateTimeout(PRTR0SEMBSDSLEEP pWait, uint64_t uTimeout)
     73{
     74#if 0
     75    struct timeval tv;
     76
     77    tv.tv_sec = uTimeout / UINT64_C(1000000000);
     78    tv.tv_usec = (uTimeout % UINT64_C(1000000000)) / UINT64_C(1000);
     79
     80    pWait->iTimeout = tvtohz(&tv);
     81#else
     82    uint64_t cTicks = ASMMultU64ByU32DivByU32(uTimeout, hz, UINT32_C(1000000000));
     83    if (cTicks >= INT_MAX)
     84        return RTSEMWAIT_FLAGS_INDEFINITE;
     85    else
     86        pWait->iTimeout     = (int)cTicks;
     87#endif
     88
     89    return 0;
     90}
     91
     92/**
    6793 * Initializes a wait.
    6894 *
     
    80106{
    81107    pWait->iTimeout = 0;
     108    pWait->uNsAbsTimeout = 0; /* shut up gcc */
    82109
    83110    /*
     
    104131                if (u64Now + uTimeout < u64Now) /* overflow */
    105132                    fFlags |= RTSEMWAIT_FLAGS_INDEFINITE;
     133                else
     134                    pWait->uNsAbsTimeout = u64Now + uTimeout;
    106135            }
    107136            else
     
    111140                    return VERR_TIMEOUT;
    112141
     142                pWait->uNsAbsTimeout = uTimeout;
    113143                uTimeout -= u64Now; /* Get a relative value. */
    114144            }
     
    119149    {
    120150        pWait->fIndefinite      = false;
    121 
    122 #if 0
    123         struct timeval tv;
    124 
    125         tv.tv_sec = uTimeout / UINT64_C(1000000000);
    126         tv.tv_usec = (uTimeout % UINT64_C(1000000000)) / UINT64_C(1000);
    127 
    128         pWait->iTimeout = tvtohz(&tv);
    129 #else
    130         uint64_t cTicks = ASMMultU64ByU32DivByU32(uTimeout, hz, UINT32_C(1000000000));
    131         if (cTicks >= INT_MAX)
    132             fFlags |= RTSEMWAIT_FLAGS_INDEFINITE;
    133         else
    134             pWait->iTimeout     = (int)cTicks;
    135 #endif
     151        fFlags |= rtR0SemBsdWaitUpdateTimeout(pWait, uTimeout);
    136152    }
    137153
     
    140156        pWait->fIndefinite      = true;
    141157        pWait->iTimeout         = INT_MAX;
     158        pWait->uNsAbsTimeout    = UINT64_MAX;
    142159    }
    143160
     
    208225        case 0:
    209226            break;
     227        case ERESTART:
     228        {
     229            if (!pWait->fIndefinite)
     230            {
     231                /* Recalc timeout. */
     232                uint64_t u64Now = RTTimeSystemNanoTS();
     233                if (u64Now >= pWait->uNsAbsTimeout)
     234                    pWait->fTimedOut = true;
     235                else
     236                {
     237                    u64Now = pWait->uNsAbsTimeout - u64Now;
     238                    rtR0SemBsdWaitUpdateTimeout(pWait, u64Now);
     239                }
     240            }
     241            break;
     242        }
    210243        case EWOULDBLOCK:
    211244            pWait->fTimedOut = true;
    212245            break;
    213246        case EINTR:
    214         case ERESTART:
     247            Assert(pWait->fInterruptible);
    215248            pWait->fInterrupted = true;
    216249            break;
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