core(TLS): add cleanup() method

pull/8204/head
Alexander Alekhin 8 years ago
parent 526220a171
commit ec7f74f7b4
  1. 5
      modules/core/include/opencv2/core/utility.hpp
  2. 16
      modules/core/src/system.cpp

@ -627,6 +627,9 @@ public:
virtual void deleteDataInstance(void* pData) const = 0;
int key_;
public:
void cleanup(); //! Release created TLS data container objects. It is similar to release() call, but it keeps TLS container valid.
};
// Main TLS data class
@ -645,6 +648,8 @@ public:
gatherData(dataVoid);
}
inline void cleanup() { TLSDataContainer::cleanup(); }
private:
virtual void* createDataInstance() const {return new T;} // Wrapper to allocate data by template
virtual void deleteDataInstance(void* pData) const {delete (T*)pData;} // Wrapper to release data by template

@ -1086,7 +1086,7 @@ public:
}
// Release TLS storage index and pass associated data to caller
void releaseSlot(size_t slotIdx, std::vector<void*> &dataVec)
void releaseSlot(size_t slotIdx, std::vector<void*> &dataVec, bool keepSlot = false)
{
AutoLock guard(mtxGlobalAccess);
CV_Assert(tlsSlots.size() > slotIdx);
@ -1099,11 +1099,12 @@ public:
if (thread_slots.size() > slotIdx && thread_slots[slotIdx])
{
dataVec.push_back(thread_slots[slotIdx]);
threads[i]->slots[slotIdx] = 0;
thread_slots[slotIdx] = NULL;
}
}
}
if (!keepSlot)
tlsSlots[slotIdx] = 0;
}
@ -1196,9 +1197,18 @@ void TLSDataContainer::release()
std::vector<void*> data;
data.reserve(32);
getTlsStorage().releaseSlot(key_, data); // Release key and get stored data for proper destruction
key_ = -1;
for(size_t i = 0; i < data.size(); i++) // Delete all associated data
deleteDataInstance(data[i]);
}
void TLSDataContainer::cleanup()
{
std::vector<void*> data;
data.reserve(32);
getTlsStorage().releaseSlot(key_, data, true); // Extract stored data with removal from TLS tables
for(size_t i = 0; i < data.size(); i++) // Delete all associated data
deleteDataInstance(data[i]);
key_ = -1;
}
void* TLSDataContainer::getData() const

Loading…
Cancel
Save