@@ -347,7 +347,7 @@ public final class WebWorkerTaskExecutor: TaskExecutor {
347347 self . workers = workers
348348 }
349349
350- func start( timeout: Duration , checkInterval: Duration ) async throws {
350+ func start( stackSize : Int ? , timeout: Duration , checkInterval: Duration ) async throws {
351351 #if canImport(wasi_pthread) && compiler(>=6.1) && _runtime(_multithreaded)
352352 class Context : @unchecked Sendable {
353353 let executor : WebWorkerTaskExecutor . Executor
@@ -375,9 +375,21 @@ public final class WebWorkerTaskExecutor: TaskExecutor {
375375 let unmanagedContext = Unmanaged . passRetained ( context)
376376 contexts. append ( unmanagedContext)
377377 let ptr = unmanagedContext. toOpaque ( )
378+ var attr = pthread_attr_t ( )
379+ pthread_attr_init ( & attr)
380+ // Set the stack size if specified.
381+ if let stackSize {
382+ let ret = pthread_attr_setstacksize ( & attr, stackSize)
383+ guard ret == 0 else {
384+ let strerror = String ( cString: strerror ( ret) )
385+ throw SpawnError (
386+ reason: " Failed to set stack size ( \( stackSize) ) for thread ( \( ret) : \( strerror) ) "
387+ )
388+ }
389+ }
378390 let ret = pthread_create (
379391 nil ,
380- nil ,
392+ & attr ,
381393 { ptr in
382394 // Cast to a optional pointer to absorb nullability variations between platforms.
383395 let ptr : UnsafeMutableRawPointer ? = ptr
@@ -390,6 +402,7 @@ public final class WebWorkerTaskExecutor: TaskExecutor {
390402 } ,
391403 ptr
392404 )
405+ pthread_attr_destroy ( & attr)
393406 guard ret == 0 else {
394407 let strerror = String ( cString: strerror ( ret) )
395408 throw SpawnError ( reason: " Failed to create a thread ( \( ret) : \( strerror) ) " )
@@ -467,16 +480,19 @@ public final class WebWorkerTaskExecutor: TaskExecutor {
467480 ///
468481 /// - Parameters:
469482 /// - numberOfThreads: The number of Web Worker threads to spawn.
483+ /// - stackSize: The stack size for each worker thread. Default is `nil` (use the platform default stack size).
470484 /// - timeout: The maximum time to wait for all worker threads to be started. Default is 3 seconds.
471485 /// - checkInterval: The interval to check if all worker threads are started. Default is 5 microseconds.
472486 /// - Throws: An error if any worker thread fails to initialize within the timeout period.
487+ /// - Note: The default stack size of wasi-libc is typically 128KB.
473488 public init (
474489 numberOfThreads: Int ,
490+ stackSize: Int ? = nil ,
475491 timeout: Duration = . seconds( 3 ) ,
476492 checkInterval: Duration = . microseconds( 5 )
477493 ) async throws {
478494 self . executor = Executor ( numberOfThreads: numberOfThreads)
479- try await self . executor. start ( timeout: timeout, checkInterval: checkInterval)
495+ try await self . executor. start ( stackSize : stackSize , timeout: timeout, checkInterval: checkInterval)
480496 }
481497
482498 /// Terminates all worker threads managed by this executor.
0 commit comments