>From 7435d61f26ef6dece4f94ea00972145b587ef7ab Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 20 Jun 2019 04:15:30 +0200 Subject: [PATCH 14/26] windows-tls: New module. * lib/windows-tls.h: New file, based on lib/glthread/tls.h. * lib/windows-tls.c: New file, based on lib/glthread/tls.h. * lib/glthread/tls.h: Include windows-tls.h. (gl_tls_key_t): Define using glwthread_tls_key_t. * modules/windows-tls: New file. * modules/tls (Depends-on): Add windows-tls. --- ChangeLog | 10 ++++++++++ lib/glthread/tls.h | 4 +++- lib/windows-tls.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/windows-tls.h | 40 ++++++++++++++++++++++++++++++++++++++ modules/tls | 1 + modules/windows-tls | 27 ++++++++++++++++++++++++++ 6 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 lib/windows-tls.c create mode 100644 lib/windows-tls.h create mode 100644 modules/windows-tls diff --git a/ChangeLog b/ChangeLog index 6307fcc..33262df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2019-06-20 Bruno Haible + windows-tls: New module. + * lib/windows-tls.h: New file, based on lib/glthread/tls.h. + * lib/windows-tls.c: New file, based on lib/glthread/tls.h. + * lib/glthread/tls.h: Include windows-tls.h. + (gl_tls_key_t): Define using glwthread_tls_key_t. + * modules/windows-tls: New file. + * modules/tls (Depends-on): Add windows-tls. + +2019-06-20 Bruno Haible + windows-cond: New module. * lib/windows-cond.h: New file, based on lib/glthread/cond.h. * lib/windows-cond.c: New file, based on lib/glthread/cond.c. diff --git a/lib/glthread/tls.h b/lib/glthread/tls.h index ab85409..7a74234 100644 --- a/lib/glthread/tls.h +++ b/lib/glthread/tls.h @@ -236,9 +236,11 @@ extern void *glthread_tls_get_multithreaded (thread_key_t key); # define WIN32_LEAN_AND_MEAN /* avoid including junk */ # include +# include "windows-tls.h" + /* ------------------------- gl_tls_key_t datatype ------------------------- */ -typedef DWORD gl_tls_key_t; +typedef glwthread_tls_key_t gl_tls_key_t; # define glthread_tls_key_init(KEY, DESTRUCTOR) \ /* The destructor is unsupported. */ \ ((*(KEY) = TlsAlloc ()) == (DWORD)-1 ? EAGAIN : ((void) (DESTRUCTOR), 0)) diff --git a/lib/windows-tls.c b/lib/windows-tls.c new file mode 100644 index 0000000..87aa454 --- /dev/null +++ b/lib/windows-tls.c @@ -0,0 +1,55 @@ +/* Thread-local storage (native Windows implementation). + Copyright (C) 2005-2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2005. */ + +#include + +/* Specification. */ +#include "windows-tls.h" + +int +glwthread_tls_key_create (glwthread_tls_key_t *keyp, void (*destructor) (void *)) +{ + /* TODO: The destructor is unsupported. */ + (void) destructor; + + if ((*keyp = TlsAlloc ()) == (DWORD)-1) + return EAGAIN; + return 0; +} + +void * +glwthread_tls_get (glwthread_tls_key_t key) +{ + return TlsGetValue (key); +} + +int +glwthread_tls_set (glwthread_tls_key_t key, void *value) +{ + if (!TlsSetValue (key, value)) + return EINVAL; + return 0; +} + +int +glwthread_tls_key_delete (glwthread_tls_key_t key) +{ + if (!TlsFree (key)) + return EINVAL; + return 0; +} diff --git a/lib/windows-tls.h b/lib/windows-tls.h new file mode 100644 index 0000000..5e79545 --- /dev/null +++ b/lib/windows-tls.h @@ -0,0 +1,40 @@ +/* Thread-local storage (native Windows implementation). + Copyright (C) 2005-2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible , 2005. */ + +#ifndef _WINDOWS_TLS_H +#define _WINDOWS_TLS_H + +#define WIN32_LEAN_AND_MEAN /* avoid including junk */ +#include + +typedef DWORD glwthread_tls_key_t; + +#ifdef __cplusplus +extern "C" { +#endif + +extern int glwthread_tls_key_create (glwthread_tls_key_t *keyp, void (*destructor) (void *)); +extern void *glwthread_tls_get (glwthread_tls_key_t key); +extern int glwthread_tls_set (glwthread_tls_key_t key, void *value); +extern int glwthread_tls_key_delete (glwthread_tls_key_t key); + +#ifdef __cplusplus +} +#endif + +#endif /* _WINDOWS_TLS_H */ diff --git a/modules/tls b/modules/tls index 5d61044..f4a5256 100644 --- a/modules/tls +++ b/modules/tls @@ -8,6 +8,7 @@ m4/tls.m4 Depends-on: threadlib +windows-tls [test $gl_threads_api = windows] configure.ac: gl_TLS diff --git a/modules/windows-tls b/modules/windows-tls new file mode 100644 index 0000000..32a32eb --- /dev/null +++ b/modules/windows-tls @@ -0,0 +1,27 @@ +Description: +Thread-local storage (native Windows implementation). + +Files: +lib/windows-tls.h +lib/windows-tls.c + +Depends-on: + +configure.ac: +AC_REQUIRE([AC_CANONICAL_HOST]) +case "$host_os" in + mingw*) + AC_LIBOBJ([windows-tls]) + ;; +esac + +Makefile.am: + +Include: +"windows-tls.h" + +License: +LGPLv2+ + +Maintainer: +all -- 2.7.4