Fixing a Perl_my_dirfd() related test failure.
[p5sagit/p5-mst-13.2.git] / ext / Thread / Thread.xs
CommitLineData
c5be433b 1#define PERL_NO_GET_CONTEXT
d9bb3666 2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5
f0f333f4 6#ifdef __cplusplus
7#ifdef I_UNISTD
8#include <unistd.h>
9#endif
10#endif
11#include <fcntl.h>
12
85ced67f 13static int sig_pipe[2];
f0f333f4 14
15#ifndef THREAD_RET_TYPE
f0f333f4 16#define THREAD_RET_TYPE void *
17#define THREAD_RET_CAST(x) ((THREAD_RET_TYPE) x)
458fb581 18#endif
683929b4 19
7d901afa 20static void
54fb45e2 21remove_thread(pTHX_ Thread t)
7d901afa 22{
7d901afa 23}
24
ea0efc06 25static THREAD_RET_TYPE
f0f333f4 26threadstart(void *arg)
d9bb3666 27{
f0f333f4 28 return THREAD_RET_CAST(NULL);
d9bb3666 29}
30
683929b4 31static SV *
cea2e8a9 32newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
d9bb3666 33{
3db8f154 34#ifdef USE_ITHREADS
948a8a50 35 croak("This perl was built for \"ithreads\", which currently does not support Thread.pm.\n"
36 "Run \"perldoc Thread\" for more information");
3db8f154 37#else
948a8a50 38 croak("This perl was not built with support for 5.005-style threads.\n"
39 "Run \"perldoc Thread\" for more information");
f0f333f4 40#endif
3db8f154 41 return &PL_sv_undef;
d9bb3666 42}
43
20ce7b12 44static Signal_t handle_thread_signal (int sig);
f0f333f4 45
f152979c 46static Signal_t
f0f333f4 47handle_thread_signal(int sig)
f152979c 48{
3aeed370 49 unsigned char c = (unsigned char) sig;
e8fcfee6 50 dTHX;
3aeed370 51 /*
52 * We're not really allowed to call fprintf in a signal handler
53 * so don't be surprised if this isn't robust while debugging
54 * with -DL.
55 */
bf49b057 56 DEBUG_S(PerlIO_printf(Perl_debug_log,
a835d317 57 "handle_thread_signal: got signal %d\n", sig));
3aeed370 58 write(sig_pipe[1], &c, 1);
f152979c 59}
60
d9bb3666 61MODULE = Thread PACKAGE = Thread
0b9678a8 62PROTOTYPES: DISABLE
d9bb3666 63
683929b4 64void
458fb581 65new(classname, startsv, ...)
66 char * classname
d9bb3666 67 SV * startsv
734689b1 68 AV * av = av_make(items - 2, &ST(2));
683929b4 69 PPCODE:
cea2e8a9 70 XPUSHs(sv_2mortal(newthread(aTHX_ startsv, av, classname)));
d9bb3666 71
72void
d9bb3666 73join(t)
74 Thread t
c5661c80 75 PREINIT:
76#ifdef USE_5005THREADS
77 AV * av;
78 int i;
79#endif
d9bb3666 80 PPCODE:
d9bb3666 81
82void
734689b1 83detach(t)
d9bb3666 84 Thread t
85 CODE:
d9bb3666 86
87void
7d901afa 88equal(t1, t2)
89 Thread t1
90 Thread t2
91 PPCODE:
6b88bc9c 92 PUSHs((t1 == t2) ? &PL_sv_yes : &PL_sv_no);
7d901afa 93
94void
95flags(t)
96 Thread t
97 PPCODE:
7d901afa 98
99void
8dcd6f7b 100done(t)
101 Thread t
102 PPCODE:
8dcd6f7b 103
104void
458fb581 105self(classname)
106 char * classname
7d901afa 107 PREINIT:
c5661c80 108#ifdef USE_5005THREADS
7d901afa 109 SV *sv;
c5661c80 110#endif
f0f333f4 111 PPCODE:
7d901afa 112
50112d62 113U32
114tid(t)
115 Thread t
116 CODE:
f0f333f4 117 RETVAL = 0;
50112d62 118 OUTPUT:
119 RETVAL
120
121void
122DESTROY(t)
123 SV * t
124 PPCODE:
05c1ce25 125 PUSHs(t ? &PL_sv_yes : &PL_sv_no);
50112d62 126
7d901afa 127void
734689b1 128yield()
d9bb3666 129 CODE:
d9bb3666 130
131void
734689b1 132cond_wait(sv)
133 SV * sv
f0f333f4 134CODE:
f0f333f4 135
734689b1 136void
137cond_signal(sv)
138 SV * sv
734689b1 139CODE:
d9bb3666 140
734689b1 141void
142cond_broadcast(sv)
143 SV * sv
f0f333f4 144CODE:
f152979c 145
7d901afa 146void
458fb581 147list(classname)
148 char * classname
7d901afa 149 PPCODE:
7d901afa 150
151
f152979c 152MODULE = Thread PACKAGE = Thread::Signal
153
154void
155kill_sighandler_thread()
156 PPCODE:
3aeed370 157 write(sig_pipe[1], "\0", 1);
6b88bc9c 158 PUSHs(&PL_sv_yes);
f152979c 159
160void
161init_thread_signals()
162 PPCODE:
533c011a 163 PL_sighandlerp = handle_thread_signal;
f152979c 164 if (pipe(sig_pipe) == -1)
165 XSRETURN_UNDEF;
6b88bc9c 166 PUSHs(&PL_sv_yes);
f152979c 167
3aeed370 168void
f152979c 169await_signal()
170 PREINIT:
3aeed370 171 unsigned char c;
ea0efc06 172 SSize_t ret;
f152979c 173 CODE:
174 do {
3aeed370 175 ret = read(sig_pipe[0], &c, 1);
f152979c 176 } while (ret == -1 && errno == EINTR);
177 if (ret == -1)
178 croak("panic: await_signal");
3aeed370 179 ST(0) = sv_newmortal();
180 if (ret)
22c35a8c 181 sv_setsv(ST(0), c ? PL_psig_ptr[c] : &PL_sv_no);
bf49b057 182 DEBUG_S(PerlIO_printf(Perl_debug_log,
a835d317 183 "await_signal returning %s\n", SvPEEK(ST(0))));
4e35701f 184
458fb581 185MODULE = Thread PACKAGE = Thread::Specific
186
187void
188data(classname = "Thread::Specific")
189 char * classname
190 PPCODE: