#ifndef STORM_HASH_TS_EXPORT_TABLE_SYNC_REUSE_HPP #define STORM_HASH_TS_EXPORT_TABLE_SYNC_REUSE_HPP #include "storm/hash/Hashkey.hpp" #include "storm/hash/TSExportTableSimpleReuse.hpp" template class TSExportTableSyncReuse : public TSExportTableSimpleReuse { public: // Virtual member functions virtual ~TSExportTableSyncReuse() = default; // Member functions void Delete(THandle handle); void DeleteUnlock(T* ptr, TLockedHandle lockedHandle); T* Lock(THandle handle, TLockedHandle* lockedHandlePtr, int32_t forWriting); T* NewLock(THandle* handlePtr, TLockedHandle* lockedHandlePtr); void Unlock(TLockedHandle lockedHandle); private: // Member variables TSync m_sync; // Member functions int32_t IsForWriting(TLockedHandle lockedHandle); void SyncEnterLock(TLockedHandle* lockedHandlePtr, int32_t forWriting); void SyncLeaveLock(TLockedHandle lockedHandle); }; template void TSExportTableSyncReuse::Delete(THandle handle) { TLockedHandle lockedHandle; auto ptr = this->Lock(handle, &lockedHandle, 1); this->DeleteUnlock(ptr, lockedHandle); } template void TSExportTableSyncReuse::DeleteUnlock(T* ptr, TLockedHandle lockedHandle) { this->TSExportTableSimpleReuse::Delete(ptr); this->Unlock(lockedHandle); } template int32_t TSExportTableSyncReuse::IsForWriting(TLockedHandle lockedHandle) { return reinterpret_cast(lockedHandle) == 1; } template T* TSExportTableSyncReuse::Lock(THandle handle, TLockedHandle* lockedHandlePtr, int32_t forWriting) { this->SyncEnterLock(lockedHandlePtr, forWriting); auto ptr = this->Ptr(handle); if (!ptr) { this->SyncLeaveLock(*lockedHandlePtr); *lockedHandlePtr = nullptr; return nullptr; } return ptr; } template T* TSExportTableSyncReuse::NewLock(THandle* handlePtr, TLockedHandle* lockedHandlePtr) { this->SyncEnterLock(lockedHandlePtr, 1); return this->New(handlePtr); } template void TSExportTableSyncReuse::SyncEnterLock(TLockedHandle* lockedHandlePtr, int32_t forWriting) { this->m_sync.Enter(forWriting); *lockedHandlePtr = reinterpret_cast(forWriting ? 1 : -1); } template void TSExportTableSyncReuse::SyncLeaveLock(TLockedHandle lockedHandle) { if (lockedHandle) { this->m_sync.Leave(this->IsForWriting(lockedHandle)); } } template void TSExportTableSyncReuse::Unlock(TLockedHandle lockedHandle) { this->SyncLeaveLock(lockedHandle); } #endif