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);
105void Clear() {rrtMutex.Lock(); theMap.clear(); baseItem.item = 0; rrtMutex.UnLock();}
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;
151void 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);
171void 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;
192int 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);
245void 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; }
262 else { wCond.Lock(); wCond.Broadcast(); wCond.UnLock(); baseItem.item = 0; }
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; }
294 else { wCond.Lock(); wCond.Broadcast(); wCond.UnLock(); theMap.erase(it); }
305 else f->DeferredFinalize();
311 bool deferedFinalize;
314 ItemInfo() {Init(0,0);}
315 void Init(T* _item,
int cnt)
317 deferedFinalize =
false;
325std::map<uint64_t, ItemInfo> theMap;