From 160e4050d82aa38be7f68dd33e4b82b86f09ab39 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sun, 25 Feb 2007 12:38:36 +0000 Subject: Raise Sys_blocked_io only in I/O operations that return EAGAIN/EWOULDBLOCK. Other, non-I/O related system calls can also return EAGAIN (e.g. in Sys.command); these should raise Sys_error, not Sys_blocked_io git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@7919 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/sys.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'byterun/sys.c') diff --git a/byterun/sys.c b/byterun/sys.c index 9d3bedbbb..801b1303b 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -73,23 +73,28 @@ CAMLexport void caml_sys_error(value arg) char * err; CAMLlocal1 (str); + err = error_message(); + if (arg == NO_ARG) { + str = caml_copy_string(err); + } else { + int err_len = strlen(err); + int arg_len = caml_string_length(arg); + str = caml_alloc_string(arg_len + 2 + err_len); + memmove(&Byte(str, 0), String_val(arg), arg_len); + memmove(&Byte(str, arg_len), ": ", 2); + memmove(&Byte(str, arg_len + 2), err, err_len); + } + caml_raise_sys_error(str); + CAMLnoreturn; +} + +CAMLexport void caml_sys_io_error(value arg) +{ if (errno == EAGAIN || errno == EWOULDBLOCK) { caml_raise_sys_blocked_io(); } else { - err = error_message(); - if (arg == NO_ARG) { - str = caml_copy_string(err); - } else { - int err_len = strlen(err); - int arg_len = caml_string_length(arg); - str = caml_alloc_string(arg_len + 2 + err_len); - memmove(&Byte(str, 0), String_val(arg), arg_len); - memmove(&Byte(str, arg_len), ": ", 2); - memmove(&Byte(str, arg_len + 2), err, err_len); - } - caml_raise_sys_error(str); + caml_sys_error(arg); } - CAMLnoreturn; } CAMLprim value caml_sys_exit(value retcode) -- cgit v1.2.3-70-g09d2