eXpress “1.5”

src/threadsafety.cpp

00001 //
00002 //  threadsafety.cpp
00003 //  express
00004 //
00005 //  Created by Adam Roberts on 4/19/12.
00006 //  Copyright (c) 2012 Adam Roberts. All rights reserved.
00007 //
00008 
00009 #include "threadsafety.h"
00010 #include "fragments.h"
00011 
00012 ThreadSafeFragQueue::ThreadSafeFragQueue(size_t max_size)
00013     : _max_size(max_size) {
00014 }
00015 
00016 Fragment* ThreadSafeFragQueue::pop(bool block) {
00017   boost::unique_lock<boost::mutex> lock(_mut);
00018   while (_queue.empty()) {
00019     if (!block) {
00020             return NULL;
00021     }
00022         _cond.wait(lock);
00023   }
00024 
00025   _cond.notify_all();
00026   Fragment* res = _queue.front();
00027   _queue.pop();
00028   return res;
00029 }
00030 
00031 void ThreadSafeFragQueue::push(Fragment* frag) {
00032   boost::unique_lock<boost::mutex> lock(_mut);
00033   while (_queue.size() == _max_size) {
00034     _cond.wait(lock);
00035   }
00036 
00037   _cond.notify_all();
00038   return _queue.push(frag);
00039 }
00040 
00041 bool ThreadSafeFragQueue::is_empty(bool block) {
00042   boost::unique_lock<boost::mutex> lock(_mut);
00043   while (!_queue.empty()) {
00044     if (!block) {
00045       return false;
00046     }
00047     _cond.wait(lock);
00048   }
00049   return true;
00050 }
 All Classes Functions Variables