diff options
author | John Högberg <[email protected]> | 2018-11-13 11:55:48 +0100 |
---|---|---|
committer | John Högberg <[email protected]> | 2018-11-13 16:43:49 +0100 |
commit | d15bd6b9366ff4eef81ec9c4bcc875dfe694fe98 (patch) | |
tree | 01fae71e46df08266e586c2048ecff11bc7e58f8 /erts/emulator/nifs/common/prim_file_nif.h | |
parent | d9682b02b81fa6e23e554b6e017650eb89ecebed (diff) | |
download | otp-d15bd6b9366ff4eef81ec9c4bcc875dfe694fe98.tar.gz otp-d15bd6b9366ff4eef81ec9c4bcc875dfe694fe98.tar.bz2 otp-d15bd6b9366ff4eef81ec9c4bcc875dfe694fe98.zip |
Avoid closing files in gc/monitor callbacks
Closing files in these callbacks could block scheduler progress
and cause major system instability. We now defer these operations
to a dedicated process instead.
This process may in turn block forever and prevent further orphaned
files from being closed, but it will keep the emulator itself from
misbehaving.
Diffstat (limited to 'erts/emulator/nifs/common/prim_file_nif.h')
-rw-r--r-- | erts/emulator/nifs/common/prim_file_nif.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/erts/emulator/nifs/common/prim_file_nif.h b/erts/emulator/nifs/common/prim_file_nif.h index 099c06c48c..b2e30c59dd 100644 --- a/erts/emulator/nifs/common/prim_file_nif.h +++ b/erts/emulator/nifs/common/prim_file_nif.h @@ -159,8 +159,11 @@ posix_errno_t efile_open(const efile_path_t *path, enum efile_modes_t modes, ErlNifResourceType *nif_type, efile_data_t **d); /** @brief Closes a file. The file must have entered the CLOSED state prior to - * calling this to prevent double close. */ -int efile_close(efile_data_t *d); + * calling this to prevent double close. + * + * Note that the file is completely invalid after this point, so the error code + * is provided in \c error rather than d->posix_errno. */ +int efile_close(efile_data_t *d, posix_errno_t *error); /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */ |