summaryrefslogtreecommitdiff
path: root/lib/threads.in.h
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2019-06-20 04:17:30 +0200
committerBruno Haible <bruno@clisp.org>2019-06-20 04:25:34 +0200
commit80d24481060742c00cfe83a6a772db3856d1e7cb (patch)
tree4e28bea4d7bdaa4431b20db143a803b620ba7213 /lib/threads.in.h
parent0894f96f89e0e44bdf2921e6cd51fca429bf9802 (diff)
downloadgnulib-80d24481060742c00cfe83a6a772db3856d1e7cb.tar.gz
threads-h: New module.
* lib/threads.in.h: New file. * m4/threads.m4: New file. * m4/yield.m4 (gl_YIELD): Update comment. * modules/threads-h: New file. * modules/yields (configure.ac): Use AC_REQUIRE. * doc/posix-headers/threads.texi: Mention the new module and the AIX bugs.
Diffstat (limited to 'lib/threads.in.h')
-rw-r--r--lib/threads.in.h649
1 files changed, 649 insertions, 0 deletions
diff --git a/lib/threads.in.h b/lib/threads.in.h
new file mode 100644
index 0000000000..a18d64b4be
--- /dev/null
+++ b/lib/threads.in.h
@@ -0,0 +1,649 @@
+/* An ISO C 11 compatible <threads.h>.
+
+ Copyright (C) 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 2, 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 <https://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_THREADS_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_THREADS_H@
+# @INCLUDE_NEXT@ @NEXT_THREADS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_THREADS_H
+#define _@GUARD_PREFIX@_THREADS_H
+
+#if !@HAVE_THREADS_H@
+
+# include <time.h>
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# else
+/* Use POSIX threads. */
+
+# include <pthread.h>
+
+# endif
+
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _Noreturn is copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Storage class specifier for thread-local storage. */
+#ifdef _AIX
+/* The macro definition from AIX 7.1..7.2 <threads.h> is unusable, because
+ its expansion ends in a semicolon. */
+# undef thread_local
+#endif
+#if !@HAVE_THREADS_H@ || !defined thread_local
+# define thread_local _Thread_local
+#endif
+
+
+/* =========== ISO C 11 7.26.5 Thread functions =========== */
+
+#if !@HAVE_THREADS_H@
+
+/* Return codes. */
+enum
+{
+ thrd_success = 0,
+ thrd_timedout = 1,
+ thrd_busy = 2,
+ thrd_nomem = 3,
+ thrd_error = 4
+};
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# include "windows-thread.h"
+
+typedef glwthread_thread_t thrd_t;
+
+# else
+/* Use POSIX threads. */
+
+typedef pthread_t thrd_t;
+
+# endif
+
+#endif
+
+#if @BROKEN_THRD_START_T@
+/* Need to override thrd_start_t, to make thrd_create work. */
+# define thrd_start_t rpl_thrd_start_t
+/* Need to override thrd_t, to make thrd_join work. */
+struct thrd_with_exitcode
+{
+ thrd_t volatile tid;
+ int volatile detached;
+ int volatile exitcode;
+};
+typedef struct thrd_with_exitcode *rpl_thrd_t;
+# define thrd_t rpl_thrd_t
+#endif
+/* Type of the main function of a thread. */
+#if !@HAVE_THREADS_H@ || @BROKEN_THRD_START_T@
+typedef int (* thrd_start_t) (void *);
+#endif
+
+#if @GNULIB_THRD@
+# if @REPLACE_THRD_CREATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define thrd_create rpl_thrd_create
+# endif
+_GL_FUNCDECL_RPL (thrd_create, int, (thrd_t *, thrd_start_t, void *)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (thrd_create, int, (thrd_t *, thrd_start_t, void *));
+# else
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_create, int, (thrd_t *, thrd_start_t, void *)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (thrd_create, int, (thrd_t *, thrd_start_t, void *));
+# endif
+_GL_CXXALIASWARN (thrd_create);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_create
+# if HAVE_RAW_DECL_THRD_CREATE
+_GL_WARN_ON_USE (thrd_create, "thrd_create is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if @REPLACE_THRD_CURRENT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define thrd_current rpl_thrd_current
+# endif
+_GL_FUNCDECL_RPL (thrd_current, thrd_t, (void) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (thrd_current, thrd_t, (void));
+# else
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_current, thrd_t, (void) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (thrd_current, thrd_t, (void));
+# endif
+_GL_CXXALIASWARN (thrd_current);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_current
+# if HAVE_RAW_DECL_THRD_CURRENT
+_GL_WARN_ON_USE (thrd_current, "thrd_current is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if @REPLACE_THRD_EQUAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define thrd_equal rpl_thrd_equal
+# endif
+_GL_FUNCDECL_RPL (thrd_equal, int, (thrd_t, thrd_t) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (thrd_equal, int, (thrd_t, thrd_t));
+# else
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_equal, int, (thrd_t, thrd_t) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (thrd_equal, int, (thrd_t, thrd_t));
+# endif
+_GL_CXXALIASWARN (thrd_equal);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_equal
+# if HAVE_RAW_DECL_THRD_EQUAL
+_GL_WARN_ON_USE (thrd_equal, "thrd_equal is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_sleep, int,
+ (const struct timespec *, struct timespec *)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (thrd_sleep, int,
+ (const struct timespec *, struct timespec *));
+_GL_CXXALIASWARN (thrd_sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_sleep
+# if HAVE_RAW_DECL_THRD_SLEEP
+_GL_WARN_ON_USE (thrd_sleep, "thrd_sleep is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_yield, void, (void));
+# endif
+_GL_CXXALIAS_SYS (thrd_yield, void, (void));
+_GL_CXXALIASWARN (thrd_yield);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_yield
+# if HAVE_RAW_DECL_THRD_YIELD
+_GL_WARN_ON_USE (thrd_yield, "thrd_yield is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if @REPLACE_THRD_DETACH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define thrd_detach rpl_thrd_detach
+# endif
+_GL_FUNCDECL_RPL (thrd_detach, int, (thrd_t));
+_GL_CXXALIAS_RPL (thrd_detach, int, (thrd_t));
+# else
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_detach, int, (thrd_t));
+# endif
+_GL_CXXALIAS_SYS (thrd_detach, int, (thrd_t));
+# endif
+_GL_CXXALIASWARN (thrd_detach);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_detach
+# if HAVE_RAW_DECL_THRD_DETACH
+_GL_WARN_ON_USE (thrd_detach, "thrd_detach is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if @REPLACE_THRD_JOIN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define thrd_join rpl_thrd_join
+# endif
+_GL_FUNCDECL_RPL (thrd_join, int, (thrd_t, int *));
+_GL_CXXALIAS_RPL (thrd_join, int, (thrd_t, int *));
+# else
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_join, int, (thrd_t, int *));
+# endif
+_GL_CXXALIAS_SYS (thrd_join, int, (thrd_t, int *));
+# endif
+_GL_CXXALIASWARN (thrd_join);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_join
+# if HAVE_RAW_DECL_THRD_JOIN
+_GL_WARN_ON_USE (thrd_join, "thrd_join is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+#if @GNULIB_THRD@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (thrd_exit, _Noreturn void, (int));
+# endif
+_GL_CXXALIAS_SYS (thrd_exit, _Noreturn void, (int));
+_GL_CXXALIASWARN (thrd_exit);
+#elif defined GNULIB_POSIXCHECK
+# undef thrd_exit
+# if HAVE_RAW_DECL_THRD_EXIT
+_GL_WARN_ON_USE (thrd_exit, "thrd_exit is unportable - "
+ "use gnulib module thrd for portability");
+# endif
+#endif
+
+
+/* =========== ISO C 11 7.26.4 Mutex functions =========== */
+
+#if !@HAVE_THREADS_H@
+
+/* Types of mutexes. */
+enum
+{
+ mtx_plain = 0,
+ mtx_timed = 1,
+ mtx_recursive = 2
+};
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# include "windows-mutex.h"
+# include "windows-recmutex.h"
+# include "windows-timedmutex.h"
+# include "windows-timedrecmutex.h"
+
+typedef struct
+ {
+ int type;
+ union
+ {
+ glwthread_mutex_t u_mutex;
+ glwthread_recmutex_t u_recmutex;
+ glwthread_timedmutex_t u_timedmutex;
+ glwthread_timedrecmutex_t u_timedrecmutex;
+ }
+ u;
+ }
+ mtx_t;
+
+# else
+/* Use POSIX threads. */
+
+typedef pthread_mutex_t mtx_t;
+
+# endif
+
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_init, int, (mtx_t *, int) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mtx_init, int, (mtx_t *, int));
+_GL_CXXALIASWARN (mtx_init);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_init
+# if HAVE_RAW_DECL_MTX_INIT
+_GL_WARN_ON_USE (mtx_init, "mtx_init is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_lock, int, (mtx_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mtx_lock, int, (mtx_t *));
+_GL_CXXALIASWARN (mtx_lock);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_lock
+# if HAVE_RAW_DECL_MTX_LOCK
+_GL_WARN_ON_USE (mtx_lock, "mtx_lock is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_trylock, int, (mtx_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mtx_trylock, int, (mtx_t *));
+_GL_CXXALIASWARN (mtx_trylock);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_trylock
+# if HAVE_RAW_DECL_MTX_TRYLOCK
+_GL_WARN_ON_USE (mtx_trylock, "mtx_trylock is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_timedlock, int, (mtx_t *, const struct timespec *)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mtx_timedlock, int, (mtx_t *, const struct timespec *));
+_GL_CXXALIASWARN (mtx_timedlock);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_timedlock
+# if HAVE_RAW_DECL_MTX_TIMEDLOCK
+_GL_WARN_ON_USE (mtx_timedlock, "mtx_timedlock is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_unlock, int, (mtx_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mtx_unlock, int, (mtx_t *));
+_GL_CXXALIASWARN (mtx_unlock);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_unlock
+# if HAVE_RAW_DECL_MTX_UNLOCK
+_GL_WARN_ON_USE (mtx_unlock, "mtx_unlock is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (mtx_destroy, void, (mtx_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mtx_destroy, void, (mtx_t *));
+_GL_CXXALIASWARN (mtx_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef mtx_destroy
+# if HAVE_RAW_DECL_MTX_DESTROY
+_GL_WARN_ON_USE (mtx_destroy, "mtx_destroy is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+
+/* =========== ISO C 11 7.26.2 Initialization functions =========== */
+
+#if !@HAVE_THREADS_H@
+
+/* Type that contains a flag for use by call_once. */
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# include "windows-once.h"
+
+typedef glwthread_once_t once_flag;
+# define ONCE_FLAG_INIT GLWTHREAD_ONCE_INIT
+
+# else
+/* Use POSIX threads. */
+
+typedef pthread_once_t once_flag;
+# define ONCE_FLAG_INIT PTHREAD_ONCE_INIT
+
+# endif
+
+#endif
+
+#if @GNULIB_MTX@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (call_once, void, (once_flag *, void (*) (void))
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (call_once, void, (once_flag *, void (*) (void)));
+_GL_CXXALIASWARN (call_once);
+#elif defined GNULIB_POSIXCHECK
+# undef call_once
+# if HAVE_RAW_DECL_CALL_ONCE
+_GL_WARN_ON_USE (call_once, "call_once is unportable - "
+ "use gnulib module mtx for portability");
+# endif
+#endif
+
+
+/* =========== ISO C 11 7.26.3 Condition variable functions =========== */
+
+#if !@HAVE_THREADS_H@
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# include "windows-cond.h"
+
+typedef glwthread_cond_t cnd_t;
+
+# else
+/* Use POSIX threads. */
+
+typedef pthread_cond_t cnd_t;
+
+# endif
+
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_init, int, (cnd_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (cnd_init, int, (cnd_t *));
+_GL_CXXALIASWARN (cnd_init);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_init
+# if HAVE_RAW_DECL_CND_INIT
+_GL_WARN_ON_USE (cnd_init, "cnd_init is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_wait, int, (cnd_t *, mtx_t *) _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (cnd_wait, int, (cnd_t *, mtx_t *));
+_GL_CXXALIASWARN (cnd_wait);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_wait
+# if HAVE_RAW_DECL_CND_WAIT
+_GL_WARN_ON_USE (cnd_wait, "cnd_wait is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_timedwait, int,
+ (cnd_t *, mtx_t *, const struct timespec *)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (cnd_timedwait, int,
+ (cnd_t *, mtx_t *, const struct timespec *));
+_GL_CXXALIASWARN (cnd_timedwait);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_timedwait
+# if HAVE_RAW_DECL_CND_TIMEDWAIT
+_GL_WARN_ON_USE (cnd_timedwait, "cnd_timedwait is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_signal, int, (cnd_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (cnd_signal, int, (cnd_t *));
+_GL_CXXALIASWARN (cnd_signal);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_signal
+# if HAVE_RAW_DECL_CND_SIGNAL
+_GL_WARN_ON_USE (cnd_signal, "cnd_signal is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_broadcast, int, (cnd_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (cnd_broadcast, int, (cnd_t *));
+_GL_CXXALIASWARN (cnd_broadcast);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_broadcast
+# if HAVE_RAW_DECL_CND_BROADCAST
+_GL_WARN_ON_USE (cnd_broadcast, "cnd_broadcast is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+#if @GNULIB_CND@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (cnd_destroy, void, (cnd_t *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (cnd_destroy, void, (cnd_t *));
+_GL_CXXALIASWARN (cnd_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef cnd_destroy
+# if HAVE_RAW_DECL_CND_DESTROY
+_GL_WARN_ON_USE (cnd_destroy, "cnd_destroy is unportable - "
+ "use gnulib module cnd for portability");
+# endif
+#endif
+
+
+/* =========== ISO C 11 7.26.6 Thread-specific storage functions =========== */
+
+#if !@HAVE_THREADS_H@
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Use Windows threads. */
+
+# include "windows-tls.h"
+
+typedef glwthread_tls_key_t tss_t;
+# define TSS_DTOR_ITERATIONS 0 /* Destructors are currently unsupported. */
+
+# else
+/* Use POSIX threads. */
+
+# include <limits.h>
+
+typedef pthread_key_t tss_t;
+
+# endif
+
+/* Type for the destructor of a thread-specific storage pointer. */
+typedef void (*tss_dtor_t) (void *);
+
+#endif
+
+/* AIX 7.1 <threads.h> does not define TSS_DTOR_ITERATIONS. */
+#ifndef TSS_DTOR_ITERATIONS
+# ifdef PTHREAD_DESTRUCTOR_ITERATIONS
+# define TSS_DTOR_ITERATIONS PTHREAD_DESTRUCTOR_ITERATIONS
+# else
+ /* IRIX 6.5 does not define PTHREAD_DESTRUCTOR_ITERATIONS.
+ This value is a wild guess. */
+# define TSS_DTOR_ITERATIONS 1
+# endif
+#endif
+
+#if @GNULIB_TSS@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (tss_create, int, (tss_t *, tss_dtor_t) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (tss_create, int, (tss_t *, tss_dtor_t));
+_GL_CXXALIASWARN (tss_create);
+#elif defined GNULIB_POSIXCHECK
+# undef tss_create
+# if HAVE_RAW_DECL_TSS_CREATE
+_GL_WARN_ON_USE (tss_create, "tss_create is unportable - "
+ "use gnulib module tss for portability");
+# endif
+#endif
+
+#if @GNULIB_TSS@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (tss_set, int, (tss_t, void *));
+# endif
+_GL_CXXALIAS_SYS (tss_set, int, (tss_t, void *));
+_GL_CXXALIASWARN (tss_set);
+#elif defined GNULIB_POSIXCHECK
+# undef tss_set
+# if HAVE_RAW_DECL_TSS_SET
+_GL_WARN_ON_USE (tss_set, "tss_set is unportable - "
+ "use gnulib module tss for portability");
+# endif
+#endif
+
+#if @GNULIB_TSS@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (tss_get, void *, (tss_t));
+# endif
+_GL_CXXALIAS_SYS (tss_get, void *, (tss_t));
+_GL_CXXALIASWARN (tss_get);
+#elif defined GNULIB_POSIXCHECK
+# undef tss_get
+# if HAVE_RAW_DECL_TSS_GET
+_GL_WARN_ON_USE (tss_get, "tss_get is unportable - "
+ "use gnulib module tss for portability");
+# endif
+#endif
+
+#if @GNULIB_TSS@
+# if !@HAVE_THREADS_H@
+_GL_FUNCDECL_SYS (tss_delete, void, (tss_t));
+# endif
+_GL_CXXALIAS_SYS (tss_delete, void, (tss_t));
+_GL_CXXALIASWARN (tss_delete);
+#elif defined GNULIB_POSIXCHECK
+# undef tss_delete
+# if HAVE_RAW_DECL_TSS_DELETE
+_GL_WARN_ON_USE (tss_delete, "tss_delete is unportable - "
+ "use gnulib module tss for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_THREADS_H */
+#endif /* _@GUARD_PREFIX@_THREADS_H */