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/win32 | |
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/win32')
-rw-r--r-- | erts/emulator/nifs/win32/win_prim_file.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/erts/emulator/nifs/win32/win_prim_file.c b/erts/emulator/nifs/win32/win_prim_file.c index 602a282dd1..d0aa70542f 100644 --- a/erts/emulator/nifs/win32/win_prim_file.c +++ b/erts/emulator/nifs/win32/win_prim_file.c @@ -466,18 +466,21 @@ posix_errno_t efile_open(const efile_path_t *path, enum efile_modes_t modes, } } -int efile_close(efile_data_t *d) { +int efile_close(efile_data_t *d, posix_errno_t *error) { efile_win_t *w = (efile_win_t*)d; HANDLE handle; + ASSERT(enif_thread_type() == ERL_NIF_THR_DIRTY_IO_SCHEDULER); ASSERT(erts_atomic32_read_nob(&d->state) == EFILE_STATE_CLOSED); ASSERT(w->handle != INVALID_HANDLE_VALUE); handle = w->handle; w->handle = INVALID_HANDLE_VALUE; + enif_release_resource(d); + if(!CloseHandle(handle)) { - w->common.posix_errno = windows_to_posix_errno(GetLastError()); + *error = windows_to_posix_errno(GetLastError()); return 0; } |