Hi,

As Oleg clarified, this issue arises even without threads, in native code as 
well as bytecode executions (with differences due to when signals are 
processed). Let me further distinguish several scenarios:


1) Writing third-party libraries that are safe under asynchronous exceptions

With some care, it is possible to write third-party Ocaml libraries that are 
safe even if asynchronous exceptions occur. One way would be to write in purely 
functional style, another would be to fork and execute a separate process, yet 
another would be to carefully arrange the code to avoid signals (as Fabrice 
suggested for queue.ml). However, I don't believe it would be possible to 
implement, for example, memoization or hashconsing, in a purely functional 
manner or by forking; forking would be impractical to implement libraries such 
as imperative graph data structures; and it may not always be possible to 
rearrange the code in a safe manner.

Instead, I propose to provide signal masking functions (sigprocmask), e.g., 
mask_signals and unmask_signals, to bracket regions of code where signals 
should not be processed. It would be great if these were part of the standard 
library, since they require some knowledge of how the Ocaml runtime handles 
signal processing, in particular, to flush signals that have been recorded by 
the runtime, but not yet dispatched, before entering the signal-masked code 
region.

(Unix.sigprocmask may work, though it has a higher overhead since the signal 
mask is encoded as a list.)

Another reason to have this in the standard library would be to support 
reentrancy, i.e., of a signal-masked code region calling another function that 
itself enters signal-masking, and not accidentally unmask signals prematurely 
(see http://hackage.haskell.org/trac/ghc/ticket/1036 for example). Having 
libraries implement signal-masking in an ad-hoc manner is likely to lead to 
such mistakes.



2) Writing applications that are safe that use libraries that are unsafe under 
asynchronous exceptions

Even if libraries are unsafe, applications can be written safely by carefully 
wrapping those library functions with signal-masking functions as above.



3) The OCaml standard library

I don't think that the OCaml standard library needs to be changed, if 
applications can wrap these libraries as above. It would be useful to document 
which libraries are safe to use under asynchronous exceptions, if only for a 
small performance consideration. Alternatively, if signal masking isn't 
available, then it would be useful to document the hazards of asynchronous 
exceptions under Sys.signal and similar functions.

I may have missed it, but does the OCaml manual explain exactly where signals 
are processed (other than reading the source code)? If so, it would also be 
useful to link to it from Sys.signal and friends.


Yit
July 6, 2011

-- 
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to