Re: Catching Break?

From: Xavier Leroy (Xavier.Leroy@inria.fr)
Date: Wed Feb 10 1999 - 16:48:45 MET


Date: Wed, 10 Feb 1999 16:48:45 +0100
From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: Ian T Zimmerman <itz@transbay.net>, caml-list@inria.fr
Subject: Re: Catching Break?
In-Reply-To: <m2socg2h5v.fsf@kronstadt.transbay.net>; from Ian T Zimmerman on Mon, Feb 08, 1999 at 11:02:52PM -0800

I'm glad you've figured out the problem, because I couldn't see it
from your sources...

In your example, it's indeed hard to guess which of the exceptions
Unix_error(EINTR) and Sys.Break will be raised. Unix_error is raised
when the system call returns an "interrupted" error code, while
Sys.Break is raised when the handler associated with the signal is
executed. Depending on the system call in question and on whether it
is restartable or not in case of signal, either of the two exceptions
can be raised first. Moreover, if Unix_error occurs first and is
caught, Sys.Break can still occur at the next safe point, so it's
certainly very confusing.

If you're certain that all the system calls used are not restartable
(i.e. return EINTR immediately when interrupted by a signal),
a perhaps cleaner solution is to register an empty handler for SIGINT:

        Sys.handle Sys.sigint (fun _ -> ())

However, this is not portable (different Unixes have different restart
behaviors).

Perhaps pending signals should also be tested when an exception is
raised. I'll have to think about this.

All the best,

- Xavier Leroy



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:19 MET