Version française
Home     About     Download     Resources     Contact us    
Browse thread
Interfacing C-code with ocaml and Exception handling
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
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
> ------------------------------------------------------------
>