1 /* Yielding the processor to other threads and processes.
2 Copyright (C) 2005-2021 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 /* This file contains a primitive for yielding the processor to other threads.
18 extern void gl_thread_yield (void);
19 */
20
21 #ifndef _GLTHREAD_YIELD_H
22 #define _GLTHREAD_YIELD_H
23
24 #include <errno.h>
25
26 /* ========================================================================= */
27
28 #if USE_ISOC_THREADS || USE_ISOC_AND_POSIX_THREADS
29
30 /* Use the ISO C threads library. */
31
32 # include <threads.h>
33
34 # ifdef __cplusplus
35 extern "C" {
36 # endif
37
38 # define gl_thread_yield() \
39 thrd_yield ()
40
41 # ifdef __cplusplus
42 }
43 # endif
44
45 #endif
46
47 /* ========================================================================= */
48
49 #if USE_POSIX_THREADS
50
51 /* Use the POSIX threads library. */
52
53 # include <sched.h>
54
55 # ifdef __cplusplus
56 extern "C" {
57 # endif
58
59 # define gl_thread_yield() \
60 sched_yield ()
61
62 # ifdef __cplusplus
63 }
64 # endif
65
66 #endif
67
68 /* ========================================================================= */
69
70 #if USE_WINDOWS_THREADS
71
72 # define WIN32_LEAN_AND_MEAN /* avoid including junk */
73 # include <windows.h>
74
75 # ifdef __cplusplus
76 extern "C" {
77 # endif
78
79 # define gl_thread_yield() \
80 Sleep (0)
81
82 # ifdef __cplusplus
83 }
84 # endif
85
86 #endif
87
88 /* ========================================================================= */
89
90 #if !(USE_ISOC_THREADS || USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS || USE_WINDOWS_THREADS)
91
92 /* Provide dummy implementation if threads are not supported. */
93
94 # define gl_thread_yield() 0
95
96 #endif
97
98 /* ========================================================================= */
99
100 #endif /* _GLTHREAD_YIELD_H */