00001 /** 00002 * @file orderqueue.cpp 00003 * @author Reshen Amin <reshen@zensrc.com> 00004 * 00005 * @brief Contains the class declaration for @ref OrderQueue 00006 * 00007 * @license Byzantine Generals Problem Coding Sample.<br> 00008 * Copyright (C) 2010 Reshen Amin.<br> 00009 * See @ref license_sec for details.<br> 00010 */ 00011 00012 #include "orderqueue.h" 00013 00014 #include <boost/interprocess/sync/interprocess_mutex.hpp> 00015 00016 OrderQueue::OrderQueue(const OrderAllocator &order_alloc) 00017 : order_list_(order_alloc), 00018 mutex_(), 00019 sem_fill_(0) { 00020 } 00021 00022 OrderQueue::~OrderQueue() { 00023 } 00024 00025 void OrderQueue::PushBack(const Order& ord) { 00026 /* Lock down our shared data structure */ 00027 mutex_.lock(); 00028 00029 /* Enqueue provided order */ 00030 order_list_.push_back(ord); 00031 00032 /* Unlock shared data structure */ 00033 mutex_.unlock(); 00034 00035 /* Notify any pending threads that we have a new order available for 00036 * consumption */ 00037 sem_fill_.post(); 00038 } 00039 00040 Order OrderQueue::PopFront() { 00041 /* Pend waiting for orders to consume from this queue */ 00042 sem_fill_.wait(); 00043 00044 /* Lock down our shared data structure */ 00045 mutex_.lock(); 00046 00047 /* Dequeue oldest order from queue */ 00048 Order front_order = order_list_.front(); 00049 order_list_.pop_front(); 00050 00051 /* Unlock shared data structure */ 00052 mutex_.unlock(); 00053 00054 return front_order; 00055 } 00056 00057 bool OrderQueue::Empty() { 00058 bool empty = false; 00059 00060 /* Lock down our shared data structure */ 00061 mutex_.lock(); 00062 00063 /* Check queue empty status */ 00064 empty = order_list_.empty(); 00065 00066 /* Unlock shared data structure */ 00067 mutex_.unlock(); 00068 00069 return empty; 00070 } 00071
1.6.3