1680a9cb8SJohn Marino /* Multithreading primitives.
2*09d4459fSDaniel Fojt Copyright (C) 2005-2020 Free Software Foundation, Inc.
3680a9cb8SJohn Marino
4680a9cb8SJohn Marino This program is free software; you can redistribute it and/or modify
5680a9cb8SJohn Marino it under the terms of the GNU General Public License as published by
6680a9cb8SJohn Marino the Free Software Foundation; either version 3, or (at your option)
7680a9cb8SJohn Marino any later version.
8680a9cb8SJohn Marino
9680a9cb8SJohn Marino This program is distributed in the hope that it will be useful,
10680a9cb8SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
11680a9cb8SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12680a9cb8SJohn Marino GNU General Public License for more details.
13680a9cb8SJohn Marino
14680a9cb8SJohn Marino You should have received a copy of the GNU General Public License
15*09d4459fSDaniel Fojt along with this program; if not, see <https://www.gnu.org/licenses/>. */
16680a9cb8SJohn Marino
17680a9cb8SJohn Marino /* Written by Bruno Haible <bruno@clisp.org>, 2005. */
18680a9cb8SJohn Marino
19680a9cb8SJohn Marino #include <config.h>
20680a9cb8SJohn Marino
21680a9cb8SJohn Marino /* ========================================================================= */
22680a9cb8SJohn Marino
23*09d4459fSDaniel Fojt #if USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS
24680a9cb8SJohn Marino
25680a9cb8SJohn Marino /* Use the POSIX threads library. */
26680a9cb8SJohn Marino
27680a9cb8SJohn Marino # include <pthread.h>
28680a9cb8SJohn Marino # include <stdlib.h>
29680a9cb8SJohn Marino
30680a9cb8SJohn Marino # if PTHREAD_IN_USE_DETECTION_HARD
31680a9cb8SJohn Marino
32680a9cb8SJohn Marino /* The function to be executed by a dummy thread. */
33680a9cb8SJohn Marino static void *
dummy_thread_func(void * arg)34680a9cb8SJohn Marino dummy_thread_func (void *arg)
35680a9cb8SJohn Marino {
36680a9cb8SJohn Marino return arg;
37680a9cb8SJohn Marino }
38680a9cb8SJohn Marino
39680a9cb8SJohn Marino int
glthread_in_use(void)40680a9cb8SJohn Marino glthread_in_use (void)
41680a9cb8SJohn Marino {
42680a9cb8SJohn Marino static int tested;
43680a9cb8SJohn Marino static int result; /* 1: linked with -lpthread, 0: only with libc */
44680a9cb8SJohn Marino
45680a9cb8SJohn Marino if (!tested)
46680a9cb8SJohn Marino {
47680a9cb8SJohn Marino pthread_t thread;
48680a9cb8SJohn Marino
49680a9cb8SJohn Marino if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
50680a9cb8SJohn Marino /* Thread creation failed. */
51680a9cb8SJohn Marino result = 0;
52680a9cb8SJohn Marino else
53680a9cb8SJohn Marino {
54680a9cb8SJohn Marino /* Thread creation works. */
55680a9cb8SJohn Marino void *retval;
56680a9cb8SJohn Marino if (pthread_join (thread, &retval) != 0)
57680a9cb8SJohn Marino abort ();
58680a9cb8SJohn Marino result = 1;
59680a9cb8SJohn Marino }
60680a9cb8SJohn Marino tested = 1;
61680a9cb8SJohn Marino }
62680a9cb8SJohn Marino return result;
63680a9cb8SJohn Marino }
64680a9cb8SJohn Marino
65680a9cb8SJohn Marino # endif
66680a9cb8SJohn Marino
67680a9cb8SJohn Marino #endif
68680a9cb8SJohn Marino
69680a9cb8SJohn Marino /* ========================================================================= */
70680a9cb8SJohn Marino
71680a9cb8SJohn Marino /* This declaration is solely to ensure that after preprocessing
72680a9cb8SJohn Marino this file is never empty. */
73680a9cb8SJohn Marino typedef int dummy;
74