From 26e36b3a9d7b49d46ecfa69b447482251acba8ac Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 24 Jan 2024 16:53:38 +0300 Subject: Turn libodb repository into package for muti-package repository --- libodb/odb/details/win32/tls.txx | 94 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 libodb/odb/details/win32/tls.txx (limited to 'libodb/odb/details/win32/tls.txx') diff --git a/libodb/odb/details/win32/tls.txx b/libodb/odb/details/win32/tls.txx new file mode 100644 index 0000000..96bed4c --- /dev/null +++ b/libodb/odb/details/win32/tls.txx @@ -0,0 +1,94 @@ +// file : odb/details/win32/tls.txx +// 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); + } + } +} -- cgit v1.1