Line data Source code
1 :
2 : /* Copyright (c) 2007-2015, Stefan Eilemann <eile@equalizergraphics.com>
3 : * Daniel Nachbaur <danielnachbaur@gmail.com>
4 : *
5 : * This library is free software; you can redistribute it and/or modify it under
6 : * the terms of the GNU Lesser General Public License version 2.1 as published
7 : * by the Free Software Foundation.
8 : *
9 : * This library is distributed in the hope that it will be useful, but WITHOUT
10 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 : * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 : * details.
13 : *
14 : * You should have received a copy of the GNU Lesser General Public License
15 : * along with this library; if not, write to the Free Software Foundation, Inc.,
16 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 : */
18 :
19 : #include "commandQueue.h"
20 :
21 : #include "messagePump.h"
22 :
23 : #include <co/iCommand.h>
24 : #include <lunchbox/clock.h>
25 :
26 : namespace eq
27 : {
28 : namespace
29 : {
30 10 : static lunchbox::Clock _clock;
31 : }
32 :
33 4 : CommandQueue::CommandQueue(const size_t maxSize)
34 : : co::CommandQueue(maxSize)
35 : , _messagePump(0)
36 4 : , _waitTime(0)
37 : {
38 4 : }
39 :
40 8 : CommandQueue::~CommandQueue()
41 : {
42 4 : LBASSERT(!_messagePump);
43 4 : delete _messagePump;
44 4 : _messagePump = 0;
45 4 : }
46 :
47 89 : void CommandQueue::push(const co::ICommand& command)
48 : {
49 89 : co::CommandQueue::push(command);
50 89 : if (_messagePump)
51 47 : _messagePump->postWakeup();
52 89 : }
53 :
54 0 : void CommandQueue::pushFront(const co::ICommand& command)
55 : {
56 0 : co::CommandQueue::pushFront(command);
57 0 : if (_messagePump)
58 0 : _messagePump->postWakeup();
59 0 : }
60 :
61 21 : co::ICommand CommandQueue::pop(const uint32_t timeout)
62 : {
63 21 : const int64_t start = _clock.getTime64();
64 21 : int64_t waitBegin = -1;
65 : while (true)
66 : {
67 21 : if (_messagePump)
68 0 : _messagePump->dispatchAll(); // non-blocking
69 :
70 : // Poll for a command
71 21 : if (!isEmpty())
72 : {
73 8 : if (waitBegin > -1)
74 0 : _waitTime += (_clock.getTime64() - waitBegin);
75 8 : return co::CommandQueue::pop(0);
76 : }
77 :
78 13 : if (_messagePump)
79 : {
80 0 : if (waitBegin == -1)
81 0 : waitBegin = _clock.getTime64();
82 0 : _messagePump->dispatchOne(timeout); // blocks - push sends wakeup
83 : }
84 : else
85 : {
86 13 : waitBegin = _clock.getTime64();
87 : // blocking
88 26 : const co::ICommand& command = co::CommandQueue::pop(timeout);
89 13 : _waitTime += (_clock.getTime64() - waitBegin);
90 13 : return command;
91 : }
92 :
93 0 : if (_clock.getTime64() - start > timeout)
94 0 : return co::ICommand();
95 0 : }
96 : }
97 :
98 21 : co::ICommands CommandQueue::popAll(const uint32_t timeout)
99 : {
100 21 : const int64_t start = _clock.getTime64();
101 21 : int64_t waitBegin = -1;
102 : while (true)
103 : {
104 6963 : if (_messagePump)
105 6963 : _messagePump->dispatchAll(); // non-blocking
106 :
107 : // Poll for commands
108 6963 : if (!isEmpty())
109 : {
110 21 : if (waitBegin > -1)
111 6 : _waitTime += (_clock.getTime64() - waitBegin);
112 21 : return co::CommandQueue::popAll(0);
113 : }
114 :
115 6942 : if (_messagePump)
116 : {
117 6942 : if (waitBegin == -1)
118 6 : waitBegin = _clock.getTime64();
119 6942 : _messagePump->dispatchOne(timeout); // blocks - push sends wakeup
120 : }
121 : else
122 : {
123 0 : waitBegin = _clock.getTime64();
124 : // blocking
125 0 : const co::ICommands& commands = co::CommandQueue::popAll(timeout);
126 0 : _waitTime += (_clock.getTime64() - waitBegin);
127 0 : return commands;
128 : }
129 :
130 6942 : if (_clock.getTime64() - start > timeout)
131 0 : return co::ICommands();
132 6942 : }
133 : }
134 :
135 22 : co::ICommand CommandQueue::tryPop()
136 : {
137 22 : if (_messagePump)
138 0 : _messagePump->dispatchAll(); // non-blocking
139 :
140 22 : return co::CommandQueue::tryPop();
141 : }
142 :
143 49 : void CommandQueue::pump()
144 : {
145 49 : if (_messagePump)
146 49 : _messagePump->dispatchAll(); // non-blocking
147 49 : }
148 30 : }
|