LCOV - code coverage report
Current view: top level - src/utils/foxtools - MFXSynchQue.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 52 52
Test Date: 2024-11-22 15:46:21 Functions: 100.0 % 12 12

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2004-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    MFXSynchQue.h
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Michael Behrisch
      17              : /// @date    2004-03-19
      18              : ///
      19              : // missing_desc
      20              : /****************************************************************************/
      21              : #pragma once
      22              : #include <config.h>
      23              : 
      24              : #ifdef HAVE_FOX
      25              : #include "fxheader.h"
      26              : #endif
      27              : #include <list>
      28              : #include <cassert>
      29              : #include <algorithm>
      30              : 
      31              : //#define DEBUG_LOCKING
      32              : 
      33              : #ifdef DEBUG_LOCKING
      34              : #include <iostream>
      35              : #include "MFXWorkerThread.h"
      36              : #endif
      37              : 
      38              : template<class T, class Container = std::list<T> >
      39      2111911 : class MFXSynchQue {
      40              : public:
      41      2293453 :     MFXSynchQue(const bool condition = true):
      42              : #ifdef HAVE_FOX
      43      2293453 :         myMutex(true),
      44              : #endif
      45      2293453 :         myCondition(condition)
      46              :     {}
      47              : 
      48      5919992 :     T top() {
      49              :         assert(myItems.size() != 0);
      50              : #ifdef HAVE_FOX
      51      5919992 :         if (myCondition) {
      52      5919992 :             myMutex.lock();
      53              :         }
      54              : #endif
      55      5919992 :         T ret = myItems.front();
      56              : #ifdef HAVE_FOX
      57      5919992 :         if (myCondition) {
      58      5919992 :             myMutex.unlock();
      59              :         }
      60              : #endif
      61      5919992 :         return ret;
      62              :     }
      63              : 
      64      5919992 :     void pop() {
      65              : #ifdef HAVE_FOX
      66      5919992 :         if (myCondition) {
      67      5919992 :             myMutex.lock();
      68              :         }
      69              : #endif
      70      5919992 :         myItems.erase(myItems.begin());
      71              : #ifdef HAVE_FOX
      72      5919992 :         if (myCondition) {
      73      5919992 :             myMutex.unlock();
      74              :         }
      75              : #endif
      76      5919992 :     }
      77              : 
      78              :     // Attention! Removes locking behavior
      79              :     void unsetCondition() {
      80      1974891 :         myCondition = false;
      81      1974891 :     }
      82              : 
      83              :     // Attention! Retains the lock
      84              :     Container& getContainer() {
      85              : #ifdef HAVE_FOX
      86    376322220 :         if (myCondition) {
      87     18451742 :             myMutex.lock();
      88              :         }
      89              : #endif
      90              : #ifdef DEBUG_LOCKING
      91              :         if (debugflag) {
      92              :             std::cout << " MFXSynchQue::getContainer thread=" << MFXWorkerThread::current() << "\n";
      93              :         }
      94              :         myOwningThread = MFXWorkerThread::current();
      95              : #endif
      96     94548799 :         return myItems;
      97              :     }
      98              : 
      99              :     void unlock() {
     100              : #ifdef HAVE_FOX
     101    376322220 :         if (myCondition) {
     102     18451742 :             myMutex.unlock();
     103              :         }
     104              : #endif
     105              : #ifdef DEBUG_LOCKING
     106              :         if (debugflag) {
     107              :             std::cout << " MFXSynchQue::unlock       thread=" << MFXWorkerThread::current() << "\n";
     108              :         }
     109              :         myOwningThread = 0;
     110              : #endif
     111              :     }
     112              : 
     113     53494449 :     void push_back(T what) {
     114              : #ifdef HAVE_FOX
     115     53494449 :         if (myCondition) {
     116     11961482 :             myMutex.lock();
     117              :         }
     118              : #endif
     119     53494449 :         myItems.push_back(what);
     120              : #ifdef HAVE_FOX
     121     53494449 :         if (myCondition) {
     122     11961482 :             myMutex.unlock();
     123              :         }
     124              : #endif
     125     53494449 :     }
     126              : 
     127     10835661 :     bool empty() {
     128              : #ifdef HAVE_FOX
     129     10835661 :         if (myCondition) {
     130     10835661 :             myMutex.lock();
     131              :         }
     132              : #endif
     133     10835661 :         const bool ret = myItems.size() == 0;
     134              : #ifdef HAVE_FOX
     135     10835661 :         if (myCondition) {
     136     10835661 :             myMutex.unlock();
     137              :         }
     138              : #endif
     139     10835661 :         return ret;
     140              :     }
     141              : 
     142     80153115 :     void clear() {
     143              : #ifdef HAVE_FOX
     144     80153115 :         if (myCondition) {
     145      3665920 :             myMutex.lock();
     146              :         }
     147              : #endif
     148              :         myItems.clear();
     149              : #ifdef HAVE_FOX
     150     80153115 :         if (myCondition) {
     151      3665920 :             myMutex.unlock();
     152              :         }
     153              : #endif
     154     80153115 :     }
     155              : 
     156              :     size_t size() const {
     157              : #ifdef HAVE_FOX
     158              :         if (myCondition) {
     159              :             myMutex.lock();
     160              :         }
     161              : #endif
     162              :         size_t res = myItems.size();
     163              : #ifdef HAVE_FOX
     164              :         if (myCondition) {
     165              :             myMutex.unlock();
     166              :         }
     167              : #endif
     168              :         return res;
     169              :     }
     170              : 
     171        17204 :     bool contains(const T& item) const {
     172              : #ifdef HAVE_FOX
     173        17204 :         if (myCondition) {
     174         3561 :             myMutex.lock();
     175              :         }
     176              : #endif
     177        17204 :         bool res = std::find(myItems.begin(), myItems.end(), item) != myItems.end();
     178              : #ifdef HAVE_FOX
     179        17204 :         if (myCondition) {
     180         3561 :             myMutex.unlock();
     181              :         }
     182              : #endif
     183        17204 :         return res;
     184              :     }
     185              : 
     186              :     bool isLocked() const {
     187              : #ifdef HAVE_FOX
     188              :         return myMutex.locked();
     189              : #else
     190              :         return false;
     191              : #endif
     192              :     }
     193              : 
     194              : private:
     195              : #ifdef HAVE_FOX
     196              :     mutable FXMutex myMutex;
     197              : #endif
     198              :     Container myItems;
     199              :     bool myCondition;
     200              : 
     201              : #ifdef DEBUG_LOCKING
     202              :     mutable long long int myOwningThread = 0;
     203              : public:
     204              :     mutable bool debugflag = false;
     205              : #endif
     206              : 
     207              : };
        

Generated by: LCOV version 2.0-1