ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Async-Interrupt/Interrupt.pm
Revision: 1.18
Committed: Tue Jul 28 12:50:16 2009 UTC (14 years, 10 months ago) by root
Branch: MAIN
Changes since 1.17: +56 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     Async::Interrupt - allow C/XS libraries to interrupt perl asynchronously
4    
5     =head1 SYNOPSIS
6    
7     use Async::Interrupt;
8    
9     =head1 DESCRIPTION
10    
11     This module implements a single feature only of interest to advanced perl
12 root 1.4 modules, namely asynchronous interruptions (think "UNIX signals", which
13 root 1.1 are very similar).
14    
15 root 1.8 Sometimes, modules wish to run code asynchronously (in another thread,
16     or from a signal handler), and then signal the perl interpreter on
17     certain events. One common way is to write some data to a pipe and use an
18     event handling toolkit to watch for I/O events. Another way is to send
19     a signal. Those methods are slow, and in the case of a pipe, also not
20     asynchronous - it won't interrupt a running perl interpreter.
21 root 1.1
22     This module implements asynchronous notifications that enable you to
23 root 1.8 signal running perl code from another thread, asynchronously, and
24     sometimes even without using a single syscall.
25 root 1.1
26 root 1.8 =head2 USAGE SCENARIOS
27    
28     =over 4
29    
30     =item Race-free signal handling
31    
32     There seems to be no way to do race-free signal handling in perl: to
33     catch a signal, you have to execute Perl code, and between entering the
34     interpreter C<select> function (or other blocking functions) and executing
35     the select syscall is a small but relevant timespan during which signals
36     will be queued, but perl signal handlers will not be executed and the
37     blocking syscall will not be interrupted.
38    
39     You can use this module to bind a signal to a callback while at the same
40     time activating an event pipe that you can C<select> on, fixing the race
41     completely.
42    
43     This can be used to implement the signal hadling in event loops,
44     e.g. L<AnyEvent>, L<POE>, L<IO::Async::Loop> and so on.
45    
46     =item Background threads want speedy reporting
47    
48     Assume you want very exact timing, and you can spare an extra cpu core
49     for that. Then you can run an extra thread that signals your perl
50     interpreter. This means you can get a very exact timing source while your
51     perl code is number crunching, without even using a syscall to communicate
52     between your threads.
53    
54     For example the deliantra game server uses a variant of this technique
55     to interrupt background processes regularly to send map updates to game
56     clients.
57    
58 root 1.17 Or L<EV::Loop::Async> uses an interrupt object to wake up perl when new
59     events have arrived.
60    
61 root 1.8 L<IO::AIO> and L<BDB> could also use this to speed up result reporting.
62    
63     =item Speedy event loop invocation
64    
65     One could use this module e.g. in L<Coro> to interrupt a running coro-thread
66     and cause it to enter the event loop.
67    
68     Or one could bind to C<SIGIO> and tell some important sockets to send this
69     signal, causing the event loop to be entered to reduce network latency.
70    
71     =back
72    
73     =head2 HOW TO USE
74    
75     You can use this module by creating an C<Async::Interrupt> object for each
76     such event source. This object stores a perl and/or a C-level callback
77     that is invoked when the C<Async::Interrupt> object gets signalled. It is
78     executed at the next time the perl interpreter is running (i.e. it will
79     interrupt a computation, but not an XS function or a syscall).
80 root 1.2
81     You can signal the C<Async::Interrupt> object either by calling it's C<<
82 root 1.8 ->signal >> method, or, more commonly, by calling a C function. There is
83     also the built-in (POSIX) signal source.
84 root 1.2
85     The C<< ->signal_func >> returns the address of the C function that is to
86     be called (plus an argument to be used during the call). The signalling
87     function also takes an integer argument in the range SIG_ATOMIC_MIN to
88     SIG_ATOMIC_MAX (guaranteed to allow at least 0..127).
89    
90     Since this kind of interruption is fast, but can only interrupt a
91 root 1.8 I<running> interpreter, there is optional support for signalling a pipe
92     - that means you can also wait for the pipe to become readable (e.g. via
93     L<EV> or L<AnyEvent>). This, of course, incurs the overhead of a C<read>
94     and C<write> syscall.
95 root 1.2
96 root 1.18 =head1 USAGE EXAMPLES
97    
98     =head2 Async::Interrupt to implement race-free signal handling
99    
100     This example uses a single event pipe for all signals, and one
101     Async::Interrupt per signal.
102    
103     First, create the event pipe and hook it into the event loop (this code is
104     actually what L<AnyEvent> uses itself):
105    
106     $SIGPIPE = new Async::Interrupt::EventPipe;
107     $SIGPIPE_W = AnyEvent->io (
108     fh => $SIGPIPE->fileno,
109     poll => "r",
110     cb => \&_signal_check,
111     );
112    
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
115     synchronous signals (i.e. when the event loop polls), which is why the
116     pipe draining is not done automatically.
117    
118     my $interrupt = new Async::Interrupt
119     cb => sub { undef $SIGNAL_RECEIVED{$signum} }
120     signal => $signal,
121     pipe => [$SIGPIPE_R->filenos],
122     pipe_autodrain => 0,
123     ;
124    
125     Finally, the I/O callback for the event pipe handles the signals:
126    
127     sub _signal_check {
128     # drain the pipe first
129     $SIGPIPE->drain;
130    
131     # two loops, just to be sure
132     while (%SIGNAL_RECEIVED) {
133     for (keys %SIGNAL_RECEIVED) {
134     delete $SIGNAL_RECEIVED{$_};
135     warn "signal $_ received\n";
136     }
137     }
138     }
139    
140    
141    
142 root 1.16 =head1 THE Async::Interrupt CLASS
143    
144 root 1.1 =over 4
145    
146     =cut
147    
148     package Async::Interrupt;
149    
150 root 1.10 use common::sense;
151 root 1.2
152 root 1.1 BEGIN {
153 root 1.11 # the next line forces initialisation of internal
154     # signal handling # variables
155     $SIG{KILL} = sub { };
156    
157 root 1.16 our $VERSION = '0.6';
158 root 1.1
159     require XSLoader;
160 root 1.11 XSLoader::load ("Async::Interrupt", $VERSION);
161 root 1.1 }
162    
163 root 1.2 our $DIED = sub { warn "$@" };
164    
165 root 1.1 =item $async = new Async::Interrupt key => value...
166    
167     Creates a new Async::Interrupt object. You may only use async
168     notifications on this object while it exists, so you need to keep a
169     reference to it at all times while it is used.
170    
171     Optional constructor arguments include (normally you would specify at
172     least one of C<cb> or C<c_cb>).
173    
174     =over 4
175    
176     =item cb => $coderef->($value)
177    
178     Registers a perl callback to be invoked whenever the async interrupt is
179     signalled.
180    
181     Note that, since this callback can be invoked at basically any time, it
182 root 1.2 must not modify any well-known global variables such as C<$/> without
183     restoring them again before returning.
184    
185     The exceptions are C<$!> and C<$@>, which are saved and restored by
186     Async::Interrupt.
187 root 1.1
188 root 1.2 If the callback should throw an exception, then it will be caught,
189     and C<$Async::Interrupt::DIED> will be called with C<$@> containing
190     the exception. The default will simply C<warn> about the message and
191     continue.
192    
193     =item c_cb => [$c_func, $c_arg]
194 root 1.1
195     Registers a C callback the be invoked whenever the async interrupt is
196     signalled.
197    
198     The C callback must have the following prototype:
199    
200 root 1.2 void c_func (pTHX_ void *c_arg, int value);
201 root 1.1
202 root 1.2 Both C<$c_func> and C<$c_arg> must be specified as integers/IVs, and
203     C<$value> is the C<value> passed to some earlier call to either C<$signal>
204     or the C<signal_func> function.
205 root 1.1
206     Note that, because the callback can be invoked at almost any time, you
207     have to be careful at saving and restoring global variables that Perl
208 root 1.4 might use (the exception is C<errno>, which is saved and restored by
209 root 1.2 Async::Interrupt). The callback itself runs as part of the perl context,
210     so you can call any perl functions and modify any perl data structures (in
211 root 1.4 which case the requirements set out for C<cb> apply as well).
212 root 1.1
213 root 1.13 =item var => $scalar_ref
214    
215     When specified, then the given argument must be a reference to a
216 root 1.17 scalar. The scalar will be set to C<0> initially. Signalling the interrupt
217 root 1.13 object will set it to the passed value, handling the interrupt will reset
218     it to C<0> again.
219    
220     Note that the only thing you are legally allowed to do is to is to check
221     the variable in a boolean or integer context (e.g. comparing it with a
222     string, or printing it, will I<destroy> it and might cause your program to
223     crash or worse).
224    
225 root 1.6 =item signal => $signame_or_value
226    
227     When this parameter is specified, then the Async::Interrupt will hook the
228     given signal, that is, it will effectively call C<< ->signal (0) >> each time
229     the given signal is caught by the process.
230    
231     Only one async can hook a given signal, and the signal will be restored to
232     defaults when the Async::Interrupt object gets destroyed.
233    
234 root 1.2 =item pipe => [$fileno_or_fh_for_reading, $fileno_or_fh_for_writing]
235 root 1.1
236 root 1.2 Specifies two file descriptors (or file handles) that should be signalled
237 root 1.1 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
239     read again. Due to races, it is unlikely but possible that multiple octets
240 root 1.2 are written. It is required that the file handles are both in nonblocking
241     mode.
242 root 1.1
243 root 1.2 The object will keep a reference to the file handles.
244 root 1.1
245     This can be used to ensure that async notifications will interrupt event
246     frameworks as well.
247    
248 root 1.13 Note that C<Async::Interrupt> will create a suitable signal fd
249     automatically when your program requests one, so you don't have to specify
250 root 1.16 this argument when all you want is an extra file descriptor to watch.
251    
252     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
254     those.
255 root 1.13
256 root 1.1 =back
257    
258     =cut
259    
260     sub new {
261     my ($class, %arg) = @_;
262    
263 root 1.13 bless \(_alloc $arg{cb}, @{$arg{c_cb}}[0,1], @{$arg{pipe}}[0,1], $arg{signal}, $arg{var}), $class
264 root 1.1 }
265    
266 root 1.2 =item ($signal_func, $signal_arg) = $async->signal_func
267 root 1.1
268 root 1.17 Returns the address of a function to call asynchronously. The function
269     has the following prototype and needs to be passed the specified
270     C<$signal_arg>, which is a C<void *> cast to C<IV>:
271 root 1.1
272     void (*signal_func) (void *signal_arg, int value)
273    
274     An example call would look like:
275    
276     signal_func (signal_arg, 0);
277    
278 root 1.2 The function is safe to call from within signal and thread contexts, at
279 root 1.1 any time. The specified C<value> is passed to both C and Perl callback.
280    
281 root 1.13 C<$value> must be in the valid range for a C<sig_atomic_t>, except C<0>
282     (1..127 is portable).
283 root 1.2
284 root 1.1 If the function is called while the Async::Interrupt object is already
285     signaled but before the callbacks are being executed, then the stored
286 root 1.2 C<value> is either the old or the new one. Due to the asynchronous
287     nature of the code, the C<value> can even be passed to two consecutive
288     invocations of the callback.
289 root 1.1
290 root 1.13 =item $address = $async->c_var
291    
292     Returns the address (cast to IV) of an C<IV> variable. The variable is set
293     to C<0> initially and gets set to the passed value whenever the object
294     gets signalled, and reset to C<0> once the interrupt has been handled.
295    
296     Note that it is often beneficial to just call C<PERL_ASYNC_CHECK ()> to
297     handle any interrupts.
298    
299     Example: call some XS function to store the address, then show C code
300     waiting for it.
301    
302     my_xs_func $async->c_var;
303    
304     static IV *valuep;
305    
306     void
307     my_xs_func (void *addr)
308     CODE:
309     valuep = (IV *)addr;
310    
311     // code in a loop, waiting
312     while (!*valuep)
313 root 1.16 ; // do something
314 root 1.13
315     =item $async->signal ($value=1)
316 root 1.1
317     This signals the given async object from Perl code. Semi-obviously, this
318 root 1.17 will instantly trigger the callback invocation (it does not, as the name
319     might imply, do anything with POSIX signals).
320 root 1.1
321 root 1.13 C<$value> must be in the valid range for a C<sig_atomic_t>, except C<0>
322     (1..127 is portable).
323 root 1.2
324 root 1.17 =item $async->signal_hysteresis ($enable)
325    
326     Enables or disables signal hysteresis (default: disabled). If a POSIX
327     signal is used as a signal source for the interrupt object, then enabling
328     signal hysteresis causes Async::Interrupt to reset the signal action to
329     C<SIG_IGN> in the signal handler and restore it just before handling the
330     interruption.
331    
332     When you expect a lot of signals (e.g. when using SIGIO), then enabling
333     signal hysteresis can reduce the number of handler invocations
334     considerably, at the cost of two extra syscalls.
335    
336     Note that setting the signal to C<SIG_IGN> can have unintended side
337     effects when you fork and exec other programs, as often they do nto expect
338     signals to be ignored by default.
339    
340 root 1.2 =item $async->block
341    
342 root 1.3 =item $async->unblock
343    
344     Sometimes you need a "critical section" of code that will not be
345     interrupted by an Async::Interrupt. This can be implemented by calling C<<
346     $async->block >> before the critical section, and C<< $async->unblock >>
347     afterwards.
348    
349 root 1.4 Note that there must be exactly one call of C<unblock> for every previous
350 root 1.3 call to C<block> (i.e. calls can nest).
351    
352 root 1.4 Since ensuring this in the presence of exceptions and threads is
353 root 1.3 usually more difficult than you imagine, I recommend using C<<
354     $async->scoped_block >> instead.
355 root 1.2
356 root 1.3 =item $async->scope_block
357    
358     This call C<< $async->block >> and installs a handler that is called when
359     the current scope is exited (via an exception, by canceling the Coro
360     thread, by calling last/goto etc.).
361    
362     This is the recommended (and fastest) way to implement critical sections.
363 root 1.2
364 root 1.17 =item ($block_func, $block_arg) = $async->scope_block_func
365    
366     Returns the address of a function that implements the C<scope_block>
367     functionality.
368    
369     It has the following prototype and needs to be passed the specified
370     C<$block_arg>, which is a C<void *> cast to C<IV>:
371    
372     void (*block_func) (void *block_arg)
373    
374     An example call would look like:
375    
376     block_func (block_arg);
377    
378     The function is safe to call only from within the toplevel of a perl XS
379     function and will call C<LEAVE> and C<ENTER> (in this order!).
380    
381 root 1.6 =item $async->pipe_enable
382    
383     =item $async->pipe_disable
384    
385     Enable/disable signalling the pipe when the interrupt occurs (default is
386     enabled). Writing to a pipe is relatively expensive, so it can be disabled
387     when you know you are not waiting for it (for example, with L<EV> you
388     could disable the pipe in a check watcher, and enable it in a prepare
389     watcher).
390    
391 root 1.13 Note that currently, while C<pipe_disable> is in effect, no attempt to
392     read from the pipe will be done when handling events. This might change as
393     soon as I realize why this is a mistake.
394    
395     =item $fileno = $async->pipe_fileno
396    
397     Returns the reading side of the signalling pipe. If no signalling pipe is
398     currently attached to the object, it will dynamically create one.
399    
400     Note that the only valid oepration on this file descriptor is to wait
401     until it is readable. The fd might belong currently to a pipe, a tcp
402     socket, or an eventfd, depending on the platform, and is guaranteed to be
403     C<select>able.
404    
405 root 1.16 =item $async->pipe_autodrain ($enable)
406    
407     Enables (C<1>) or disables (C<0>) automatic draining of the pipe (default:
408     enabled). When automatic draining is enabled, then Async::Interrupt will
409     automatically clear the pipe. Otherwise the user is responsible for this
410     draining.
411    
412     This is useful when you want to share one pipe among many Async::Interrupt
413     objects.
414    
415 root 1.13 =item $async->post_fork
416    
417     The object will not normally be usable after a fork (as the pipe fd is
418     shared between processes). Calling this method after a fork in the child
419     ensures that the object will work as expected again. It only needs to be
420     called when the async object is used in the child.
421    
422     This only works when the pipe was created by Async::Interrupt.
423    
424     Async::Interrupt ensures that the reading file descriptor does not change
425     it's value.
426 root 1.6
427 root 1.18 =item $signum = Async::Interrupt::sig2num $signame_or_number
428    
429     =item $signame = Async::Interrupt::sig2name $signame_or_number
430    
431     These two convenience functions simply convert a signal name or number to
432     the corresponding name or number. They are not used by this module and
433     exist just because perl doesn't have a nice way to do this on its own.
434    
435     They will return C<undef> on illegal names or numbers.
436    
437 root 1.16 =back
438    
439     =head1 THE Async::Interrupt::EventPipe CLASS
440    
441     Pipes are the predominent utility to make asynchronous signals
442     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
444     an C<eventfd> instead.
445    
446     This class creates selectable event pipes in a portable fashion: on
447     windows, it will try to create a tcp socket pair, on GNU/Linux, it will
448     try to create an eventfd and everywhere else it will try to use a normal
449     pipe.
450    
451     =over 4
452    
453     =item $epipe = new Async::Interrupt::EventPipe
454    
455     This creates and returns an eventpipe object. This object is simply a
456     blessed array reference:
457    
458     =item ($r_fd, $w_fd) = $epipe->filenos
459    
460     Returns the read-side file descriptor and the write-side file descriptor.
461    
462     Example: pass an eventpipe object as pipe to the Async::Interrupt
463     constructor, and create an AnyEvent watcher for the read side.
464    
465     my $epipe = new Async::Interrupt::EventPipe;
466     my $asy = new Async::Interrupt pipe => [$epipe->filenos];
467     my $iow = AnyEvent->io (fh => $epipe->fileno, poll => 'r', cb => sub { });
468    
469     =item $r_fd = $epipe->fileno
470    
471     Return only the reading/listening side.
472    
473     =item $epipe->signal
474    
475     Write something to the pipe, in a portable fashion.
476    
477     =item $epipe->drain
478    
479     Drain (empty) the pipe.
480    
481     =item $epipe->renew
482    
483     Recreates the pipe (useful after a fork). The reading side will not change
484     it's file descriptor number, but the writing side might.
485    
486     =back
487    
488 root 1.1 =cut
489    
490     1;
491    
492 root 1.2 =head1 EXAMPLE
493    
494 root 1.8 There really should be a complete C/XS example. Bug me about it. Better
495     yet, create one.
496 root 1.2
497     =head1 IMPLEMENTATION DETAILS AND LIMITATIONS
498    
499 root 1.8 This module works by "hijacking" SIGKILL, which is guaranteed to always
500     exist, but also cannot be caught, so is always available.
501 root 1.2
502 root 1.8 Basically, this module fakes the occurance of a SIGKILL signal and
503     then intercepts the interpreter handling it. This makes normal signal
504     handling slower (probably unmeasurably, though), but has the advantage
505     of not requiring a special runops function, nor slowing down normal perl
506     execution a bit.
507    
508 root 1.13 It assumes that C<sig_atomic_t>, C<int> and C<IV> are all async-safe to
509     modify.
510 root 1.2
511 root 1.1 =head1 AUTHOR
512    
513     Marc Lehmann <schmorp@schmorp.de>
514     http://home.schmorp.de/
515    
516     =cut
517