diff --git a/test/test_browser.py b/test/test_browser.py
index abf207e33761e..186bad2d23580 100644
--- a/test/test_browser.py
+++ b/test/test_browser.py
@@ -3693,11 +3693,17 @@ def test_pthread_gcc_spinlock(self):
'': ([],),
'O3': (['-O3'],),
'minimal_runtime': (['-sMINIMAL_RUNTIME'],),
+ 'single_file': (['-sSINGLE_FILE'],),
})
def test_pthread_create(self, args):
self.btest_exit('pthread/test_pthread_create.c',
args=['-pthread', '-sPTHREAD_POOL_SIZE=8'] + args,
extra_tries=0) # this should be 100% deterministic
+ files = os.listdir('.')
+ if '-sSINGLE_FILE' in args:
+ self.assertEqual(len(files), 1, files)
+ else:
+ self.assertEqual(len(files), 4, files)
# Test that preallocating worker threads work.
def test_pthread_preallocates_workers(self):
diff --git a/tools/link.py b/tools/link.py
index 992939059c111..1a5b6c931fdda 100644
--- a/tools/link.py
+++ b/tools/link.py
@@ -2079,7 +2079,7 @@ def phase_final_emitting(options, state, target, wasm_target):
return
target_dir = os.path.dirname(os.path.abspath(target))
- if settings.PTHREADS and not settings.STRICT:
+ if settings.PTHREADS and not settings.STRICT and not settings.SINGLE_FILE:
worker_file = shared.replace_suffix(target, get_worker_js_suffix())
write_file(worker_file, '''\
// This file is no longer used by emscripten and has been created as a placeholder
@@ -2535,14 +2535,19 @@ def generate_traditional_runtime_html(target, options, js_target, target_basenam
# Normal code generation path
script.src = base_js_target
- # inline script for SINGLE_FILE output
if settings.SINGLE_FILE:
- js_contents = script.inline or ''
- if script.src:
- js_contents += read_file(js_target)
+ # In SINGLE_FILE mode we either inline the script, or in the case
+ # of SHARED_MEMORY convert the entire thing into a data URL.
+ if settings.SHARED_MEMORY:
+ assert not script.inline
+ script.src = get_subresource_location(js_target)
+ else:
+ js_contents = script.inline or ''
+ if script.src:
+ js_contents += read_file(js_target)
+ script.src = None
+ script.inline = read_file(js_target)
delete_file(js_target)
- script.src = None
- script.inline = js_contents
else:
if not settings.WASM_ASYNC_COMPILATION:
# We need to load the wasm file before anything else, since it
@@ -2819,16 +2824,21 @@ def replacement(self):
"""Returns the script tag to replace the {{{ SCRIPT }}} tag in the target"""
assert (self.src or self.inline) and not (self.src and self.inline)
if self.src:
- quoted_src = quote(self.src)
+ src = self.src
+ if src.startswith('data:'):
+ filename = src
+ else:
+ src = quote(self.src)
+ filename = f'./{src}'
if settings.EXPORT_ES6:
return f'''
'''
else:
- return f''
+ return f''
else:
return '' % self.inline