root/OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/MessageQueue.hpp @ 9816

Revision 9816, 2.5 kB (checked in by robert, 5 years ago)

From Tanguy Fautre (Aris Technologies), ffmpeg plugin

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_MESSAGE_QUEUE_H
3#define HEADER_GUARD_OSGFFMPEG_MESSAGE_QUEUE_H
4
5#include <OpenThreads/Condition>
6#include <OpenThreads/Mutex>
7#include <OpenThreads/ScopedLock>
8
9#include <deque>
10
11
12
13namespace osgFFmpeg {
14
15
16
17template <class T>
18class MessageQueue
19{
20public:
21
22    typedef T value_type;
23    typedef size_t size_type;
24
25    MessageQueue();
26    ~MessageQueue();
27
28    void clear();
29
30    void push(const T & value);
31
32    value_type pop();
33    value_type tryPop(bool & is_empty);
34    value_type timedPop(bool & is_empty, unsigned long ms);
35
36private:
37
38    MessageQueue(const MessageQueue &);
39    MessageQueue & operator = (const MessageQueue &);
40
41    typedef std::deque<T> Queue;
42    typedef OpenThreads::Condition Condition;
43    typedef OpenThreads::Mutex Mutex;
44    typedef OpenThreads::ScopedLock<Mutex> ScopedLock;
45
46    Mutex        m_mutex;
47    Condition    m_not_empty;
48    Queue        m_queue;
49};
50
51
52
53
54
55template <class T>
56MessageQueue<T>::MessageQueue()
57{
58
59}
60
61
62
63template <class T>
64MessageQueue<T>::~MessageQueue()
65{
66
67}
68
69
70
71template <class T>
72void MessageQueue<T>::clear()
73{
74    ScopedLock lock(m_mutex);
75
76    m_queue.clear();
77}
78
79
80
81template <class T>
82void MessageQueue<T>::push(const T & value)
83{
84    {
85        ScopedLock lock(m_mutex);
86        m_queue.push_back(value);
87    }
88
89    m_not_empty.signal();
90}
91
92
93
94template <class T>
95typename MessageQueue<T>::value_type MessageQueue<T>::pop()
96{
97    ScopedLock lock(m_mutex);
98
99    while (m_queue.empty())
100        m_not_empty.wait(&m_mutex);
101
102    const value_type value = m_queue.front();
103    m_queue.pop_front();
104
105    return value;
106}
107
108
109
110template <class T>
111typename MessageQueue<T>::value_type MessageQueue<T>::tryPop(bool & is_empty)
112{
113    ScopedLock lock(m_mutex);
114
115    is_empty = m_queue.empty();
116
117    if (is_empty)
118        return value_type();
119
120    const value_type value = m_queue.front();
121    m_queue.pop_front();
122
123    return value;
124}
125
126
127
128template <class T>
129typename MessageQueue<T>::value_type MessageQueue<T>::timedPop(bool & is_empty, const unsigned long ms)
130{
131    ScopedLock lock(m_mutex);
132
133    // We don't wait in a loop to avoid an infinite loop (as the ms timeout would not be decremented).
134    // This means that timedPop() could return with (is_empty = true) before the timeout has been hit.
135
136    if (m_queue.empty())
137        m_not_empty.wait(&m_mutex, ms);
138
139    is_empty = m_queue.empty();
140
141    if (is_empty)
142        return value_type();
143
144    const value_type value = m_queue.front();
145    m_queue.pop_front();
146
147    return value;
148}
149
150
151
152} // namespace osgFFmpeg
153
154
155
156#endif // HEADER_GUARD_OSGFFMPEG_MESSAGE_QUEUE_H
Note: See TracBrowser for help on using the browser.