ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Async-Interrupt/Interrupt.pm
Revision: 1.19
Committed: Tue Jul 28 13:17:05 2009 UTC (14 years, 10 months ago) by root
Branch: MAIN
Changes since 1.18: +33 -11 lines
Log Message:
*** empty log message ***

File Contents

# Content
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 modules, namely asynchronous interruptions (think "UNIX signals", which
13 are very similar).
14
15 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
22 This module implements asynchronous notifications that enable you to
23 signal running perl code from another thread, asynchronously, and
24 sometimes even without using a single syscall.
25
26 =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 Or L<EV::Loop::Async> uses an interrupt object to wake up perl when new
59 events have arrived.
60
61 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
81 You can signal the C<Async::Interrupt> object either by calling it's C<<
82 ->signal >> method, or, more commonly, by calling a C function. There is
83 also the built-in (POSIX) signal source.
84
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 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
96 =head1 USAGE EXAMPLES
97
98 =head2 Implementing race-free signal handling
99
100 This example uses a single event pipe for all signals, and one
101 Async::Interrupt per signal. This code is actually what the L<AnyEvent>
102 module uses itself when Async::Interrupt is available.
103
104 First, create the event pipe and hook it into the event loop
105
106 $SIGPIPE = new Async::Interrupt::EventPipe;
107 $SIGPIPE_W = AnyEvent->io (
108 fh => $SIGPIPE->fileno,
109 poll => "r",
110 cb => \&_signal_check, # defined later
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 => $signum,
121 pipe => [$SIGPIPE->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 =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 #TODO#
146
147 =head1 THE Async::Interrupt CLASS
148
149 =over 4
150
151 =cut
152
153 package Async::Interrupt;
154
155 use common::sense;
156
157 BEGIN {
158 # the next line forces initialisation of internal
159 # signal handling variables, otherwise, PL_sig_pending
160 # etc. will be null pointers.
161 $SIG{KILL} = sub { };
162
163 our $VERSION = '1.0';
164
165 require XSLoader;
166 XSLoader::load ("Async::Interrupt", $VERSION);
167 }
168
169 our $DIED = sub { warn "$@" };
170
171 =item $async = new Async::Interrupt key => value...
172
173 Creates a new Async::Interrupt object. You may only use async
174 notifications on this object while it exists, so you need to keep a
175 reference to it at all times while it is used.
176
177 Optional constructor arguments include (normally you would specify at
178 least one of C<cb> or C<c_cb>).
179
180 =over 4
181
182 =item cb => $coderef->($value)
183
184 Registers a perl callback to be invoked whenever the async interrupt is
185 signalled.
186
187 Note that, since this callback can be invoked at basically any time, it
188 must not modify any well-known global variables such as C<$/> without
189 restoring them again before returning.
190
191 The exceptions are C<$!> and C<$@>, which are saved and restored by
192 Async::Interrupt.
193
194 If the callback should throw an exception, then it will be caught,
195 and C<$Async::Interrupt::DIED> will be called with C<$@> containing
196 the exception. The default will simply C<warn> about the message and
197 continue.
198
199 =item c_cb => [$c_func, $c_arg]
200
201 Registers a C callback the be invoked whenever the async interrupt is
202 signalled.
203
204 The C callback must have the following prototype:
205
206 void c_func (pTHX_ void *c_arg, int value);
207
208 Both C<$c_func> and C<$c_arg> must be specified as integers/IVs, and
209 C<$value> is the C<value> passed to some earlier call to either C<$signal>
210 or the C<signal_func> function.
211
212 Note that, because the callback can be invoked at almost any time, you
213 have to be careful at saving and restoring global variables that Perl
214 might use (the exception is C<errno>, which is saved and restored by
215 Async::Interrupt). The callback itself runs as part of the perl context,
216 so you can call any perl functions and modify any perl data structures (in
217 which case the requirements set out for C<cb> apply as well).
218
219 =item var => $scalar_ref
220
221 When specified, then the given argument must be a reference to a
222 scalar. The scalar will be set to C<0> initially. Signalling the interrupt
223 object will set it to the passed value, handling the interrupt will reset
224 it to C<0> again.
225
226 Note that the only thing you are legally allowed to do is to is to check
227 the variable in a boolean or integer context (e.g. comparing it with a
228 string, or printing it, will I<destroy> it and might cause your program to
229 crash or worse).
230
231 =item signal => $signame_or_value
232
233 When this parameter is specified, then the Async::Interrupt will hook the
234 given signal, that is, it will effectively call C<< ->signal (0) >> each time
235 the given signal is caught by the process.
236
237 Only one async can hook a given signal, and the signal will be restored to
238 defaults when the Async::Interrupt object gets destroyed.
239
240 =item signal_hysteresis => $boolean
241
242 Sets the initial signal hysteresis state, see the C<signal_hysteresis>
243 method, below.
244
245 =item pipe => [$fileno_or_fh_for_reading, $fileno_or_fh_for_writing]
246
247 Specifies two file descriptors (or file handles) that should be signalled
248 whenever the async interrupt is signalled. This means a single octet will
249 be written to it, and before the callback is being invoked, it will be
250 read again. Due to races, it is unlikely but possible that multiple octets
251 are written. It is required that the file handles are both in nonblocking
252 mode.
253
254 The object will keep a reference to the file handles.
255
256 This can be used to ensure that async notifications will interrupt event
257 frameworks as well.
258
259 Note that C<Async::Interrupt> will create a suitable signal fd
260 automatically when your program requests one, so you don't have to specify
261 this argument when all you want is an extra file descriptor to watch.
262
263 If you want to share a single event pipe between multiple Async::Interrupt
264 objects, you can use the C<Async::Interrupt::EventPipe> class to manage
265 those.
266
267 =item pipe_autodrain => $boolean
268
269 Sets the initial autodrain state, see the C<pipe_autodrain> method, below.
270
271 =back
272
273 =cut
274
275 sub new {
276 my ($class, %arg) = @_;
277
278 my $self = bless \(_alloc $arg{cb}, @{$arg{c_cb}}[0,1], @{$arg{pipe}}[0,1], $arg{signal}, $arg{var}), $class;
279
280 # urgs, reminds me of Event
281 for my $attr (qw(pipe_autodrain signal_hysteresis)) {
282 $self->$attr ($arg{$attr}) if exists $arg{$attr};
283 }
284
285 $self
286 }
287
288 =item ($signal_func, $signal_arg) = $async->signal_func
289
290 Returns the address of a function to call asynchronously. The function
291 has the following prototype and needs to be passed the specified
292 C<$signal_arg>, which is a C<void *> cast to C<IV>:
293
294 void (*signal_func) (void *signal_arg, int value)
295
296 An example call would look like:
297
298 signal_func (signal_arg, 0);
299
300 The function is safe to call from within signal and thread contexts, at
301 any time. The specified C<value> is passed to both C and Perl callback.
302
303 C<$value> must be in the valid range for a C<sig_atomic_t>, except C<0>
304 (1..127 is portable).
305
306 If the function is called while the Async::Interrupt object is already
307 signaled but before the callbacks are being executed, then the stored
308 C<value> is either the old or the new one. Due to the asynchronous
309 nature of the code, the C<value> can even be passed to two consecutive
310 invocations of the callback.
311
312 =item $address = $async->c_var
313
314 Returns the address (cast to IV) of an C<IV> variable. The variable is set
315 to C<0> initially and gets set to the passed value whenever the object
316 gets signalled, and reset to C<0> once the interrupt has been handled.
317
318 Note that it is often beneficial to just call C<PERL_ASYNC_CHECK ()> to
319 handle any interrupts.
320
321 Example: call some XS function to store the address, then show C code
322 waiting for it.
323
324 my_xs_func $async->c_var;
325
326 static IV *valuep;
327
328 void
329 my_xs_func (void *addr)
330 CODE:
331 valuep = (IV *)addr;
332
333 // code in a loop, waiting
334 while (!*valuep)
335 ; // do something
336
337 =item $async->signal ($value=1)
338
339 This signals the given async object from Perl code. Semi-obviously, this
340 will instantly trigger the callback invocation (it does not, as the name
341 might imply, do anything with POSIX signals).
342
343 C<$value> must be in the valid range for a C<sig_atomic_t>, except C<0>
344 (1..127 is portable).
345
346 =item $async->signal_hysteresis ($enable)
347
348 Enables or disables signal hysteresis (default: disabled). If a POSIX
349 signal is used as a signal source for the interrupt object, then enabling
350 signal hysteresis causes Async::Interrupt to reset the signal action to
351 C<SIG_IGN> in the signal handler and restore it just before handling the
352 interruption.
353
354 When you expect a lot of signals (e.g. when using SIGIO), then enabling
355 signal hysteresis can reduce the number of handler invocations
356 considerably, at the cost of two extra syscalls.
357
358 Note that setting the signal to C<SIG_IGN> can have unintended side
359 effects when you fork and exec other programs, as often they do nto expect
360 signals to be ignored by default.
361
362 =item $async->block
363
364 =item $async->unblock
365
366 Sometimes you need a "critical section" of code that will not be
367 interrupted by an Async::Interrupt. This can be implemented by calling C<<
368 $async->block >> before the critical section, and C<< $async->unblock >>
369 afterwards.
370
371 Note that there must be exactly one call of C<unblock> for every previous
372 call to C<block> (i.e. calls can nest).
373
374 Since ensuring this in the presence of exceptions and threads is
375 usually more difficult than you imagine, I recommend using C<<
376 $async->scoped_block >> instead.
377
378 =item $async->scope_block
379
380 This call C<< $async->block >> and installs a handler that is called when
381 the current scope is exited (via an exception, by canceling the Coro
382 thread, by calling last/goto etc.).
383
384 This is the recommended (and fastest) way to implement critical sections.
385
386 =item ($block_func, $block_arg) = $async->scope_block_func
387
388 Returns the address of a function that implements the C<scope_block>
389 functionality.
390
391 It has the following prototype and needs to be passed the specified
392 C<$block_arg>, which is a C<void *> cast to C<IV>:
393
394 void (*block_func) (void *block_arg)
395
396 An example call would look like:
397
398 block_func (block_arg);
399
400 The function is safe to call only from within the toplevel of a perl XS
401 function and will call C<LEAVE> and C<ENTER> (in this order!).
402
403 =item $async->pipe_enable
404
405 =item $async->pipe_disable
406
407 Enable/disable signalling the pipe when the interrupt occurs (default is
408 enabled). Writing to a pipe is relatively expensive, so it can be disabled
409 when you know you are not waiting for it (for example, with L<EV> you
410 could disable the pipe in a check watcher, and enable it in a prepare
411 watcher).
412
413 Note that currently, while C<pipe_disable> is in effect, no attempt to
414 read from the pipe will be done when handling events. This might change as
415 soon as I realize why this is a mistake.
416
417 =item $fileno = $async->pipe_fileno
418
419 Returns the reading side of the signalling pipe. If no signalling pipe is
420 currently attached to the object, it will dynamically create one.
421
422 Note that the only valid oepration on this file descriptor is to wait
423 until it is readable. The fd might belong currently to a pipe, a tcp
424 socket, or an eventfd, depending on the platform, and is guaranteed to be
425 C<select>able.
426
427 =item $async->pipe_autodrain ($enable)
428
429 Enables (C<1>) or disables (C<0>) automatic draining of the pipe (default:
430 enabled). When automatic draining is enabled, then Async::Interrupt will
431 automatically clear the pipe. Otherwise the user is responsible for this
432 draining.
433
434 This is useful when you want to share one pipe among many Async::Interrupt
435 objects.
436
437 =item $async->post_fork
438
439 The object will not normally be usable after a fork (as the pipe fd is
440 shared between processes). Calling this method after a fork in the child
441 ensures that the object will work as expected again. It only needs to be
442 called when the async object is used in the child.
443
444 This only works when the pipe was created by Async::Interrupt.
445
446 Async::Interrupt ensures that the reading file descriptor does not change
447 it's value.
448
449 =item $signum = Async::Interrupt::sig2num $signame_or_number
450
451 =item $signame = Async::Interrupt::sig2name $signame_or_number
452
453 These two convenience functions simply convert a signal name or number to
454 the corresponding name or number. They are not used by this module and
455 exist just because perl doesn't have a nice way to do this on its own.
456
457 They will return C<undef> on illegal names or numbers.
458
459 =back
460
461 =head1 THE Async::Interrupt::EventPipe CLASS
462
463 Pipes are the predominent utility to make asynchronous signals
464 synchronous. However, pipes are hard to come by: they don't exist on the
465 broken windows platform, and on GNU/Linux systems, you might want to use
466 an C<eventfd> instead.
467
468 This class creates selectable event pipes in a portable fashion: on
469 windows, it will try to create a tcp socket pair, on GNU/Linux, it will
470 try to create an eventfd and everywhere else it will try to use a normal
471 pipe.
472
473 =over 4
474
475 =item $epipe = new Async::Interrupt::EventPipe
476
477 This creates and returns an eventpipe object. This object is simply a
478 blessed array reference:
479
480 =item ($r_fd, $w_fd) = $epipe->filenos
481
482 Returns the read-side file descriptor and the write-side file descriptor.
483
484 Example: pass an eventpipe object as pipe to the Async::Interrupt
485 constructor, and create an AnyEvent watcher for the read side.
486
487 my $epipe = new Async::Interrupt::EventPipe;
488 my $asy = new Async::Interrupt pipe => [$epipe->filenos];
489 my $iow = AnyEvent->io (fh => $epipe->fileno, poll => 'r', cb => sub { });
490
491 =item $r_fd = $epipe->fileno
492
493 Return only the reading/listening side.
494
495 =item $epipe->signal
496
497 Write something to the pipe, in a portable fashion.
498
499 =item $epipe->drain
500
501 Drain (empty) the pipe.
502
503 =item $epipe->renew
504
505 Recreates the pipe (useful after a fork). The reading side will not change
506 it's file descriptor number, but the writing side might.
507
508 =back
509
510 =cut
511
512 1;
513
514 =head1 EXAMPLE
515
516 There really should be a complete C/XS example. Bug me about it. Better
517 yet, create one.
518
519 =head1 IMPLEMENTATION DETAILS AND LIMITATIONS
520
521 This module works by "hijacking" SIGKILL, which is guaranteed to always
522 exist, but also cannot be caught, so is always available.
523
524 Basically, this module fakes the occurance of a SIGKILL signal and
525 then intercepts the interpreter handling it. This makes normal signal
526 handling slower (probably unmeasurably, though), but has the advantage
527 of not requiring a special runops function, nor slowing down normal perl
528 execution a bit.
529
530 It assumes that C<sig_atomic_t>, C<int> and C<IV> are all async-safe to
531 modify.
532
533 =head1 AUTHOR
534
535 Marc Lehmann <schmorp@schmorp.de>
536 http://home.schmorp.de/
537
538 =cut
539