1 #ifndef __XRDSSIRRTABLE_HH__
2 #define __XRDSSIRRTABLE_HH__
48 item(_item), tab(_tab), reqid(itemID) { }
51 reqid(other.reqid) { other.item = 0; }
67 explicit operator bool()
const {
return item !=
nullptr; }
72 void reset() {
if (item) {tab->Release(item, reqid); item=0;} }
74 T*
release() { T* itm=item; item=0;
return itm; }
76 uint64_t
reqID()
const {
return reqid; }
93 if ((baseItem.item && baseKey == itemID)
94 || theMap.count(itemID))
96 if (baseItem.item == 0)
97 {baseItem.Init(item, 2);
101 theMap[itemID].Init(item, 2);
114 if (baseItem.item && baseKey == itemID)
115 {
if (baseItem.item != item)
return false;
116 baseItem.deferedFinalize =
true;
119 typename std::map<uint64_t,ItemInfo>::iterator it = theMap.find(itemID);
120 if (it == theMap.end())
return false;
121 ItemInfo &info = it->second;
122 if (info.item != item)
return false;
123 info.deferedFinalize =
true;
135 if (baseItem.item && baseKey == itemID)
137 if (baseItem.item != item)
return;
141 typename std::map<uint64_t,ItemInfo>::iterator it = theMap.find(itemID);
142 if (it == theMap.end())
return;
143 ItemInfo &info = it->second;
144 if (info.item != item)
return;
151 void Del(uint64_t itemID) {Decr(itemID,
true);}
157 uint64_t itemID = r.reqID();
158 T* item = r.release();
159 Decr(itemID,
true, item,
true, 1);
161 while((baseItem.item && baseKey == itemID) ||
162 theMap.count(itemID))
165 do { wCond.
Wait(); }
while(nDef>0);
171 void Release(T* item, uint64_t itemID) {Decr(itemID,
false, item,
false, 1);}
179 if (baseItem.item && baseKey == itemID)
184 typename std::map<uint64_t,ItemInfo>::iterator it = theMap.find(itemID);
186 ItemInfo &info = it->second;
192 int Num() {
return theMap.size() + (baseItem.item ? 1 : 0);}
199 std::vector<std::pair<T*,uint64_t>> tofin;
200 if (baseItem.item && baseItem.refcount > 0)
201 {
if (!baseItem.deleted)
202 {baseItem.deleted =
true;
204 baseItem.deferedFinalize =
true;
206 if (baseItem.refcount <= 0)
207 {tofin.push_back(std::make_pair(baseItem.item,baseKey));}
209 for(
auto it=theMap.begin(); it!=theMap.end(); ++it)
210 {ItemInfo &info = it->second;
211 if (info.refcount <= 0)
continue;
213 {info.deleted =
true;
215 info.deferedFinalize=
true;
217 if (info.refcount <= 0) tofin.push_back(std::make_pair(info.item,it->first));
220 for(
auto &fpair : tofin)
222 uint64_t itemID=fpair.second;
231 while(baseItem.item || theMap.size() != 0)
234 do { wCond.
Wait(); }
while(nDef>0);
245 void Decr(uint64_t itemID,
bool del=
false, T* item=0,
bool fin=
false,
int ecnt=0)
247 if (baseItem.item && baseKey == itemID)
248 {
if (item && baseItem.item != item)
return;
249 if (baseItem.refcount <=0)
return;
250 if (!baseItem.deleted)
251 {
if (fin) baseItem.deferedFinalize=
true;
253 {baseItem.refcount--;
254 baseItem.deleted =
true;
257 baseItem.refcount -= ecnt;
259 if (baseItem.refcount <= 0)
260 {
if (baseItem.deferedFinalize)
261 { f = baseItem.item; baseItem.deleted =
true; }
273 else f->DeferredFinalize();
277 typename std::map<uint64_t,ItemInfo>::iterator it = theMap.find(itemID);
278 if (it == theMap.end())
return;
279 ItemInfo &info = it->second;
280 if (item && info.item != item)
return;
281 if (info.refcount <= 0)
return;
283 {
if (fin) info.deferedFinalize=
true;
289 info.refcount -= ecnt;
291 if (info.refcount <= 0)
292 {
if (info.deferedFinalize)
293 { f=info.item; info.deleted =
true; }
305 else f->DeferredFinalize();
311 bool deferedFinalize;
314 ItemInfo() {Init(0,0);}
315 void Init(T* _item,
int cnt)
317 deferedFinalize =
false;
325 std::map<uint64_t, ItemInfo> theMap;
void Lock(XrdSsiMutex *mutex)
XrdSsiRRTableItem(const XrdSsiRRTableItem &other)=delete
XrdSsiRRTableItem & operator=(XrdSsiRRTableItem &&other)
XrdSsiRRTableItem(T *_item, XrdSsiRRTable< T > *_tab, uint64_t itemID)
XrdSsiRRTableItem & operator=(const XrdSsiRRTableItem &)=delete
XrdSsiRRTableItem(XrdSsiRRTableItem &&other)
bool DeferFinalize(T *item, uint64_t itemID)
XrdSsiRRTableItem< T > Add(T *item, uint64_t itemID)
void Del(uint64_t itemID)
void Release(T *item, uint64_t itemID)
XrdSsiRRTableItem< T > LookUp(uint64_t itemID)
void DeferredFinalizeDone(T *item, uint64_t itemID)
void DelFinalize(XrdSsiRRTableItem< T > &&r)