#ifndef ACS_NC_BLOCKING_QUEUE_I_ #define ACS_NC_BLOCKING_QUEUE_I_ #include "acsncBlockingQueue.h" namespace nc { template blocking_queue::blocking_queue(){ pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); } template blocking_queue::~blocking_queue(){ unblock(); } template void blocking_queue::push(event_info &data) { pthread_mutex_lock(&mutex); buffer.push(data); pthread_mutex_unlock(&mutex); pthread_cond_signal(&cond); } template event_info blocking_queue::pop() { pthread_mutex_lock(&mutex); if(buffer.size() == 0) pthread_cond_wait(&cond, &mutex); if (buffer.size() == 0) { pthread_mutex_unlock(&mutex); interrupted_blocking_queue ex; throw ex; } event_info ret_val = buffer.front(); buffer.pop(); pthread_mutex_unlock(&mutex); return ret_val; } template void blocking_queue::pop_no_block() { pthread_mutex_lock(&mutex); if(buffer.size() == 0) { return; } buffer.pop(); pthread_mutex_unlock(&mutex); return; } template unsigned int blocking_queue::size() { return buffer.size(); } template void blocking_queue::unblock() { pthread_cond_broadcast(&cond); } template event_info::event_info(T &event, double &maxProcessTime, std::string & type_name) : event(event), maxProcessTime(maxProcessTime), type_name(type_name) { } template event_info::event_info(T &event, double &maxProcessTime, const char *type_name) : event(event), maxProcessTime(maxProcessTime), type_name(type_name) { } } #endif