aboutsummaryrefslogtreecommitdiff
path: root/odb/details/win32/once.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-09-10 17:26:55 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-09-10 17:26:55 +0200
commita4dea80c2267f7fccbf62ae4ea3c45b0c7b2c90d (patch)
tree0d0d5d582f6b3a3fb56012d4849aa9daef6feeb4 /odb/details/win32/once.ixx
parent69848e3b70a078a5ba118f0a5ab08e1323954cb2 (diff)
Add low-level once API that is static initialization-safe
Diffstat (limited to 'odb/details/win32/once.ixx')
-rw-r--r--odb/details/win32/once.ixx18
1 files changed, 16 insertions, 2 deletions
diff --git a/odb/details/win32/once.ixx b/odb/details/win32/once.ixx
index 9f1706d..de46371 100644
--- a/odb/details/win32/once.ixx
+++ b/odb/details/win32/once.ixx
@@ -9,6 +9,19 @@ namespace odb
{
namespace details
{
+ inline void
+ win32_once (win32_once_t& o, void (*func) ())
+ {
+ win32_lock l (win32_once_cs_);
+
+ if (o == 0)
+ {
+ o = 1;
+ l.unlock ();
+ func ();
+ }
+ }
+
inline once::
once ()
: called_ (false)
@@ -18,12 +31,13 @@ namespace odb
inline void once::
call (void (*func) ())
{
- win32_lock l (cs_);
+ win32_lock l (win32_once_cs_);
if (!called_)
{
- func ();
called_ = true;
+ l.unlock ();
+ func ();
}
}
}