-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
As part of revising our Out_channel multicoretests I discovered the following regression.
Consider the following program writing to a closed channel twice:
let path = "/tmp/foo.txt" in
let oc = Out_channel.open_text path in
let () = Out_channel.close oc in
let () =
try Out_channel.output_char oc '1'; Printf.printf " 1 OK%!"
with Sys_error _ -> Printf.printf " 1 Sys_error%!" in
let () =
try Out_channel.output_char oc '2'; Printf.printf " 2 OK%!"
with Sys_error _ -> Printf.printf " 2 Sys_error%!" in
()On 4.14.1, 5.0.0, 5.1.0, 5.1.1 this behaves the same, yielding an exception in both cases:
$ ocaml /tmp/ocbug.ml
1 Sys_error 2 Sys_error
However, on 5.2 and on trunk/5.3 this no longer raises an exception in the second case.
$ ocaml /tmp/ocbug.ml
1 Sys_error 2 OK
The issue is not limited to output_char. The other output operations output_byte, output_string, ... are also affected.
Looking at changes in runtime/io.c I've established that the behaviour changed with #12314.
A compiler built from the previous commit to trunk / 5.2 exhibits the previous behaviour:
- c717b6b - (6 months ago)
Merge pull request #12114 from fabbing/tsan_patch