23 #include "ocilibcpp/core.hpp" 31 HandleHolder<T>::SmartHandle::SmartHandle
33 HandleHolder* holder, T handle, HandleFreeFunc handleFreefunc,
34 SmartHandleFreeNotifyFunc freeNotifyFunc, Handle* parent
36 : _holders(), _handle(handle), _handleFreeFunc(handleFreefunc),
37 _freeNotifyFunc(freeNotifyFunc), _parent(parent), _extraInfo(nullptr)
41 _holders.SetLocker(&_locker);
42 _children.SetLocker(&_locker);
44 Environment::SetSmartHandle<SmartHandle*>(handle,
this);
48 if (_parent && _handle)
50 _parent->GetChildren().Add(
this);
55 HandleHolder<T>::SmartHandle::~SmartHandle() noexcept
57 SILENT_CATCH((Destroy()))
61 void HandleHolder<T>::SmartHandle::Destroy()
63 if (_parent && _handle)
65 _parent->GetChildren().Remove(
this);
68 _children.ForEach(DeleteHandle);
71 _holders.SetLocker(
nullptr);
72 _children.SetLocker(
nullptr);
74 Environment::SetSmartHandle<SmartHandle*>(_handle,
nullptr);
78 _freeNotifyFunc(
this);
81 if (_handleFreeFunc && _handle)
83 _handleFreeFunc(_handle);
88 void HandleHolder<T>::SmartHandle::DeleteHandle(Handle* handle)
92 handle->DetachFromParent();
93 handle->DetachFromHolders();
95 delete core::OnDeallocate(handle);
100 void HandleHolder<T>::SmartHandle::ResetHolder(HandleHolder* holder)
104 holder->_smartHandle =
nullptr;
109 void HandleHolder<T>::SmartHandle::Acquire(HandleHolder* holder)
111 _holders.Add(holder);
115 void HandleHolder<T>::SmartHandle::Release(HandleHolder* holder)
117 _holders.Remove(holder);
119 if (_holders.GetSize() == 0)
121 delete core::OnDeallocate(
this);
124 holder->_smartHandle =
nullptr;
128 T HandleHolder<T>::SmartHandle::GetHandle()
const 134 Handle* HandleHolder<T>::SmartHandle::GetParent()
const 140 AnyPointer HandleHolder<T>::SmartHandle::GetExtraInfos()
const 146 void HandleHolder<T>::SmartHandle::SetExtraInfos(
AnyPointer extraInfo)
148 _extraInfo = extraInfo;
152 ConcurrentList<Handle*>& HandleHolder<T>::SmartHandle::GetChildren()
158 void HandleHolder<T>::SmartHandle::DetachFromHolders()
160 _holders.ForEach(ResetHolder);
165 void HandleHolder<T>::SmartHandle::DetachFromParent()
static Environment::EnvironmentFlags GetMode()
Return the Environment mode flags.
void * AnyPointer
Alias for the generic void pointer.