Mercurial > hg > orthanc
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 } |