xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/libdruntime/gcc/gthread.d (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1627f7eb2Smrg // GNU D Compiler thread support for emulated TLS routines.
2*4c3eb207Smrg // Copyright (C) 2019-2020 Free Software Foundation, Inc.
3627f7eb2Smrg 
4627f7eb2Smrg // GCC is free software; you can redistribute it and/or modify it under
5627f7eb2Smrg // the terms of the GNU General Public License as published by the Free
6627f7eb2Smrg // Software Foundation; either version 3, or (at your option) any later
7627f7eb2Smrg // version.
8627f7eb2Smrg 
9627f7eb2Smrg // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
10627f7eb2Smrg // WARRANTY; without even the implied warranty of MERCHANTABILITY or
11627f7eb2Smrg // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12627f7eb2Smrg // for more details.
13627f7eb2Smrg 
14627f7eb2Smrg // Under Section 7 of GPL version 3, you are granted additional
15627f7eb2Smrg // permissions described in the GCC Runtime Library Exception, version
16627f7eb2Smrg // 3.1, as published by the Free Software Foundation.
17627f7eb2Smrg 
18627f7eb2Smrg // You should have received a copy of the GNU General Public License and
19627f7eb2Smrg // a copy of the GCC Runtime Library Exception along with this program;
20627f7eb2Smrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21627f7eb2Smrg // <http://www.gnu.org/licenses/>.
22627f7eb2Smrg 
23627f7eb2Smrg module gcc.gthread;
24627f7eb2Smrg import gcc.config;
25627f7eb2Smrg 
26627f7eb2Smrg extern (C) nothrow @nogc:
27627f7eb2Smrg 
28627f7eb2Smrg alias GthreadDestroyFn = extern (C) void function(void*);
29627f7eb2Smrg alias GthreadOnceFn = extern (C) void function();
30627f7eb2Smrg 
31627f7eb2Smrg static if (GNU_Thread_Model == ThreadModel.Posix)
32627f7eb2Smrg {
33627f7eb2Smrg     import core.sys.posix.pthread;
34627f7eb2Smrg 
35627f7eb2Smrg     alias __gthread_key_create = pthread_key_create;
36627f7eb2Smrg     alias __gthread_key_delete = pthread_key_delete;
37627f7eb2Smrg     alias __gthread_getspecific = pthread_getspecific;
38627f7eb2Smrg     alias __gthread_setspecific = pthread_setspecific;
39627f7eb2Smrg     alias __gthread_once = pthread_once;
40627f7eb2Smrg     alias __gthread_key_t = pthread_key_t;
41627f7eb2Smrg     alias __gthread_once_t = pthread_once_t;
42627f7eb2Smrg     enum GTHREAD_ONCE_INIT = PTHREAD_ONCE_INIT;
43627f7eb2Smrg 
44627f7eb2Smrg     // TODO: FreeBSD and Solaris exposes a dummy POSIX threads
45627f7eb2Smrg     // interface that will need to be handled here.
__gthread_active_p()46627f7eb2Smrg     extern (D) int __gthread_active_p()
47627f7eb2Smrg     {
48627f7eb2Smrg         return 1;
49627f7eb2Smrg     }
50627f7eb2Smrg }
51627f7eb2Smrg else static if (GNU_Thread_Model == ThreadModel.Single)
52627f7eb2Smrg {
53627f7eb2Smrg     alias __gthread_key_t = int;
54627f7eb2Smrg     alias __gthread_once_t = int;
55627f7eb2Smrg     enum GTHREAD_ONCE_INIT = 0;
56627f7eb2Smrg 
__gthread_key_create(__gthread_key_t *,GthreadDestroyFn)57627f7eb2Smrg     extern (D) int __gthread_key_create(__gthread_key_t*, GthreadDestroyFn)
58627f7eb2Smrg     {
59627f7eb2Smrg         return 0;
60627f7eb2Smrg     }
61627f7eb2Smrg 
__gthread_key_delete(__gthread_key_t)62627f7eb2Smrg     extern (D) int __gthread_key_delete(__gthread_key_t)
63627f7eb2Smrg     {
64627f7eb2Smrg         return 0;
65627f7eb2Smrg     }
66627f7eb2Smrg 
__gthread_getspecific(__gthread_key_t)67627f7eb2Smrg     extern (D) void* __gthread_getspecific(__gthread_key_t)
68627f7eb2Smrg     {
69627f7eb2Smrg         return null;
70627f7eb2Smrg     }
71627f7eb2Smrg 
__gthread_setspecific(__gthread_key_t,void *)72627f7eb2Smrg     extern (D) int __gthread_setspecific(__gthread_key_t, void*)
73627f7eb2Smrg     {
74627f7eb2Smrg         return 0;
75627f7eb2Smrg     }
76627f7eb2Smrg 
__gthread_once(__gthread_once_t *,GthreadOnceFn)77627f7eb2Smrg     extern (D) int __gthread_once(__gthread_once_t*, GthreadOnceFn)
78627f7eb2Smrg     {
79627f7eb2Smrg         return 0;
80627f7eb2Smrg     }
81627f7eb2Smrg 
__gthread_active_p()82627f7eb2Smrg     extern (D) int __gthread_active_p()
83627f7eb2Smrg     {
84627f7eb2Smrg         return 0;
85627f7eb2Smrg     }
86627f7eb2Smrg }
87627f7eb2Smrg else static if (GNU_Thread_Model == ThreadModel.Win32)
88627f7eb2Smrg {
89627f7eb2Smrg     struct __gthread_once_t
90627f7eb2Smrg     {
91627f7eb2Smrg         INT done;
92627f7eb2Smrg         LONG started;
93627f7eb2Smrg     }
94627f7eb2Smrg 
95627f7eb2Smrg     int __gthr_win32_key_create(__gthread_key_t* keyp, GthreadDestroyFn dtor);
96627f7eb2Smrg     int __gthr_win32_key_delete(__gthread_key_t key);
97627f7eb2Smrg     void* __gthr_win32_getspecific(__gthread_key_t key);
98627f7eb2Smrg     int __gthr_win32_setspecific(__gthread_key_t key, const void* ptr);
99627f7eb2Smrg     int __gthr_win32_once(__gthread_once_t* once, GthreadOnceFn);
100627f7eb2Smrg 
101627f7eb2Smrg     alias __gthread_key_create = __gthr_win32_key_create;
102627f7eb2Smrg     alias __gthread_key_delete = __gthr_win32_key_delete;
103627f7eb2Smrg     alias __gthread_getspecific = __gthr_win32_getspecific;
104627f7eb2Smrg     alias __gthread_setspecific = __gthr_win32_setspecific;
105627f7eb2Smrg     alias __gthread_once = __gthr_win32_once;
106627f7eb2Smrg     enum GTHREAD_ONCE_INIT = __gthread_once_t(0, -1);
107627f7eb2Smrg     alias __gthread_key_t = c_ulong;
108627f7eb2Smrg 
version(MinGW)109627f7eb2Smrg     version (MinGW)
110627f7eb2Smrg     {
111627f7eb2Smrg         // Mingw runtime >= v0.3 provides a magic variable that is set to nonzero
112627f7eb2Smrg         // if -mthreads option was specified, or 0 otherwise.
113627f7eb2Smrg         extern __gshared int _CRT_MT;
114627f7eb2Smrg     }
115627f7eb2Smrg 
__gthread_active_p()116627f7eb2Smrg     extern (D) int __gthread_active_p()
117627f7eb2Smrg     {
118627f7eb2Smrg         version (MinGW)
119627f7eb2Smrg             return _CRT_MT;
120627f7eb2Smrg         else
121627f7eb2Smrg             return 1;
122627f7eb2Smrg     }
123627f7eb2Smrg }
124627f7eb2Smrg else
125627f7eb2Smrg {
126627f7eb2Smrg     static assert(false, "Not implemented");
127627f7eb2Smrg }
128