mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 06:26:29 +08:00
core(TLS): add cleanup() method
This commit is contained in:
parent
526220a171
commit
ec7f74f7b4
@ -627,6 +627,9 @@ public:
|
|||||||
virtual void deleteDataInstance(void* pData) const = 0;
|
virtual void deleteDataInstance(void* pData) const = 0;
|
||||||
|
|
||||||
int key_;
|
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
|
// Main TLS data class
|
||||||
@ -638,13 +641,15 @@ public:
|
|||||||
inline ~TLSData() { release(); } // Release key and delete associated data
|
inline ~TLSData() { release(); } // Release key and delete associated data
|
||||||
inline T* get() const { return (T*)getData(); } // Get data associated with key
|
inline T* get() const { return (T*)getData(); } // Get data associated with key
|
||||||
|
|
||||||
// Get data from all threads
|
// Get data from all threads
|
||||||
inline void gather(std::vector<T*> &data) const
|
inline void gather(std::vector<T*> &data) const
|
||||||
{
|
{
|
||||||
std::vector<void*> &dataVoid = reinterpret_cast<std::vector<void*>&>(data);
|
std::vector<void*> &dataVoid = reinterpret_cast<std::vector<void*>&>(data);
|
||||||
gatherData(dataVoid);
|
gatherData(dataVoid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void cleanup() { TLSDataContainer::cleanup(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void* createDataInstance() const {return new T;} // Wrapper to allocate data by template
|
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
|
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
|
// 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);
|
AutoLock guard(mtxGlobalAccess);
|
||||||
CV_Assert(tlsSlots.size() > slotIdx);
|
CV_Assert(tlsSlots.size() > slotIdx);
|
||||||
@ -1099,12 +1099,13 @@ public:
|
|||||||
if (thread_slots.size() > slotIdx && thread_slots[slotIdx])
|
if (thread_slots.size() > slotIdx && thread_slots[slotIdx])
|
||||||
{
|
{
|
||||||
dataVec.push_back(thread_slots[slotIdx]);
|
dataVec.push_back(thread_slots[slotIdx]);
|
||||||
threads[i]->slots[slotIdx] = 0;
|
thread_slots[slotIdx] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tlsSlots[slotIdx] = 0;
|
if (!keepSlot)
|
||||||
|
tlsSlots[slotIdx] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get data by TLS storage index
|
// Get data by TLS storage index
|
||||||
@ -1196,9 +1197,18 @@ void TLSDataContainer::release()
|
|||||||
std::vector<void*> data;
|
std::vector<void*> data;
|
||||||
data.reserve(32);
|
data.reserve(32);
|
||||||
getTlsStorage().releaseSlot(key_, data); // Release key and get stored data for proper destruction
|
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
|
for(size_t i = 0; i < data.size(); i++) // Delete all associated data
|
||||||
deleteDataInstance(data[i]);
|
deleteDataInstance(data[i]);
|
||||||
key_ = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* TLSDataContainer::getData() const
|
void* TLSDataContainer::getData() const
|
||||||
|
Loading…
Reference in New Issue
Block a user