diff --git a/src/cairo-atomic-private.h b/src/cairo-atomic-private.h index 32cf58b63..d22d79e89 100644 --- a/src/cairo-atomic-private.h +++ b/src/cairo-atomic-private.h @@ -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