xref: /dflybsd-src/contrib/grep/lib/glthread/threadlib.c (revision 91b9ed38d3db6a8a8ac5b66da1d43e6e331e259a)
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