… | |
… | |
93 | L<EV> or L<AnyEvent>). This, of course, incurs the overhead of a C<read> |
93 | L<EV> or L<AnyEvent>). This, of course, incurs the overhead of a C<read> |
94 | and C<write> syscall. |
94 | and C<write> syscall. |
95 | |
95 | |
96 | =head1 USAGE EXAMPLES |
96 | =head1 USAGE EXAMPLES |
97 | |
97 | |
98 | =head2 Async::Interrupt to implement race-free signal handling |
98 | =head2 Implementing race-free signal handling |
99 | |
99 | |
100 | This example uses a single event pipe for all signals, and one |
100 | This example uses a single event pipe for all signals, and one |
101 | Async::Interrupt per signal. |
101 | Async::Interrupt per signal. This code is actually what the L<AnyEvent> |
|
|
102 | module uses itself when Async::Interrupt is available. |
102 | |
103 | |
103 | First, create the event pipe and hook it into the event loop (this code is |
104 | First, create the event pipe and hook it into the event loop |
104 | actually what L<AnyEvent> uses itself): |
|
|
105 | |
105 | |
106 | $SIGPIPE = new Async::Interrupt::EventPipe; |
106 | $SIGPIPE = new Async::Interrupt::EventPipe; |
107 | $SIGPIPE_W = AnyEvent->io ( |
107 | $SIGPIPE_W = AnyEvent->io ( |
108 | fh => $SIGPIPE->fileno, |
108 | fh => $SIGPIPE->fileno, |
109 | poll => "r", |
109 | poll => "r", |
110 | cb => \&_signal_check, |
110 | cb => \&_signal_check, # defined later |
111 | ); |
111 | ); |
112 | |
112 | |
113 | Then, for each signal to hook, create an Async::Interrupt object. The |
113 | Then, for each signal to hook, create an Async::Interrupt object. The |
114 | callback just sets a global variable, as we are only interested in |
114 | callback just sets a global variable, as we are only interested in |
115 | synchronous signals (i.e. when the event loop polls), which is why the |
115 | synchronous signals (i.e. when the event loop polls), which is why the |
116 | pipe draining is not done automatically. |
116 | pipe draining is not done automatically. |
117 | |
117 | |
118 | my $interrupt = new Async::Interrupt |
118 | my $interrupt = new Async::Interrupt |
119 | cb => sub { undef $SIGNAL_RECEIVED{$signum} } |
119 | cb => sub { undef $SIGNAL_RECEIVED{$signum} } |
120 | signal => $signal, |
120 | signal => $signum, |
121 | pipe => [$SIGPIPE_R->filenos], |
121 | pipe => [$SIGPIPE->filenos], |
122 | pipe_autodrain => 0, |
122 | pipe_autodrain => 0, |
123 | ; |
123 | ; |
124 | |
124 | |
125 | Finally, the I/O callback for the event pipe handles the signals: |
125 | Finally, the I/O callback for the event pipe handles the signals: |
126 | |
126 | |
… | |
… | |
135 | warn "signal $_ received\n"; |
135 | warn "signal $_ received\n"; |
136 | } |
136 | } |
137 | } |
137 | } |
138 | } |
138 | } |
139 | |
139 | |
|
|
140 | =head2 Interrupt perl from another thread |
|
|
141 | |
|
|
142 | This example interrupts the Perl interpreter from another thread, via the |
|
|
143 | XS API. This is used by e.g. the L<EV::Loop::Async> module. |
|
|
144 | |
|
|
145 | On the Perl level, a new loop object (which contains the thread) |
|
|
146 | is created, by first calling some XS constructor, querying the |
|
|
147 | C-level callback function and feeding that as the C<c_cb> into the |
|
|
148 | Async::Interrupt constructor: |
|
|
149 | |
|
|
150 | my $self = XS_thread_constructor; |
|
|
151 | my ($c_func, $c_arg) = _c_func $self; # return the c callback |
|
|
152 | my $asy = new Async::Interrupt c_cb => [$c_func, $c_arg]; |
|
|
153 | |
|
|
154 | Then the newly created Interrupt object is queried for the signaling |
|
|
155 | function that the newly created thread should call, and this is in turn |
|
|
156 | told to the thread object: |
|
|
157 | |
|
|
158 | _attach $self, $asy->signal_func; |
|
|
159 | |
|
|
160 | So to repeat: first the XS object is created, then it is queried for the |
|
|
161 | callback that should be called when the Interrupt object gets signalled. |
|
|
162 | |
|
|
163 | Then the interrupt object is queried for the callback fucntion that the |
|
|
164 | thread should call to signal the Interrupt object, and this callback is |
|
|
165 | then attached to the thread. |
|
|
166 | |
|
|
167 | You have to be careful that your new thread is not signalling before the |
|
|
168 | signal function was configured, for example by starting the background |
|
|
169 | thread only within C<_attach>. |
|
|
170 | |
|
|
171 | That concludes the Perl part. |
|
|
172 | |
|
|
173 | The XS part consists of the actual constructor which creates a thread, |
|
|
174 | which is not relevant for this example, and two functions, C<_c_func>, |
|
|
175 | which returns the Perl-side callback, and C<_attach>, which configures |
|
|
176 | the signalling functioon that is safe toc all from another thread. For |
|
|
177 | simplicity, we will use global variables to store the functions, normally |
|
|
178 | you would somehow attach them to C<$self>. |
|
|
179 | |
|
|
180 | The C<c_func> simply returns the address of a static function and arranges |
|
|
181 | for the object pointed to by C<$self> to be passed to it, as an integer: |
|
|
182 | |
|
|
183 | void |
|
|
184 | _c_func (SV *loop) |
|
|
185 | PPCODE: |
|
|
186 | EXTEND (SP, 2); |
|
|
187 | PUSHs (sv_2mortal (newSViv (PTR2IV (c_func)))); |
|
|
188 | PUSHs (sv_2mortal (newSViv (SvRV (loop)))); |
|
|
189 | |
|
|
190 | This would be the callback (since it runs in a normal Perl context, it is |
|
|
191 | permissible to manipulate Perl values): |
|
|
192 | |
|
|
193 | static void |
|
|
194 | c_func (pTHX_ void *loop_, int value) |
|
|
195 | { |
|
|
196 | SV *loop_object = (SV *)loop_; |
|
|
197 | ... |
|
|
198 | } |
|
|
199 | |
|
|
200 | And this attaches the signalling callback: |
|
|
201 | |
|
|
202 | static void (*my_sig_func) (void *signal_arg, int value); |
|
|
203 | static void *my_sig_arg; |
|
|
204 | |
|
|
205 | void |
|
|
206 | _attach (SV *loop_, IV sig_func, void *sig_arg) |
|
|
207 | CODE: |
|
|
208 | { |
|
|
209 | my_sig_func = sig_func; |
|
|
210 | my_sig_arg = sig_arg; |
|
|
211 | |
|
|
212 | /* now run the thread */ |
|
|
213 | thread_create (&u->tid, l_run, 0); |
|
|
214 | } |
|
|
215 | |
|
|
216 | And C<l_run> (the background thread) would eventually call the signaling |
|
|
217 | function: |
|
|
218 | |
|
|
219 | my_sig_func (my_sig_arg, 0); |
|
|
220 | |
|
|
221 | You can have a look at L<EV::Loop::Async> for an actual example using |
|
|
222 | intra-thread communication, locking and so on. |
140 | |
223 | |
141 | |
224 | |
142 | =head1 THE Async::Interrupt CLASS |
225 | =head1 THE Async::Interrupt CLASS |
143 | |
226 | |
144 | =over 4 |
227 | =over 4 |
… | |
… | |
149 | |
232 | |
150 | use common::sense; |
233 | use common::sense; |
151 | |
234 | |
152 | BEGIN { |
235 | BEGIN { |
153 | # the next line forces initialisation of internal |
236 | # the next line forces initialisation of internal |
154 | # signal handling # variables |
237 | # signal handling variables, otherwise, PL_sig_pending |
|
|
238 | # etc. will be null pointers. |
155 | $SIG{KILL} = sub { }; |
239 | $SIG{KILL} = sub { }; |
156 | |
240 | |
157 | our $VERSION = '0.6'; |
241 | our $VERSION = '1.04'; |
158 | |
242 | |
159 | require XSLoader; |
243 | require XSLoader; |
160 | XSLoader::load ("Async::Interrupt", $VERSION); |
244 | XSLoader::load ("Async::Interrupt", $VERSION); |
161 | } |
245 | } |
162 | |
246 | |
… | |
… | |
185 | The exceptions are C<$!> and C<$@>, which are saved and restored by |
269 | The exceptions are C<$!> and C<$@>, which are saved and restored by |
186 | Async::Interrupt. |
270 | Async::Interrupt. |
187 | |
271 | |
188 | If the callback should throw an exception, then it will be caught, |
272 | If the callback should throw an exception, then it will be caught, |
189 | and C<$Async::Interrupt::DIED> will be called with C<$@> containing |
273 | and C<$Async::Interrupt::DIED> will be called with C<$@> containing |
190 | the exception. The default will simply C<warn> about the message and |
274 | the exception. The default will simply C<warn> about the message and |
191 | continue. |
275 | continue. |
192 | |
276 | |
193 | =item c_cb => [$c_func, $c_arg] |
277 | =item c_cb => [$c_func, $c_arg] |
194 | |
278 | |
195 | Registers a C callback the be invoked whenever the async interrupt is |
279 | Registers a C callback the be invoked whenever the async interrupt is |
… | |
… | |
229 | the given signal is caught by the process. |
313 | the given signal is caught by the process. |
230 | |
314 | |
231 | Only one async can hook a given signal, and the signal will be restored to |
315 | Only one async can hook a given signal, and the signal will be restored to |
232 | defaults when the Async::Interrupt object gets destroyed. |
316 | defaults when the Async::Interrupt object gets destroyed. |
233 | |
317 | |
|
|
318 | =item signal_hysteresis => $boolean |
|
|
319 | |
|
|
320 | Sets the initial signal hysteresis state, see the C<signal_hysteresis> |
|
|
321 | method, below. |
|
|
322 | |
234 | =item pipe => [$fileno_or_fh_for_reading, $fileno_or_fh_for_writing] |
323 | =item pipe => [$fileno_or_fh_for_reading, $fileno_or_fh_for_writing] |
235 | |
324 | |
236 | Specifies two file descriptors (or file handles) that should be signalled |
325 | Specifies two file descriptors (or file handles) that should be signalled |
237 | whenever the async interrupt is signalled. This means a single octet will |
326 | whenever the async interrupt is signalled. This means a single octet will |
238 | be written to it, and before the callback is being invoked, it will be |
327 | be written to it, and before the callback is being invoked, it will be |
… | |
… | |
251 | |
340 | |
252 | If you want to share a single event pipe between multiple Async::Interrupt |
341 | If you want to share a single event pipe between multiple Async::Interrupt |
253 | objects, you can use the C<Async::Interrupt::EventPipe> class to manage |
342 | objects, you can use the C<Async::Interrupt::EventPipe> class to manage |
254 | those. |
343 | those. |
255 | |
344 | |
|
|
345 | =item pipe_autodrain => $boolean |
|
|
346 | |
|
|
347 | Sets the initial autodrain state, see the C<pipe_autodrain> method, below. |
|
|
348 | |
256 | =back |
349 | =back |
257 | |
350 | |
258 | =cut |
351 | =cut |
259 | |
352 | |
260 | sub new { |
353 | sub new { |
261 | my ($class, %arg) = @_; |
354 | my ($class, %arg) = @_; |
262 | |
355 | |
263 | bless \(_alloc $arg{cb}, @{$arg{c_cb}}[0,1], @{$arg{pipe}}[0,1], $arg{signal}, $arg{var}), $class |
356 | my $self = bless \(_alloc $arg{cb}, @{$arg{c_cb}}[0,1], @{$arg{pipe}}[0,1], $arg{signal}, $arg{var}), $class; |
|
|
357 | |
|
|
358 | # urgs, reminds me of Event |
|
|
359 | for my $attr (qw(pipe_autodrain signal_hysteresis)) { |
|
|
360 | $self->$attr ($arg{$attr}) if exists $arg{$attr}; |
|
|
361 | } |
|
|
362 | |
|
|
363 | $self |
264 | } |
364 | } |
265 | |
365 | |
266 | =item ($signal_func, $signal_arg) = $async->signal_func |
366 | =item ($signal_func, $signal_arg) = $async->signal_func |
267 | |
367 | |
268 | Returns the address of a function to call asynchronously. The function |
368 | Returns the address of a function to call asynchronously. The function |
… | |
… | |
436 | |
536 | |
437 | =back |
537 | =back |
438 | |
538 | |
439 | =head1 THE Async::Interrupt::EventPipe CLASS |
539 | =head1 THE Async::Interrupt::EventPipe CLASS |
440 | |
540 | |
441 | Pipes are the predominent utility to make asynchronous signals |
541 | Pipes are the predominant utility to make asynchronous signals |
442 | synchronous. However, pipes are hard to come by: they don't exist on the |
542 | synchronous. However, pipes are hard to come by: they don't exist on the |
443 | broken windows platform, and on GNU/Linux systems, you might want to use |
543 | broken windows platform, and on GNU/Linux systems, you might want to use |
444 | an C<eventfd> instead. |
544 | an C<eventfd> instead. |
445 | |
545 | |
446 | This class creates selectable event pipes in a portable fashion: on |
546 | This class creates selectable event pipes in a portable fashion: on |
… | |
… | |
476 | |
576 | |
477 | =item $epipe->drain |
577 | =item $epipe->drain |
478 | |
578 | |
479 | Drain (empty) the pipe. |
579 | Drain (empty) the pipe. |
480 | |
580 | |
|
|
581 | =item ($c_func, $c_arg) = $epipe->drain_func |
|
|
582 | |
|
|
583 | Returns a function pointer and C<void *> argument that can be called to |
|
|
584 | have the effect of C<< $epipe->drain >> on the XS level. |
|
|
585 | |
|
|
586 | It has the following prototype and needs to be passed the specified |
|
|
587 | C<$c_arg>, which is a C<void *> cast to C<IV>: |
|
|
588 | |
|
|
589 | void (*c_func) (void *c_arg) |
|
|
590 | |
|
|
591 | An example call would look like: |
|
|
592 | |
|
|
593 | c_func (c_arg); |
|
|
594 | |
481 | =item $epipe->renew |
595 | =item $epipe->renew |
482 | |
596 | |
483 | Recreates the pipe (useful after a fork). The reading side will not change |
597 | Recreates the pipe (useful after a fork). The reading side will not change |
484 | it's file descriptor number, but the writing side might. |
598 | it's file descriptor number, but the writing side might. |
485 | |
599 | |
|
|
600 | =item $epipe->wait |
|
|
601 | |
|
|
602 | This method blocks the process until there are events on the pipe. This is |
|
|
603 | not a very event-based or ncie way of usign an event pipe, but it can be |
|
|
604 | occasionally useful. |
|
|
605 | |
486 | =back |
606 | =back |
487 | |
607 | |
488 | =cut |
608 | =cut |
489 | |
609 | |
490 | 1; |
610 | 1; |
491 | |
|
|
492 | =head1 EXAMPLE |
|
|
493 | |
|
|
494 | There really should be a complete C/XS example. Bug me about it. Better |
|
|
495 | yet, create one. |
|
|
496 | |
611 | |
497 | =head1 IMPLEMENTATION DETAILS AND LIMITATIONS |
612 | =head1 IMPLEMENTATION DETAILS AND LIMITATIONS |
498 | |
613 | |
499 | This module works by "hijacking" SIGKILL, which is guaranteed to always |
614 | This module works by "hijacking" SIGKILL, which is guaranteed to always |
500 | exist, but also cannot be caught, so is always available. |
615 | exist, but also cannot be caught, so is always available. |