1 /****************************************************************************/ 2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo 3 // Copyright (C) 2004-2019 German Aerospace Center (DLR) and others. 4 // This program and the accompanying materials 5 // are made available under the terms of the Eclipse Public License v2.0 6 // which accompanies this distribution, and is available at 7 // http://www.eclipse.org/legal/epl-v20.html 8 // SPDX-License-Identifier: EPL-2.0 9 /****************************************************************************/ 10 /// @file FXSynchQue.h 11 /// @author Daniel Krajzewicz 12 /// @author Michael Behrisch 13 /// @date 2004-03-19 14 /// @version $Id$ 15 /// 16 // missing_desc 17 /****************************************************************************/ 18 #ifndef FXSynchQue_h 19 #define FXSynchQue_h 20 21 22 // =========================================================================== 23 // included modules 24 // =========================================================================== 25 #include <config.h> 26 27 #ifdef HAVE_FOX 28 #include <fx.h> 29 #endif 30 #include <list> 31 #include <cassert> 32 33 template<class T, class Container = std::list<T> > 34 class FXSynchQue { 35 public: myCondition(condition)36 FXSynchQue(const bool condition = true): myCondition(condition) {} 37 top()38 T top() { 39 assert(myItems.size() != 0); 40 #ifdef HAVE_FOX 41 if (myCondition) { 42 myMutex.lock(); 43 } 44 #endif 45 T ret = myItems.front(); 46 #ifdef HAVE_FOX 47 if (myCondition) { 48 myMutex.unlock(); 49 } 50 #endif 51 return ret; 52 } 53 pop()54 void pop() { 55 #ifdef HAVE_FOX 56 if (myCondition) { 57 myMutex.lock(); 58 } 59 #endif 60 myItems.erase(myItems.begin()); 61 #ifdef HAVE_FOX 62 if (myCondition) { 63 myMutex.unlock(); 64 } 65 #endif 66 } 67 68 // Attention! Removes locking behavior unsetCondition()69 void unsetCondition() { 70 myCondition = false; 71 } 72 73 // Attention! Retains the lock getContainer()74 Container& getContainer() { 75 #ifdef HAVE_FOX 76 if (myCondition) { 77 myMutex.lock(); 78 } 79 #endif 80 return myItems; 81 } 82 unlock()83 void unlock() { 84 #ifdef HAVE_FOX 85 if (myCondition) { 86 myMutex.unlock(); 87 } 88 #endif 89 } 90 push_back(T what)91 void push_back(T what) { 92 #ifdef HAVE_FOX 93 if (myCondition) { 94 myMutex.lock(); 95 } 96 #endif 97 myItems.push_back(what); 98 #ifdef HAVE_FOX 99 if (myCondition) { 100 myMutex.unlock(); 101 } 102 #endif 103 } 104 empty()105 bool empty() { 106 #ifdef HAVE_FOX 107 if (myCondition) { 108 myMutex.lock(); 109 } 110 #endif 111 const bool ret = myItems.size() == 0; 112 #ifdef HAVE_FOX 113 if (myCondition) { 114 myMutex.unlock(); 115 } 116 #endif 117 return ret; 118 } 119 clear()120 void clear() { 121 #ifdef HAVE_FOX 122 if (myCondition) { 123 myMutex.lock(); 124 } 125 #endif 126 myItems.clear(); 127 #ifdef HAVE_FOX 128 if (myCondition) { 129 myMutex.unlock(); 130 } 131 #endif 132 } 133 size()134 size_t size() const { 135 #ifdef HAVE_FOX 136 if (myCondition) { 137 myMutex.lock(); 138 } 139 #endif 140 size_t res = myItems.size(); 141 #ifdef HAVE_FOX 142 if (myCondition) { 143 myMutex.unlock(); 144 } 145 #endif 146 return res; 147 } 148 149 private: 150 #ifdef HAVE_FOX 151 mutable FXMutex myMutex; 152 #endif 153 Container myItems; 154 bool myCondition; 155 }; 156 157 158 #endif 159 160 /****************************************************************************/ 161