LCOV - code coverage report
Current view: top level - eq - commandQueue.cpp (source / functions) Hit Total Coverage
Test: Equalizer Lines: 49 68 72.1 %
Date: 2017-12-16 05:07:20 Functions: 9 11 81.8 %

          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 : }

Generated by: LCOV version 1.11