Don't run pthread exit handlers on application exit (#14751)

It should only be executed when a thread is exiting (or when
pthread_exit is explicitly called).

This reverts commit 6d3e78c partially.
This commit is contained in:
Kleis Auke Wolthuizen 2021-07-25 19:43:09 +02:00 коммит произвёл GitHub
Родитель a4f28074f2
Коммит 5af6a110ee
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
6 изменённых файлов: 26 добавлений и 10 удалений

Просмотреть файл

@ -1034,8 +1034,10 @@ var LibraryPThread = {
__pthread_exit_js__deps: ['exit'],
__pthread_exit_js: function(status) {
if (!ENVIRONMENT_IS_PTHREAD) _exit(status);
else PThread.threadExit(status);
if (!ENVIRONMENT_IS_PTHREAD) {
PThread.runExitHandlers();
_exit(status);
} else PThread.threadExit(status);
// pthread_exit is marked noReturn, so we must not return from it.
throw 'unwind';
},

Просмотреть файл

@ -24,9 +24,6 @@ function run() {
var ret = _main();
#if EXIT_RUNTIME
#if USE_PTHREADS
PThread.runExitHandlers();
#endif
callRuntimeCallbacks(__ATEXIT__);
<<< ATEXITS >>>
#endif

Просмотреть файл

@ -419,9 +419,6 @@ function exitRuntime() {
checkStackCookie();
#endif
#if USE_PTHREADS
#if EXIT_RUNTIME
PThread.runExitHandlers();
#endif
if (ENVIRONMENT_IS_PTHREAD) return; // PThreads reuse the runtime from the main thread.
#endif
#if EXIT_RUNTIME

Просмотреть файл

@ -4,12 +4,19 @@
// found in the LICENSE file.
#include <assert.h>
#include <stdio.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void destructor(void* arg) {
#if defined(RETURN) || defined(EXIT)
// The destructors for thread-specific data should only be executed
// when a thread exits or when pthread_exit is explicitly called.
assert(0 && "pthread key dtor should not be executed on application exit");
#else
printf("destructor: %ld\n", (long)arg);
assert(arg == (void*)42);
#endif
}
int main() {
@ -20,5 +27,12 @@ int main() {
pthread_setspecific(key, (void*)42);
val = pthread_getspecific(key);
assert(val == (void*)42);
printf("done!\n");
#ifdef RETURN
return 0;
#elif defined(EXIT)
exit(0);
#else
pthread_exit(0);
#endif
}

Просмотреть файл

@ -1 +1,2 @@
done!
destructor: 42

5
tests/test_core.py поставляемый
Просмотреть файл

@ -2335,6 +2335,11 @@ The current type of b is: 9
@node_pthreads
def test_pthread_setspecific_mainthread(self):
self.set_setting('EXIT_RUNTIME')
print('.. return')
self.do_runf(test_file('pthread/test_pthread_setspecific_mainthread.c'), 'done!', emcc_args=['-DRETURN'])
print('.. exit')
self.do_runf(test_file('pthread/test_pthread_setspecific_mainthread.c'), 'done!', emcc_args=['-DEXIT'])
print('.. pthread_exit')
self.do_run_in_out_file_test('pthread/test_pthread_setspecific_mainthread.c')
@node_pthreads