00001 #ifndef __XRDSSIRRTABLE_HH__ 00002 #define __XRDSSIRRTABLE_HH__ 00003 /******************************************************************************/ 00004 /* */ 00005 /* X r d S s i R R T a b l e . h h */ 00006 /* */ 00007 /* (c) 2017 by the Board of Trustees of the Leland Stanford, Jr., University */ 00008 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00009 /* DE-AC02-76-SFO0515 with the Department of Energy */ 00010 /* */ 00011 /* This file is part of the XRootD software suite. */ 00012 /* */ 00013 /* XRootD is free software: you can redistribute it and/or modify it under */ 00014 /* the terms of the GNU Lesser General Public License as published by the */ 00015 /* Free Software Foundation, either version 3 of the License, or (at your */ 00016 /* option) any later version. */ 00017 /* */ 00018 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ 00019 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ 00020 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ 00021 /* License for more details. */ 00022 /* */ 00023 /* You should have received a copy of the GNU Lesser General Public License */ 00024 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ 00025 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */ 00026 /* */ 00027 /* The copyright holder's institutional names and contributor's names may not */ 00028 /* be used to endorse or promote products derived from this software without */ 00029 /* specific prior written permission of the institution or contributor. */ 00030 /******************************************************************************/ 00031 00032 #include <map> 00033 #include <stdint.h> 00034 00035 #include "XrdSsi/XrdSsiAtomics.hh" 00036 00037 template<class T> 00038 class XrdSsiRRTable 00039 { 00040 public: 00041 00042 void Add(T *item, uint64_t itemID) 00043 {rrtMutex.Lock(); 00044 if (baseItem != 0) theMap[itemID] = item; 00045 else {baseKey = itemID; 00046 baseItem = item; 00047 } 00048 rrtMutex.UnLock(); 00049 } 00050 00051 void Clear() {rrtMutex.Lock(); theMap.clear(); rrtMutex.UnLock();} 00052 00053 void Del(uint64_t itemID, bool finit=false) 00054 {XrdSsiMutexMon lck(rrtMutex); 00055 if (baseItem && baseKey == itemID) 00056 {if (finit) baseItem->Finalize(); 00057 baseItem = 0; 00058 } else { 00059 if (!finit) theMap.erase(itemID); 00060 else {typename std::map<uint64_t,T*>::iterator it = theMap.find(itemID); 00061 if (it != theMap.end()) it->second->Finalize(); 00062 theMap.erase(it); 00063 } 00064 } 00065 } 00066 00067 T *LookUp(uint64_t itemID) 00068 {XrdSsiMutexMon lck(rrtMutex); 00069 if (baseItem && baseKey == itemID) return baseItem; 00070 typename std::map<uint64_t,T*>::iterator it = theMap.find(itemID); 00071 return (it == theMap.end() ? 0 : it->second); 00072 } 00073 00074 int Num() {return theMap.size() + (baseItem ? 1 : 0);} 00075 00076 void Reset() 00077 {XrdSsiMutexMon lck(rrtMutex); 00078 typename std::map<uint64_t, T*>::iterator it = theMap.begin(); 00079 while(it != theMap.end()) 00080 {it->second->Finalize(); 00081 it++; 00082 } 00083 theMap.clear(); 00084 if (baseItem) 00085 {baseItem->Finalize(); 00086 baseItem = 0; 00087 } 00088 } 00089 00090 XrdSsiRRTable() : baseItem(0), baseKey(0) {} 00091 00092 ~XrdSsiRRTable() {Reset();} 00093 00094 private: 00095 XrdSsiMutex rrtMutex; 00096 T *baseItem; 00097 uint64_t baseKey; 00098 std::map<uint64_t, T*> theMap; 00099 }; 00100 #endif