comparison Core/MultiThreading/SharedMessageQueue.cpp @ 1227:7266c37d0354

lifo policy in SharedMessageQueue
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 20 Nov 2014 11:58:47 +0100
parents a811bdf8b8eb
children 6e7e5ed91c2d
comparison
equal deleted inserted replaced
1226:3f62e1269cca 1227:7266c37d0354
31 31
32 32
33 #include "../PrecompiledHeaders.h" 33 #include "../PrecompiledHeaders.h"
34 #include "SharedMessageQueue.h" 34 #include "SharedMessageQueue.h"
35 35
36
37
38 /**
39 * FIFO (queue):
40 *
41 * back front
42 * +--+--+--+--+--+--+--+--+--+--+--+
43 * Enqueue -> | | | | | | | | | | | |
44 * | | | | | | | | | | | | -> Dequeue
45 * +--+--+--+--+--+--+--+--+--+--+--+
46 * ^
47 * |
48 * Make room here
49 *
50 *
51 * LIFO (stack):
52 *
53 * back front
54 * +--+--+--+--+--+--+--+--+--+--+--+
55 * | | | | | | | | | | | | <- Enqueue
56 * | | | | | | | | | | | | -> Dequeue
57 * +--+--+--+--+--+--+--+--+--+--+--+
58 * ^
59 * |
60 * Make room here
61 **/
62
63
36 namespace Orthanc 64 namespace Orthanc
37 { 65 {
38 SharedMessageQueue::SharedMessageQueue(unsigned int maxSize) 66 SharedMessageQueue::SharedMessageQueue(unsigned int maxSize) :
67 isFifo_(true),
68 maxSize_(maxSize)
39 { 69 {
40 maxSize_ = maxSize;
41 } 70 }
42 71
43 72
44 SharedMessageQueue::~SharedMessageQueue() 73 SharedMessageQueue::~SharedMessageQueue()
45 { 74 {
54 { 83 {
55 boost::mutex::scoped_lock lock(mutex_); 84 boost::mutex::scoped_lock lock(mutex_);
56 85
57 if (maxSize_ != 0 && queue_.size() > maxSize_) 86 if (maxSize_ != 0 && queue_.size() > maxSize_)
58 { 87 {
59 // Too many elements in the queue: First remove the oldest 88 if (isFifo_)
60 delete queue_.front(); 89 {
61 queue_.pop_front(); 90 // Too many elements in the queue: Make room
91 delete queue_.front();
92 queue_.pop_front();
93 }
94 else
95 {
96 // Too many elements in the stack: Make room
97 delete queue_.back();
98 queue_.pop_back();
99 }
62 } 100 }
63 101
64 queue_.push_back(message); 102 if (isFifo_)
103 {
104 // Queue policy (FIFO)
105 queue_.push_back(message);
106 }
107 else
108 {
109 // Stack policy (LIFO)
110 queue_.push_front(message);
111 }
112
65 elementAvailable_.notify_one(); 113 elementAvailable_.notify_one();
66 } 114 }
67 115
68 116
69 IDynamicObject* SharedMessageQueue::Dequeue(int32_t millisecondsTimeout) 117 IDynamicObject* SharedMessageQueue::Dequeue(int32_t millisecondsTimeout)
122 } 170 }
123 } 171 }
124 172
125 return true; 173 return true;
126 } 174 }
175
176
177 void SharedMessageQueue::SetFifoPolicy()
178 {
179 boost::mutex::scoped_lock lock(mutex_);
180 isFifo_ = true;
181 }
182
183 void SharedMessageQueue::SetLifoPolicy()
184 {
185 boost::mutex::scoped_lock lock(mutex_);
186 isFifo_ = false;
187 }
127 } 188 }