11 #ifndef MI_BASE_CONDITION_H
 
   12 #define MI_BASE_CONDITION_H
 
   17 #ifndef MI_PLATFORM_WINDOWS
 
   22 #include <mi/base/miwindows.h>
 
   40 #ifndef MI_PLATFORM_WINDOWS
 
   42         pthread_mutex_init( &m_mutex, NULL);
 
   43         pthread_cond_init( &m_condvar, NULL);
 
   45         m_handle = CreateEvent( NULL, 
false, 
false, NULL);
 
   52 #ifndef MI_PLATFORM_WINDOWS
 
   53         pthread_mutex_destroy( &m_mutex);
 
   54         pthread_cond_destroy( &m_condvar);
 
   56         CloseHandle( m_handle);
 
   65 #ifndef MI_PLATFORM_WINDOWS
 
   66         pthread_mutex_lock( &m_mutex);
 
   68             pthread_cond_wait( &m_condvar, &m_mutex);
 
   70         pthread_mutex_unlock( &m_mutex);
 
   72         WaitForSingleObject( m_handle, INFINITE);
 
   84 #ifndef MI_PLATFORM_WINDOWS
 
   86         gettimeofday( &now, NULL);
 
   87         struct timespec timeout_abs;
 
   88         timeout_abs.tv_sec = now.tv_sec + 
static_cast<long>( floor( timeout));
 
   90             = 1000 * now.tv_usec + 
static_cast<long>( 1E9 * ( timeout - floor( timeout)));
 
   91         if( timeout_abs.tv_nsec > 1000000000) {
 
   92             timeout_abs.tv_sec  += 1;
 
   93             timeout_abs.tv_nsec -= 1000000000;
 
   96         bool timed_out = 
false;
 
   97         pthread_mutex_lock( &m_mutex);
 
  100             int result = pthread_cond_timedwait( &m_condvar, &m_mutex, &timeout_abs);
 
  101             timed_out = result == ETIMEDOUT;
 
  106         pthread_mutex_unlock( &m_mutex);
 
  109         DWORD timeout_ms = 
static_cast<DWORD
>( 1000 * timeout);
 
  110         DWORD result = WaitForSingleObject( m_handle, timeout_ms);
 
  111         return result == WAIT_TIMEOUT;   
 
  125 #ifndef MI_PLATFORM_WINDOWS
 
  126         pthread_mutex_lock( &m_mutex);
 
  128         pthread_cond_signal( &m_condvar);
 
  129         pthread_mutex_unlock( &m_mutex);
 
  140 #ifndef MI_PLATFORM_WINDOWS
 
  141         pthread_mutex_lock( &m_mutex);
 
  143         pthread_mutex_unlock( &m_mutex);
 
  145         ResetEvent( m_handle);
 
  150 #ifndef MI_PLATFORM_WINDOWS
 
  151     pthread_mutex_t m_mutex;
 
  154     pthread_cond_t m_condvar;
 
  169 #endif // MI_BASE_CONDITION_H