emscripten-core / emscripten-core/emscripten

WASM package does not work when PTHREAD_POOL_SIZE is in CMakeLists

Open
#19,312 14 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

Please include the following in your bug report:

**Version of emscripten/emsdk:**
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.10 (c3fe57af0504fe24fc4ba697feb8c204f3c80022)
clang version 15.0.0 (https://github.com/llvm/llvm-project 8bc29d14273b05b05d5a56e34c07948dc2c770d3)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/nabeel/Documents/algoface/emsdk/upstream/bi

**Objective:**

I have C++ code where performance matters a great deal, and single threaded WASM library is not the best form for it. This C++ code has CPU threading and I want to utilize it in WASM package as well, so I need to build a multi threaded package

**Issue Description:**

The issue is simple - when I include PTHREAD_POOL_SIZE in CMakeLists, WASM package just freezes. From small session of debugging I saw that there is a dependency `wasm-instantiate` that does not get processed. I thought that maybe there is a problem in my project, so I built a Minimum Reproducing Example and the issue is indeed present

Here is main.cpp:

```
#include

int main() {
std::cout << "Hello, world!!" << std::endl;
return 0;
}
```

Here is CMakeLists.txt:

```
cmake_minimum_required(VERSION 3.0.0)
project(test)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

#******************* definitions
add_definitions(-std=c++11)
add_definitions(-D_HAS_STD_BYTE=0) # for c++17

FIND_PACKAGE(Threads REQUIRED)

set(COMMON_LIBRARIES
${CMAKE_THREAD_LIBS_INIT}
)

message(STATUS "Platform: EMSCRIPTEN")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORT_NAME='test_module'")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 --llvm-lto 0 --js-opts 1 --llvm-opts 3 --bind -s NO_EXIT_RUNTIME=1")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s FETCH=1 --memory-init-file 0 --no-heap-copy --closure 0")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -s USE_PTHREADS -s PTHREAD_POOL_SIZE=4 -s INITIAL_MEMORY=128mb")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS=['AsciiToString','stringToUTF8','lengthBytesUTF8']")

add_executable(vmt
${CMAKE_SOURCE_DIR}/main.cpp
)

target_link_libraries(vmt
${COMMON_LIBRARIES}
)

```

I launch a test server with necessary headers in order to make a browser available for multithreaded WASM library. Just run `python script.py your_port` in the terminal:

```
#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys
class CORSRequestHandler (SimpleHTTPRequestHandler):
def end_headers (self):
# setup mandatory MIME types
self.extensions_map.update({
".js": "application/javascript",
".wasm": "application/wasm",
});

# setup CORS and COEP policies
self.send_header('Cross-Origin-Embedder-Policy', 'require-corp')
self.send_header('Cross-Origin-Opener-Policy', 'same-origin')
SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
aPort = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
test(CORSRequestHandler, HTTPServer, port=aPort)
```

If you build a project with this CMakeLists.txt and put it in browser, you will never see log message. BUT if you remove `PTHREAD_POOL_SIZE` from CMake it will work.

Also one interesting observation - the package without PTHREAD_POOL_SIZE do not allow to initialize a thread in C++ code. Browser gives an error that thread pool is exhausted and I need to include PTHREAD_POOL_SIZE with necessary number of threads.

How to fix it? How to utilize a multithreaded WASM in a proper way? Thank you very much!

Also attaching a screenshot of browser console for a better understanding:
![Screenshot_39](https://github.com/emscripten-core/emscripten/assets/32218450/9be801ad-582e-4d60-b40b-9b45f12357bd)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.