Skip to content

Regression on Out_channel exceptions #12898

@jmid

Description

@jmid

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions