// file : odb/details/win32/tls.txx // copyright : Copyright (c) 2009-2019 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #include #include namespace odb { namespace details { // tls // template win32_once_t tls::once_= WIN32_ONCE_INIT; template size_t tls::key_; template T& tls:: get () const { win32_once (once_, key_init); if (void* v = _get (key_)) return *static_cast (v); unique_ptr p (new T); _set (key_, p.get ()); T& r (*p); p.release (); return r; } template void tls:: free () { win32_once (once_, key_init); if (void* v = _get (key_)) { _set (key_, 0); delete static_cast (v); } } template void tls:: key_init () { key_ = _allocate (destructor); } template void tls:: destructor (void* v) { delete static_cast (v); } // tls // template win32_once_t tls::once_ = WIN32_ONCE_INIT; template size_t tls::key_; template T* tls:: get () const { win32_once (once_, key_init); return static_cast (_get (key_)); } template void tls:: set (T* p) { win32_once (once_, key_init); _set (key_, p); } template void tls:: key_init () { key_ = _allocate (0); } } }