1/* Multithreading primitives.
2   Copyright (C) 2005-2022 Free Software Foundation, Inc.
3
4   This file is free software: you can redistribute it and/or modify
5   it under the terms of the GNU Lesser General Public License as
6   published by the Free Software Foundation; either version 2.1 of the
7   License, or (at your option) any later version.
8
9   This file is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public License
15   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
16
17/* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
18
19#include <config.h>
20
21/* ========================================================================= */
22
23#if USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS
24
25/* Use the POSIX threads library.  */
26
27# include <errno.h>
28# include <pthread.h>
29# include <stdlib.h>
30
31# if PTHREAD_IN_USE_DETECTION_HARD
32
33#  if defined __FreeBSD__ || defined __DragonFly__                 /* FreeBSD */
34
35/* Test using pthread_key_create.  */
36
37int
38glthread_in_use (void)
39{
40  static int tested;
41  static int result; /* 1: linked with -lpthread, 0: only with libc */
42
43  if (!tested)
44    {
45      pthread_key_t key;
46      int err = pthread_key_create (&key, NULL);
47
48      if (err == ENOSYS)
49        result = 0;
50      else
51        {
52          result = 1;
53          if (err == 0)
54            pthread_key_delete (key);
55        }
56      tested = 1;
57    }
58  return result;
59}
60
61#  else                                                     /* Solaris, HP-UX */
62
63/* Test using pthread_create.  */
64
65/* The function to be executed by a dummy thread.  */
66static void *
67dummy_thread_func (void *arg)
68{
69  return arg;
70}
71
72int
73glthread_in_use (void)
74{
75  static int tested;
76  static int result; /* 1: linked with -lpthread, 0: only with libc */
77
78  if (!tested)
79    {
80      pthread_t thread;
81
82      if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
83        /* Thread creation failed.  */
84        result = 0;
85      else
86        {
87          /* Thread creation works.  */
88          void *retval;
89          if (pthread_join (thread, &retval) != 0)
90            abort ();
91          result = 1;
92        }
93      tested = 1;
94    }
95  return result;
96}
97
98#  endif
99
100# endif
101
102#endif
103
104/* ========================================================================= */
105
106/* This declaration is solely to ensure that after preprocessing
107   this file is never empty.  */
108typedef int dummy;
109