Exemplo n.º 1
0
    // returns whether we should produce more idle events
    virtual bool Action()
    {
        switch (m_count)
        {
        case 0:
            CPPUNIT_ASSERT(Init());
            break;
        case 1:
            GenerateEvent();
            break;
        case 2:
            // actual test
            CheckResult();
            Exit();
            break;

            // TODO a mechanism that will break the loop in case we
            // don't receive a file system event
            // this below doesn't quite work, so all tests must pass :-)
#if 0
        case 2:
            m_loop.Yield();
            m_loop.WakeUp();
            CPPUNIT_ASSERT(KeepWaiting());
            m_loop.Yield();
            break;
        case 3:
            break;
        case 4:
            CPPUNIT_ASSERT(AfterWait());
            break;
#endif
        } // switch (m_count)

        return m_count <= 0;
    }
Exemplo n.º 2
0
int LLBC_ConditionVariable::TimedWait(LLBC_ILock &lock, int milliSeconds)
{
    if (UNLIKELY(milliSeconds < 0 && milliSeconds != static_cast<int>(LLBC_INFINITE)))
    {
        LLBC_SetLastError(LLBC_ERROR_ARG);
        return LLBC_FAILED;
    }

#if LLBC_TARGET_PLATFORM_NON_WIN32
    pthread_mutex_t *mtx = reinterpret_cast<pthread_mutex_t *>(lock.Handle());
    ASSERT(mtx);

    if (milliSeconds == static_cast<int>(LLBC_INFINITE))
    {
        pthread_cond_wait(&m_handle, mtx);
        return LLBC_OK;
    }

    struct timeval tvStart, tvEnd;
    struct timespec ts;

    ::gettimeofday(&tvStart, NULL);
    tvEnd = tvStart;
    tvEnd.tv_sec += milliSeconds / 1000;
    tvEnd.tv_usec += (milliSeconds % 1000) * 1000;
    tvEnd.tv_sec += tvEnd.tv_usec / (1000 * 1000);
    tvEnd.tv_usec = tvEnd.tv_usec % (1000 * 1000);

    TIMEVAL_TO_TIMESPEC(&tvEnd, &ts);

    int errNo = pthread_cond_timedwait(&m_handle, mtx, &ts);
    if (errNo != 0)
    {
        errno = errNo;
        if (errNo == ETIMEDOUT)
        {
            LLBC_SetLastError(LLBC_ERROR_TIMEOUT);
        }
        else
        {
            LLBC_SetLastError(LLBC_ERROR_CLIB);
        }

        return LLBC_FAILED;
    }

    return LLBC_OK;
#else // LLBC_TARGET_PLATFORM_WIN32
    ::WaitForSingleObject(_cond.blockLock, INFINITE);
    ++ _cond.waitersBlocked;
    ::ReleaseSemaphore(_cond.blockLock, 1, NULL);

 #ifdef _MSC_VER
  #pragma inline_depth(0)
 #endif

    lock.Unlock();
    DWORD waitTimes = (milliSeconds == LLBC_INFINITE) ? (INFINITE) : milliSeconds;
    DWORD waitRet = ::WaitForSingleObject(_cond.blockQueue, waitTimes);
    ASSERT((waitRet == WAIT_OBJECT_0 || waitRet == WAIT_TIMEOUT) && "LLBC_CriticalVariable::TimedWait() error!");

    bool successed = (waitRet == WAIT_OBJECT_0) ? true : false;
    if (!successed)
    {
        LLBC_SetLastError(LLBC_ERROR_TIMEOUT);
    }

    AfterWait(lock);

 #ifdef _MSC_VER
  #pragma inline_depth()
 #endif

    return successed ? LLBC_OK : LLBC_FAILED;
#endif // LLBC_TARGET_PLATFORM_NON_WIN32
}