aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/nifs/win32
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2018-11-13 11:55:48 +0100
committerJohn Högberg <[email protected]>2018-11-13 16:43:49 +0100
commitd15bd6b9366ff4eef81ec9c4bcc875dfe694fe98 (patch)
tree01fae71e46df08266e586c2048ecff11bc7e58f8 /erts/emulator/nifs/win32
parentd9682b02b81fa6e23e554b6e017650eb89ecebed (diff)
downloadotp-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.c7
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;
}