summaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2015-10-07 15:15:14 +0200
committerLuca Barbato <lu_zero@gentoo.org>2015-10-07 18:45:50 +0200
commit2830bce47e2eb29c76202f19017031ddc1f95dd3 (patch)
treeba7906e526c5d36b4ef04fecbe70b43dabf46734 /compat
parentb22693b06d1e5d73454a65c203b4d31c1ca5b69a (diff)
w32pthreads: Load dynamically loaded functions on demand
This removes the requirement of calling w32thread_init before being able to use the threading primitives. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'compat')
-rw-r--r--compat/w32pthreads.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index a1cb396d6e..ac9a8142f4 100644
--- a/compat/w32pthreads.h
+++ b/compat/w32pthreads.h
@@ -160,6 +160,11 @@ static inline void pthread_cond_signal(pthread_cond_t *cond)
}
#else // _WIN32_WINNT < 0x0600
+
+/* atomic init state of dynamically loaded functions */
+static LONG w32thread_init_state = 0;
+static av_unused void w32thread_init(void);
+
/* for pre-Windows 6.0 platforms, define INIT_ONCE struct,
* compatible to the one used in the native API */
@@ -200,6 +205,8 @@ static inline void w32thread_once_fallback(LONG volatile *state, void (*init_rou
static av_unused int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
{
+ w32thread_once_fallback(&w32thread_init_state, w32thread_init);
+
/* Use native functions on Windows 6.0+ */
if (initonce_begin && initonce_complete) {
BOOL pending = FALSE;
@@ -236,6 +243,9 @@ static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
static av_unused void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
{
win32_cond_t *win32_cond = NULL;
+
+ w32thread_once_fallback(&w32thread_init_state, w32thread_init);
+
if (cond_init) {
cond_init(cond);
return;