caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: Ian T Zimmerman <itz@transbay.net>, caml-list@inria.fr
Subject: Re: Catching Break?
Date: Tue, 26 Jan 1999 01:24:35 +0100	[thread overview]
Message-ID: <19990126012435.21454@pauillac.inria.fr> (raw)
In-Reply-To: <199901251843.KAA23637@kronstadt.transbay.net>; from Ian T Zimmerman on Mon, Jan 25, 1999 at 10:43:01AM -0800

> Why doesn't this work:
> 
> let main() =
>   Sys.catch_break true;
>   try Unix.kill (Unix.getpid()) Sys.sigint
>   with Sys.Break -> prerr_endline "CAUGHT!"; exit 0
> 
> let _ = main()
> 
> This program just prints "Fatal error: Uncaught exception Sys.Break"
> as if the try block weren't there.  Am I overlooking something really
> obvious?

No, it's fairly subtle, actually.  For various reasons related to the
Caml runtime system, signals in OCaml are not necessarily handled at
the program point where they are received: the signal handler is
called only at the next "safe" program point.

In the case of the ocamlc bytecode interpreter, "safe" program points
are at function application and at the beginning of each loop iteration.
So, in your example above, we leave the "try..with" before the handler
for the signal is called, and that handler thus raises the Sys.Break
exception outside of the "try..with".

If you add a function call after the Unix.kill, everything should work
as expected:

> let main() =
>   Sys.catch_break true;
>   try Unix.kill (Unix.getpid()) Sys.sigint; prerr_endline "Sent signal"
>   with Sys.Break -> prerr_endline "CAUGHT!"; exit 0

This is actually a minor OCaml bug; it would be better to check for
pending signals just before leaving a "try..with" block.  I'll see
what can be done about it.

- Xavier Leroy




  reply	other threads:[~1999-01-26 17:44 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-01-25 18:43 Ian T Zimmerman
1999-01-26  0:24 ` Xavier Leroy [this message]
1999-01-26  6:46   ` Ian T Zimmerman
1999-01-28 11:14     ` Xavier Leroy
1999-01-28 17:33       ` Ian T Zimmerman
1999-02-06  8:24         ` Ian T Zimmerman
1999-02-09  7:02           ` Ian T Zimmerman
1999-02-10 15:48             ` Xavier Leroy
1999-02-05 18:00   ` Ian T Zimmerman
1999-02-08 17:16     ` Xavier Leroy
1999-01-26  5:17 Frank A. Christoph
1999-01-26 11:23 Toby Moth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=19990126012435.21454@pauillac.inria.fr \
    --to=xavier.leroy@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=itz@transbay.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).