|
|
1 | /* most win32 perls are beyond fixing, requiring dTHX */ |
|
|
2 | /* even for ISO-C functions such as malloc. avoid! avoid! avoid! */ |
|
|
3 | /* and fail to define numerous symbols, but still overrwide them */ |
|
|
4 | /* with non-working versions (e.g. setjmp). */ |
|
|
5 | #ifdef _WIN32 |
|
|
6 | /*# define PERL_CORE 1 fixes some, breaks others */ |
|
|
7 | #else |
1 | #define PERL_NO_GET_CONTEXT |
8 | # define PERL_NO_GET_CONTEXT |
|
|
9 | #endif |
2 | |
10 | |
3 | #include "EXTERN.h" |
11 | #include "EXTERN.h" |
4 | #include "perl.h" |
12 | #include "perl.h" |
5 | #include "XSUB.h" |
13 | #include "XSUB.h" |
6 | |
14 | |
… | |
… | |
10 | #include "perlmulticore.h" |
18 | #include "perlmulticore.h" |
11 | #include "schmorp.h" |
19 | #include "schmorp.h" |
12 | #include "xthread.h" |
20 | #include "xthread.h" |
13 | |
21 | |
14 | #ifdef _WIN32 |
22 | #ifdef _WIN32 |
15 | typedef char sigset_t; |
23 | #ifndef sigset_t |
16 | #define pthread_sigmask(mode,new,old) |
24 | #define sigset_t int |
|
|
25 | #endif |
17 | #endif |
26 | #endif |
18 | |
27 | |
19 | #ifndef SvREFCNT_dec_NN |
28 | #ifndef SvREFCNT_dec_NN |
20 | #define SvREFCNT_dec_NN(sv) SvREFCNT_dec (sv) |
29 | #define SvREFCNT_dec_NN(sv) SvREFCNT_dec (sv) |
21 | #endif |
30 | #endif |
… | |
… | |
193 | X_TLS_SET (current_key, 0); |
202 | X_TLS_SET (current_key, 0); |
194 | return; |
203 | return; |
195 | } |
204 | } |
196 | |
205 | |
197 | struct tctx *ctx = tctx_get (); |
206 | struct tctx *ctx = tctx_get (); |
198 | ctx->coro = SvREFCNT_inc_NN (CORO_CURRENT); |
207 | ctx->coro = SvREFCNT_inc_simple_NN (CORO_CURRENT); |
199 | ctx->wait_f = 0; |
208 | ctx->wait_f = 0; |
200 | |
209 | |
201 | X_TLS_SET (current_key, ctx); |
210 | X_TLS_SET (current_key, ctx); |
202 | pthread_sigmask (SIG_SETMASK, &fullsigset, &cursigset); |
211 | pthread_sigmask (SIG_SETMASK, &fullsigset, &cursigset); |
203 | |
212 | |
… | |
… | |
351 | |
360 | |
352 | void |
361 | void |
353 | sleep (NV seconds) |
362 | sleep (NV seconds) |
354 | CODE: |
363 | CODE: |
355 | perlinterp_release (); |
364 | perlinterp_release (); |
356 | usleep (seconds * 1e6); |
365 | { |
|
|
366 | int nsec = seconds; |
|
|
367 | if (nsec) sleep (nsec); |
|
|
368 | nsec = (seconds - nsec) * 1e9; |
|
|
369 | if (nsec) usleep (nsec); |
|
|
370 | } |
357 | perlinterp_acquire (); |
371 | perlinterp_acquire (); |
358 | |
372 | |