Version française
Home     About     Download     Resources     Contact us    
Browse thread
Catching Break?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: Re: Catching Break?
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