Win32: Implement init_once with InitOnceBeginInitialize / InitOnceComplete

This commit is contained in:
Luca Bacci 2025-06-16 18:50:13 +02:00
parent ec2e879e0d
commit ff4f2f4301

View file

@ -484,6 +484,36 @@ _cairo_atomic_ptr_cmpxchg_return_old_fallback(cairo_atomic_intptr_t *x, void *ol
(void) ret__; \ (void) ret__; \
} while (0) } 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; typedef cairo_atomic_int_t cairo_atomic_once_t;
#define CAIRO_ATOMIC_ONCE_UNINITIALIZED (0) #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)"); assert (0 && "incorrect use of _cairo_atomic_init_once API (once != CAIRO_ATOMIC_ONCE_INITIALIZING)");
} }
#endif /* !_WIN32 */
CAIRO_END_DECLS CAIRO_END_DECLS
#endif #endif