ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro-Multicore/xthread.h
(Generate patch)

Comparing Coro-Multicore/xthread.h (file contents):
Revision 1.1 by root, Sat Jun 27 17:59:10 2015 UTC vs.
Revision 1.6 by root, Mon Aug 13 10:22:49 2018 UTC

16///////////////////////////////////////////////////////////////////////////// 16/////////////////////////////////////////////////////////////////////////////
17 17
18#ifdef _WIN32 18#ifdef _WIN32
19 19
20//#define NTDDI_VERSION NTDDI_WIN2K // needed to get win2000 api calls, fails with mingw 20//#define NTDDI_VERSION NTDDI_WIN2K // needed to get win2000 api calls, fails with mingw
21#if _WIN32_WINNT < 0x400
21#define _WIN32_WINNT 0x400 // maybe working alternative for mingw 22# define _WIN32_WINNT 0x400 // maybe working alternative for mingw
23#endif
22#include <stdio.h>//D 24#include <stdio.h>//D
23#include <fcntl.h> 25#include <fcntl.h>
24#include <io.h> 26#include <io.h>
25#include <time.h> 27#include <time.h>
26#include <winsock2.h> 28#include <winsock2.h>
31#if defined(__MINGW32__) && defined(_TIMESPEC_DEFINED) 33#if defined(__MINGW32__) && defined(_TIMESPEC_DEFINED)
32#define HAVE_STRUCT_TIMESPEC 1 34#define HAVE_STRUCT_TIMESPEC 1
33#endif 35#endif
34 36
35#include <pthread.h> 37#include <pthread.h>
38#ifndef pthread_sigmask
36#define sigset_t int 39# define sigset_t int
37#define sigfillset(a) 40# define sigfillset(a)
38#define pthread_sigmask(a,b,c) 41# define pthread_sigmask(a,b,c)
39#define sigaddset(a,b) 42# define sigaddset(a,b)
40#define sigemptyset(s) 43# define sigemptyset(s)
44#endif
41 45
42typedef pthread_mutex_t xmutex_t; 46typedef pthread_mutex_t xmutex_t;
43#define X_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER 47#define X_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
44#define X_MUTEX_CREATE(mutex) pthread_mutex_init (&(mutex), 0) 48#define X_MUTEX_CREATE(mutex) pthread_mutex_init (&(mutex), 0)
45#define X_LOCK(mutex) pthread_mutex_lock (&(mutex)) 49#define X_LOCK(mutex) pthread_mutex_lock (&(mutex))
58 62
59static int 63static int
60xthread_create (xthread_t *tid, void *(*proc)(void *), void *arg) 64xthread_create (xthread_t *tid, void *(*proc)(void *), void *arg)
61{ 65{
62 int retval; 66 int retval;
67#if 0
63 pthread_attr_t attr; 68 pthread_attr_t attr;
64 69
65 pthread_attr_init (&attr); 70 pthread_attr_init (&attr);
66 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); 71 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
67 72
68 retval = pthread_create (tid, &attr, proc, arg) == 0; 73 retval = pthread_create (tid, &attr, proc, arg) == 0;
69 74
70 pthread_attr_destroy (&attr); 75 pthread_attr_destroy (&attr);
76#else
77 retval = pthread_create (tid, 0, proc, arg) == 0;
78
79 if (retval)
80 pthread_detach (*tid);
81#endif
71 82
72 return retval; 83 return retval;
73} 84}
74 85
75#define respipe_read(a,b,c) PerlSock_recv ((a), (b), (c), 0) 86#define respipe_read(a,b,c) PerlSock_recv ((a), (b), (c), 0)
144 sigset_t fullsigset, oldsigset; 155 sigset_t fullsigset, oldsigset;
145 pthread_attr_t attr; 156 pthread_attr_t attr;
146 157
147 pthread_attr_init (&attr); 158 pthread_attr_init (&attr);
148 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); 159 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
149#if X_STACKSIZE > 0
150 pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < X_STACKSIZE ? X_STACKSIZE : PTHREAD_STACK_MIN); 160 pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < X_STACKSIZE ? X_STACKSIZE : PTHREAD_STACK_MIN);
151#endif
152#ifdef PTHREAD_SCOPE_PROCESS 161#ifdef PTHREAD_SCOPE_PROCESS
153 pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS); 162 pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS);
154#endif 163#endif
155 164
156 sigfillset (&fullsigset); 165 sigfillset (&fullsigset);
168#define respipe_write(a,b,c) write ((a), (b), (c)) 177#define respipe_write(a,b,c) write ((a), (b), (c))
169#define respipe_close(a) close ((a)) 178#define respipe_close(a) close ((a))
170 179
171#endif 180#endif
172 181
182#if __linux && __GNUC__ >= 4 && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 3 && 0 /* also check arch */
183/* __thread has little to no advantage over pthread_* in most configurations, so this is not used */
184# define X_TLS_DECLARE(varname) __thread void *varname
185# define X_TLS_INIT(varname)
186# define X_TLS_SET(varname,value) varname = (value)
187# define X_TLS_GET(varname) varname
188#else
189# define X_TLS_DECLARE(varname) pthread_key_t varname
190# define X_TLS_INIT(varname) do { if (pthread_key_create (&(varname), 0)) abort (); } while (0)
191# define X_TLS_SET(varname,value) pthread_setspecific (varname, (value))
192# define X_TLS_GET(varname) pthread_getspecific (varname)
173#endif 193#endif
174 194
195#endif
196

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines