BaseEvent.cpp 1.8 KB
#include "BaseEvent.h"
#include <stdio.h>

CBaseEvent::CBaseEvent()
{
    m_bIsSignaled = FALSE;
    pthread_mutex_init(&m_mutex,NULL);
    pthread_cond_init(&m_cond,NULL);
}


CBaseEvent::~CBaseEvent()
{
    pthread_cond_destroy(&m_cond);
    pthread_mutex_destroy(&m_mutex);
}


VOID CBaseEvent::ResetEvent()
{
    /// @todo implement me
    pthread_mutex_lock(&m_mutex);
    m_bIsSignaled = FALSE;
    pthread_mutex_unlock(&m_mutex);
}


INT32 CBaseEvent::Wait(UINT32 ui32TimeOut)
{
    /// @todo implement me
    pthread_mutex_lock(&m_mutex);
    struct timespec absTime;
    struct timeval curTime;
    while (!m_bIsSignaled)
    {
        gettimeofday(&curTime,NULL);
        absTime.tv_sec = curTime.tv_sec + ui32TimeOut / 1000;
        absTime.tv_nsec = (curTime.tv_usec + (ui32TimeOut % 1000) * 1000) * 1000;
        //absTime.tv_sec = curTime.tv_sec + ui32TimeOut / 1000000;
		//absTime.tv_nsec = (curTime.tv_usec + ui32TimeOut % 1000000) * 1000;
		absTime.tv_sec = absTime.tv_sec + absTime.tv_nsec / 1000000000;
        absTime.tv_nsec = absTime.tv_nsec % 1000000000;
        int res;
        res = pthread_cond_timedwait(&m_cond,&m_mutex,&absTime);
        if (res == ETIMEDOUT)
        {
            pthread_mutex_unlock(&m_mutex);
            return CON_EVENT_TIME_OUT;
        }
    }
    pthread_mutex_unlock(&m_mutex);
    return CON_EVENT_GET_IT;
}


VOID CBaseEvent::SetEvent()
{
    /// @todo implement me
    pthread_mutex_lock(&m_mutex);
    m_bIsSignaled = TRUE;
    pthread_cond_broadcast(&m_cond);
    pthread_mutex_unlock(&m_mutex);
}

VOID CBaseEvent::Wait()
{
    /// @todo implement me
    pthread_mutex_lock(&m_mutex);
    while (!m_bIsSignaled)
    {
        pthread_cond_wait(&m_cond,&m_mutex);
    }
	pthread_mutex_unlock(&m_mutex);
}