aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2014-12-12 15:13:31 +0100
committerLukas Larsson <[email protected]>2014-12-19 10:39:53 +0100
commitbd4b900c09308a6c3ab41e3a2070cb90410ee01d (patch)
tree9b56a9e064380ddec8b46e7179a1baa3f95a775b
parentffd0153e6dffcc29cf79d0191860047dba0438bb (diff)
downloadotp-bd4b900c09308a6c3ab41e3a2070cb90410ee01d.tar.gz
otp-bd4b900c09308a6c3ab41e3a2070cb90410ee01d.tar.bz2
otp-bd4b900c09308a6c3ab41e3a2070cb90410ee01d.zip
erts: Make main thread safe from pipe closed event
-rw-r--r--erts/emulator/sys/unix/sys.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index 57f9fbef53..e1a932fdda 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -3290,9 +3290,11 @@ erts_sys_main_thread(void)
#endif
smp_sig_notify(0); /* Notify initialized */
- while (1) {
- /* Wait for a signal to arrive... */
+
+ /* Wait for a signal to arrive... */
+
#ifdef __DARWIN__
+ while (1) {
/*
* The wx driver needs to be able to steal the main thread for Cocoa to
* work properly.
@@ -3307,12 +3309,24 @@ erts_sys_main_thread(void)
void* (*func)(void*);
void* arg;
void *resp;
- read(erts_darwin_main_thread_pipe[0],&func,sizeof(void* (*)(void*)));
- read(erts_darwin_main_thread_pipe[0],&arg, sizeof(void*));
+ res = read(erts_darwin_main_thread_pipe[0],&func,sizeof(void* (*)(void*)));
+ if (res != sizeof(void* (*)(void*)))
+ break;
+ res = read(erts_darwin_main_thread_pipe[0],&arg,sizeof(void*));
+ if (res != sizeof(void*))
+ break;
resp = (*func)(arg);
write(erts_darwin_main_thread_result_pipe[1],&resp,sizeof(void *));
}
-#else
+
+ if (res == -1 && errno != EINTR)
+ break;
+ }
+ /* Something broke with the main thread pipe, so we ignore it for now.
+ Most probably erts has closed this pipe and is about to exit. */
+#endif /* #ifdef __DARWIN__ */
+
+ while (1) {
#ifdef DEBUG
int res =
#else
@@ -3321,7 +3335,6 @@ erts_sys_main_thread(void)
select(0, NULL, NULL, NULL, NULL);
ASSERT(res < 0);
ASSERT(errno == EINTR);
-#endif
}
}