Browse thread
Interfacing C-code with ocaml and Exception handling
-
Christian Sternagel
-
Gerd Stolpmann
- Christian Sternagel
-
Gerd Stolpmann
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-04-17 (13:56) |
From: | Christian Sternagel <christian.sternagel@u...> |
Subject: | Re: [Caml-list] Interfacing C-code with ocaml and Exception handling |
On Tue, Apr 17, 2007 at 02:02:58PM +0200, Gerd Stolpmann wrote: > Am Dienstag, den 17.04.2007, 13:35 +0200 schrieb Christian Sternagel: > > I'm not sure whether this question was asked before (at least I didn't find any answer). Can it be, that raising an (OCaml)Exception during execution of > > C-code (interfaced with OCaml) is simply ignored? > > > > More concretely an example: > > > > We have a module Timer that implements execution of functions given a certain timeout. Therefor we have the function > > > > Timer.run : float -> (unit -> 'a) -> 'a > > > > where [Timer.run t f] starts a timer raising the signal SIG_ALRM after > > [t] seconds and executes [f ()]. If [f] finishes in time the result of > > [f ()] is returned. In the background a handler for SIG_ALRM is installed, that just raises the exception [Timer.Timeout]. The implementation of > > [Timer.run] looks like this: > > > > let run t f = > > try > > start t; > > let result = f () in > > stop (); > > result > > with > > | e -> stop (); raise e > > ;; > > > > and the handler assigned to SIG_ALRM like this > > > > let handler _ = raise Timeout;; > > > > where [start] and [stop] take care of a [Unix.itimer]. The intended behaviour is that if [f ()] finishes within time the result is returned and the exception [Timeout] is raised otherwise. This works fine, as long as the used [f] is implemented in OCaml. But when [f] is just an OCaml stub for a C-function, then the handler for SIG_ALRM is called (and hence the exception Timeout is raised) > > Are you sure? I would be a bit surprised if the handler was actually > called. Signal handlers written in O'Caml behave differently than those You are right, the handler is not called, my fault. > written in C: The execution is deferred until the next safe point. When > you call a C stub, this is certainly not before the stub returns. > > > but no exception [Timeout] arrives anywhere and hence the code of [f] runs as long as it needs ignoring any timeout. > > > > My theory is that when SIG_ALRM is raised during execution of C-code, than > > the [raise Timeout] statement raises an exception but as there is no context set up for exception handling this exception just gets lost. > > No, this usually works. > > > Is this theory correct and are there any suggestions how to work around this problem (implementing timed execution of arbitrary code). > > Arbitrary code? No way to make that happen. For specific cases: yes, > there are many ways to do it. I don't really need that for arbitraty code. Our tool calls a stub-function that executes C-code of a SAT-Solver. And I want to make sure, that this function stops after a certain timeout. Are there any suggestions? cheers christian > > Gerd > > > > > thnx in advance > > > > christian > > > > _______________________________________________ > > Caml-list mailing list. Subscription management: > > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > > Archives: http://caml.inria.fr > > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > > Bug reports: http://caml.inria.fr/bin/caml-bugs > > > -- > ------------------------------------------------------------ > Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany > gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de > Phone: +49-6151-153855 Fax: +49-6151-997714 > ------------------------------------------------------------ >