mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-20 10:30:08 +01:00
Win32: Implement init_once with InitOnceBeginInitialize / InitOnceComplete
This commit is contained in:
parent
ec2e879e0d
commit
ff4f2f4301
1 changed files with 32 additions and 0 deletions
|
|
@ -484,6 +484,36 @@ _cairo_atomic_ptr_cmpxchg_return_old_fallback(cairo_atomic_intptr_t *x, void *ol
|
|||
(void) ret__; \
|
||||
} while (0)
|
||||
|
||||
#if defined (_WIN32)
|
||||
|
||||
typedef INIT_ONCE cairo_atomic_once_t;
|
||||
#define CAIRO_ATOMIC_ONCE_INIT INIT_ONCE_STATIC_INIT
|
||||
|
||||
static cairo_always_inline cairo_bool_t
|
||||
_cairo_atomic_init_once_enter(cairo_atomic_once_t *once)
|
||||
{
|
||||
BOOL pending;
|
||||
|
||||
if (unlikely (!InitOnceBeginInitialize (once, 0, &pending, NULL))) {
|
||||
assert (0 && "InitOnceBeginInitialize failed");
|
||||
}
|
||||
|
||||
if (likely (!pending))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cairo_always_inline void
|
||||
_cairo_atomic_init_once_leave(cairo_atomic_once_t *once)
|
||||
{
|
||||
if (unlikely (InitOnceComplete (once, 0, NULL))) {
|
||||
assert (0 && "InitOnceComplete failed");
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
typedef cairo_atomic_int_t cairo_atomic_once_t;
|
||||
|
||||
#define CAIRO_ATOMIC_ONCE_UNINITIALIZED (0)
|
||||
|
|
@ -515,6 +545,8 @@ _cairo_atomic_init_once_leave(cairo_atomic_once_t *once)
|
|||
assert (0 && "incorrect use of _cairo_atomic_init_once API (once != CAIRO_ATOMIC_ONCE_INITIALIZING)");
|
||||
}
|
||||
|
||||
#endif /* !_WIN32 */
|
||||
|
||||
CAIRO_END_DECLS
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue