diff --git a/src/library_pthread.js b/src/library_pthread.js index bd21ae10700bb..a941a3b5c8bf5 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -901,7 +901,7 @@ var LibraryPThread = { emscripten_check_blocking_allowed__deps: ['$warnOnce'], emscripten_check_blocking_allowed: function() { -#if ASSERTIONS || !MINIMAL_RUNTIME || !ALLOW_BLOCKING_ON_MAIN_THREAD +#if (ASSERTIONS || !ALLOW_BLOCKING_ON_MAIN_THREAD) && !MINIMAL_RUNTIME #if ENVIRONMENT_MAY_BE_NODE if (ENVIRONMENT_IS_NODE) return; #endif diff --git a/test/test_browser.py b/test/test_browser.py index b66e1438c4fd6..3374c8d8a57a8 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -3800,23 +3800,31 @@ def test_pthread_64bit_cxx11_atomics(self, opt): def test_pthread_hardware_concurrency(self): self.btest_exit(test_file('pthread/test_pthread_hardware_concurrency.cpp'), args=['-O2', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE="navigator.hardwareConcurrency"']) - @parameterized({ - 'join': ('join',), - 'wait': ('wait',), - }) + # Test that we error if not ALLOW_BLOCKING_ON_MAIN_THREAD + @requires_threads + def test_pthread_main_thread_blocking_wait(self): + self.btest(test_file('pthread/main_thread_wait.cpp'), expected='abort:Blocking on the main thread is not allowed by default.', args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) + + # Test that we error or warn depending on ALLOW_BLOCKING_ON_MAIN_THREAD or ASSERTIONS @requires_threads - def test_pthread_main_thread_blocking(self, name): - print('Test that we error if not ALLOW_BLOCKING_ON_MAIN_THREAD') - self.btest(test_file('pthread/main_thread_%s.cpp' % name), expected='abort:Blocking on the main thread is not allowed by default.', args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) - if name == 'join': - print('Test that by default we just warn about blocking on the main thread.') - self.btest_exit(test_file('pthread/main_thread_%s.cpp' % name), args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE']) - print('Test that tryjoin is fine, even if not ALLOW_BLOCKING_ON_MAIN_THREAD') - self.btest_exit(test_file('pthread/main_thread_join.cpp'), assert_returncode=2, args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-g', '-DTRY_JOIN', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) - print('Test that tryjoin is fine, even if not ALLOW_BLOCKING_ON_MAIN_THREAD, and even without a pool') - self.btest_exit(test_file('pthread/main_thread_join.cpp'), assert_returncode=2, args=['-O3', '-sUSE_PTHREADS', '-g', '-DTRY_JOIN', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) - print('Test that everything works ok when we are on a pthread.') - self.btest_exit(test_file('pthread/main_thread_%s.cpp' % name), args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-sPROXY_TO_PTHREAD', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) + def test_pthread_main_thread_blocking_join(self): + create_file('pre.js', ''' + Module['printErr'] = (x) => { + if (x.includes('Blocking on the main thread is very dangerous')) { + maybeReportResultToServer('got_warn'); + } + }; + ''') + # Test that we warn about blocking on the main thread in debug builds + self.btest(test_file('pthread/main_thread_join.cpp'), expected='got_warn', args=['-sEXIT_RUNTIME', '-sASSERTIONS', '--pre-js', 'pre.js', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE']) + # Test that we do not warn about blocking on the main thread in release builds + self.btest_exit(test_file('pthread/main_thread_join.cpp'), args=['-O3', '--pre-js', 'pre.js', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE']) + # Test that tryjoin is fine, even if not ALLOW_BLOCKING_ON_MAIN_THREAD + self.btest_exit(test_file('pthread/main_thread_join.cpp'), assert_returncode=2, args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-g', '-DTRY_JOIN', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) + # Test that tryjoin is fine, even if not ALLOW_BLOCKING_ON_MAIN_THREAD, and even without a pool + self.btest_exit(test_file('pthread/main_thread_join.cpp'), assert_returncode=2, args=['-O3', '-sUSE_PTHREADS', '-g', '-DTRY_JOIN', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) + # Test that everything works ok when we are on a pthread + self.btest_exit(test_file('pthread/main_thread_join.cpp'), args=['-O3', '-sUSE_PTHREADS', '-sPTHREAD_POOL_SIZE', '-sPROXY_TO_PTHREAD', '-sALLOW_BLOCKING_ON_MAIN_THREAD=0']) # Test the old GCC atomic __sync_fetch_and_op builtin operations. @requires_threads