From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id 57733BC0A for ; Tue, 17 Apr 2007 15:56:15 +0200 (CEST) Received: from smtp.uibk.ac.at (lmr1.uibk.ac.at [138.232.1.142]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l3HDuE2i026109 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 17 Apr 2007 15:56:15 +0200 Received: from smc.uibk.ac.at (smc.uibk.ac.at [138.232.1.226] c703350@smc.uibk.ac.at) by smtp.uibk.ac.at (8.13.8/8.13.1/F1) with ESMTP id l3HDuD3r004475 for ; Tue, 17 Apr 2007 15:56:13 +0200 Received: from smc.uibk.ac.at (localhost [127.0.0.1] c703350@smc.uibk.ac.at) by smc.uibk.ac.at (8.13.8+Sun/uibk) with ESMTP id l3HDuDvK013709 for ; Tue, 17 Apr 2007 15:56:13 +0200 (MEST) Received: (from c703350@localhost) by smc.uibk.ac.at (8.13.8+Sun/8.13.8/Submit) id l3HDuDKa013707 for caml-list@yquem.inria.fr; Tue, 17 Apr 2007 15:56:13 +0200 (MEST) Date: Tue, 17 Apr 2007 15:56:13 +0200 From: Christian Sternagel To: caml-list@yquem.inria.fr Subject: Re: [Caml-list] Interfacing C-code with ocaml and Exception handling Message-ID: <20070417135613.GE3368@pc6197-c703.uibk.ac.at> Mail-Followup-To: caml-list@yquem.inria.fr References: <20070417113557.GC3368@pc6197-c703.uibk.ac.at> <1176811379.2316.13.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1176811379.2316.13.camel@localhost.localdomain> User-Agent: Mutt/1.4.2.2i X-Scanned-By: MIMEDefang 2.58 at uibk.ac.at on 138.232.1.140 X-Miltered: at discorde with ID 4624D1FE.001 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; interfacing:01 ocaml:01 0200,:01 gerd:01 stolpmann:01 ocaml:01 concretely:01 implements:01 sig:01 sig:01 stub:01 o'caml:01 stub:01 cheers:01 gerd:01 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 > ------------------------------------------------------------ >