vnpy/vn.api/vn.ib/ibapi/windows/client/EReaderOSSignal.cpp

74 lines
1.8 KiB
C++

/* Copyright (C) 2013 Interactive Brokers LLC. All rights reserved. This code is subject to the terms
* and conditions of the IB API Non-Commercial License or the IB API Commercial License, as applicable. */
#include "StdAfx.h"
#include "EReaderOSSignal.h"
#define MS_IN_SEC 1000
EReaderOSSignal::EReaderOSSignal(unsigned long waitTimeout) throw (std::runtime_error)
{
bool ok = false;
m_waitTimeout = waitTimeout;
#if defined(IB_POSIX)
int rc1 = pthread_mutex_init(&m_mutex, NULL);
int rc2 = pthread_cond_init(&m_evMsgs, NULL);
ok = rc1 == 0 && rc2 == 0;
#elif defined(IB_WIN32)
m_evMsgs = CreateEvent(0, false, false, 0);
ok = (NULL != m_evMsgs);
#else
# error "Not implemented on this platform"
#endif
if (!ok)
throw std::runtime_error("Failed to create event");
}
EReaderOSSignal::~EReaderOSSignal(void)
{
#if defined(IB_POSIX)
pthread_cond_destroy(&m_evMsgs);
pthread_mutex_destroy(&m_mutex);
#elif defined(IB_WIN32)
CloseHandle(m_evMsgs);
#else
# error "Not implemented on this platform"
#endif
}
void EReaderOSSignal::issueSignal() {
#if defined(IB_POSIX)
pthread_mutex_lock(&m_mutex);
pthread_cond_signal(&m_evMsgs);
pthread_mutex_unlock(&m_mutex);
#elif defined(IB_WIN32)
SetEvent(m_evMsgs);
#else
# error "Not implemented on this platform"
#endif
}
void EReaderOSSignal::waitForSignal() {
#if defined(IB_POSIX)
pthread_mutex_lock(&m_mutex);
if ( m_waitTimeout == INFINITE ) {
pthread_cond_wait(&m_evMsgs, &m_mutex);
}
else {
struct timespec ts;
ts.tv_sec = m_waitTimeout/MS_IN_SEC;
ts.tv_nsec = (m_waitTimeout%MS_IN_SEC)*1000/*us/ms*/*1000/*ns/us*/;
pthread_cond_timedwait(&m_evMsgs, &m_mutex, &ts);
}
pthread_mutex_unlock(&m_mutex);
#elif defined(IB_WIN32)
WaitForSingleObject(m_evMsgs, m_waitTimeout);
#else
# error "Not implemented on this platform"
#endif
}