eXpress “1.5”
|
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 }