Commit | Line | Data |
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 |
13 | static 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 |
20 | static void |
54fb45e2 |
21 | remove_thread(pTHX_ Thread t) |
7d901afa |
22 | { |
7d901afa |
23 | } |
24 | |
ea0efc06 |
25 | static THREAD_RET_TYPE |
f0f333f4 |
26 | threadstart(void *arg) |
d9bb3666 |
27 | { |
f0f333f4 |
28 | return THREAD_RET_CAST(NULL); |
d9bb3666 |
29 | } |
30 | |
683929b4 |
31 | static SV * |
cea2e8a9 |
32 | newthread (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 |
44 | static Signal_t handle_thread_signal (int sig); |
f0f333f4 |
45 | |
f152979c |
46 | static Signal_t |
f0f333f4 |
47 | handle_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 |
61 | MODULE = Thread PACKAGE = Thread |
0b9678a8 |
62 | PROTOTYPES: DISABLE |
d9bb3666 |
63 | |
683929b4 |
64 | void |
458fb581 |
65 | new(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 | |
72 | void |
d9bb3666 |
73 | join(t) |
74 | Thread t |
c5661c80 |
75 | PREINIT: |
76 | #ifdef USE_5005THREADS |
77 | AV * av; |
78 | int i; |
79 | #endif |
d9bb3666 |
80 | PPCODE: |
d9bb3666 |
81 | |
82 | void |
734689b1 |
83 | detach(t) |
d9bb3666 |
84 | Thread t |
85 | CODE: |
d9bb3666 |
86 | |
87 | void |
7d901afa |
88 | equal(t1, t2) |
89 | Thread t1 |
90 | Thread t2 |
91 | PPCODE: |
6b88bc9c |
92 | PUSHs((t1 == t2) ? &PL_sv_yes : &PL_sv_no); |
7d901afa |
93 | |
94 | void |
95 | flags(t) |
96 | Thread t |
97 | PPCODE: |
7d901afa |
98 | |
99 | void |
8dcd6f7b |
100 | done(t) |
101 | Thread t |
102 | PPCODE: |
8dcd6f7b |
103 | |
104 | void |
458fb581 |
105 | self(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 |
113 | U32 |
114 | tid(t) |
115 | Thread t |
116 | CODE: |
f0f333f4 |
117 | RETVAL = 0; |
50112d62 |
118 | OUTPUT: |
119 | RETVAL |
120 | |
121 | void |
122 | DESTROY(t) |
123 | SV * t |
124 | PPCODE: |
05c1ce25 |
125 | PUSHs(t ? &PL_sv_yes : &PL_sv_no); |
50112d62 |
126 | |
7d901afa |
127 | void |
734689b1 |
128 | yield() |
d9bb3666 |
129 | CODE: |
d9bb3666 |
130 | |
131 | void |
734689b1 |
132 | cond_wait(sv) |
133 | SV * sv |
f0f333f4 |
134 | CODE: |
f0f333f4 |
135 | |
734689b1 |
136 | void |
137 | cond_signal(sv) |
138 | SV * sv |
734689b1 |
139 | CODE: |
d9bb3666 |
140 | |
734689b1 |
141 | void |
142 | cond_broadcast(sv) |
143 | SV * sv |
f0f333f4 |
144 | CODE: |
f152979c |
145 | |
7d901afa |
146 | void |
458fb581 |
147 | list(classname) |
148 | char * classname |
7d901afa |
149 | PPCODE: |
7d901afa |
150 | |
151 | |
f152979c |
152 | MODULE = Thread PACKAGE = Thread::Signal |
153 | |
154 | void |
155 | kill_sighandler_thread() |
156 | PPCODE: |
3aeed370 |
157 | write(sig_pipe[1], "\0", 1); |
6b88bc9c |
158 | PUSHs(&PL_sv_yes); |
f152979c |
159 | |
160 | void |
161 | init_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 |
168 | void |
f152979c |
169 | await_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 |
185 | MODULE = Thread PACKAGE = Thread::Specific |
186 | |
187 | void |
188 | data(classname = "Thread::Specific") |
189 | char * classname |
190 | PPCODE: |