diff options
Diffstat (limited to 'src/OrderedQueue.cpp')
| -rw-r--r-- | src/OrderedQueue.cpp | 116 | 
1 files changed, 36 insertions, 80 deletions
| diff --git a/src/OrderedQueue.cpp b/src/OrderedQueue.cpp index 2aad726..8d545df 100644 --- a/src/OrderedQueue.cpp +++ b/src/OrderedQueue.cpp @@ -1,5 +1,6 @@  /* ------------------------------------------------------------------   * Copyright (C) 2017 AVT GmbH - Fabien Vercasson + * Copyright (C) 2019 Matthias P. Braendli   *   * Licensed under the Apache License, Version 2.0 (the "License");   * you may not use this file except in compliance with the License. @@ -25,134 +26,89 @@  //#define DEBUG(x...)  #define ERROR(fmt, A...)   fprintf(stderr, "OrderedQueue: ERROR " fmt, ##A) -/* - *  - */ -OrderedQueue::OrderedQueue(int countModulo, size_t capacity) -    :   _countModulo(countModulo), -        _capacity(capacity), -        _duplicated(0), -        _overruns(0), -        _lastCount(-1) +OrderedQueue::OrderedQueue(int countModulo, size_t capacity) : +    _countModulo(countModulo), +    _capacity(capacity)  {  } -/* - *  - */ -OrderedQueue::~OrderedQueue() -{ -    StockIterator it = _stock.begin(); -    while (it != _stock.end()) { -        delete it->second; -        it++; -    } -} - -/* - *  - */  void OrderedQueue::push(int32_t count, const uint8_t* buf, size_t size)  {  //    DEBUG("OrderedQueue::push count=%d\n", count);      count = (count+_countModulo) % _countModulo; -     +      // First frame makes the count initialisation. -    if( _lastCount == -1 ) -    { -        _lastCount = (count+_countModulo-1)%_countModulo; +    if (_lastCount == -1) { +        _lastCount = (count+_countModulo-1) % _countModulo;      }      if (_stock.size() < _capacity) { -        StockIterator it = _stock.find(count); -        OrderedQueueData* oqd = new OrderedQueueData(buf, size); -        if (it == _stock.end()) { -            if (_stock.insert(std::make_pair(count, oqd)).second == false) { -                ERROR("%d not inserted\n", count); -                delete oqd; -            } -        } -        else { +        if (_stock.find(count) == _stock.end()) {              // count already exists, duplicated frame              // Replace the old one by the new one.              // the old one could a an old frame from the previous count loop -            delete it->second; -            it->second = oqd;              _duplicated++;              DEBUG("Duplicated count=%d\n", count);          } + +        OrderedQueueData oqd(size); +        copy(buf, buf + size, oqd.begin()); +        _stock[count] = move(oqd);      }      else {          _overruns++; -        if (_overruns < 100) +        if (_overruns < 100) {              DEBUG("Overruns (size=%zu) count=%d not inserted\n", _stock.size(), count); -        else if (_overruns == 100) -            DEBUG("stop displaying Overruns\n");            +        } +        else if (_overruns == 100) { +            DEBUG("stop displaying Overruns\n"); +        }      }  } -/* - *  - */ -bool OrderedQueue::availableData() +bool OrderedQueue::availableData() const  {      // TODO Wait for filling gaps      return _stock.size() > 0;  } -/* - *  - */ -size_t OrderedQueue::pop(std::vector<uint8_t>& buf, int32_t* retCount) -{     +size_t OrderedQueue::pop(std::vector<uint8_t>& buf, int32_t *retCount) +{      size_t nbBytes = 0;      uint32_t gap = 0; -     +      if (_stock.size() > 0) { -        int32_t nextCount = (_lastCount+1)%_countModulo;   +        int32_t nextCount = (_lastCount+1) % _countModulo;          bool found = false; -        do { -            StockIterator it = _stock.find(nextCount); -            if (it != _stock.end()) { -                OrderedQueueData* oqd = it->second; -                buf.resize(oqd->getSize()); -                memcpy(buf.data(), oqd->getData(), oqd->getSize()); -                nbBytes = oqd->getSize(); -                delete oqd; -                _stock.erase(it); +        while (not found) { +            try { +                auto& oqd = _stock.at(nextCount); +                buf = move(oqd); +                _stock.erase(nextCount);                  _lastCount = nextCount;                  if (retCount) *retCount = _lastCount;                  found = true; -            } else +            } +            catch (const std::out_of_range&)              { -                if( _stock.size() < _capacity ) found = true; +                if (_stock.size() < _capacity) { +                    found = true; +                }                  else { -                    // Search for the new reference count, starting from the current one                     +                    // Search for the new reference count, starting from the current one                      // This could be optimised, but the modulo makes things                      // not easy.                      gap++; -                    nextCount = (nextCount+1)%_countModulo; +                    nextCount = (nextCount+1) % _countModulo;                  }              } -        } while( !found ); +        }      } -    if( gap > 0 ) -    { +    if (gap > 0) {          DEBUG("Count jump of %d\n", gap);      }  //    if (nbBytes > 0 && retCount) DEBUG("OrderedQueue::pop count=%d\n", *retCount);      return nbBytes;  } -OrderedQueueData::OrderedQueueData(const uint8_t* data, size_t size) -{ -    _data = new uint8_t[size]; -    memcpy(_data, data, size); -    _size = size; -} - -OrderedQueueData::~OrderedQueueData() -{ -    delete [] _data; -} | 
