diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-09-10 17:26:55 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-09-10 17:26:55 +0200 |
commit | a4dea80c2267f7fccbf62ae4ea3c45b0c7b2c90d (patch) | |
tree | 0d0d5d582f6b3a3fb56012d4849aa9daef6feeb4 /odb/details/win32/once.ixx | |
parent | 69848e3b70a078a5ba118f0a5ab08e1323954cb2 (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.ixx | 18 |
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 (); } } } |