Skip to content

Conversation

@scottmarchant
Copy link

@scottmarchant scottmarchant commented Dec 17, 2025

Summary

This PR adds support for compiling swift-async-algorithms to wasm using the Swift SDK for WebAssembly - but without pthreads and specialized command such as swift build -Xcc -D_WASI_EMULATED_PTHREAD.

This is achieved by eliding mutex locking for single-thread non-pthread WASI platforms, similar to the approach used in swift-log. This enables building swift-async-algorithms with the default Swift for WebAssembly configurations

This PR is part of a larger effort by a company called PassiveLogic to enable broad support for Swift WebAssembly compilation.

Details

  • Added additional compilation conditionals to elide mutex locking for WASI platforms that lack pthread support and carry a decently strong guarantee of single-threaded operation.
  • Removed specialized wasm build command customization from CI configuration, since swift-async-algorithms will now compile with the vanilla default configuration with these changes.

Testing done

  • Cleaned up swiftformat lint on modified lines of change.
  • Verified unit tests still pass with these changes
  • Verified swift build completes without errors
  • Verified swift build --swift-sdk wasm32-unknown-wasip1 --target AsyncAlgorithms completes without errors
  • Verified swift build --swift-sdk wasm32-unknown-wasip1-threads --target AsyncAlgorithms completes without errors
  • Verified CI passes using CI check on separate draft PR

Impact Risk

There should be no negeative impact risk for existing targets. The changes only affect compilation for WASI platforms that don't support pthread, which was previously unsupported.

linux_exclude_swift_versions: "[{\"swift_version\": \"5.9\"}, {\"swift_version\": \"5.10\"}]]"
windows_exclude_swift_versions: "[{\"swift_version\": \"5.9\"}]"
enable_wasm_sdk_build: true
wasm_sdk_build_command: swift build -Xcc -D_WASI_EMULATED_PTHREAD
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MaxDesiatov Just wanted to call this to your attention. With the changes in this PR, pthreads are no longer required to compile swift-async-algorithms. But I verified the pthread approach still gets compiled in when available.

Remove this build command customization seemed like the right thing to do with these changes, but interested to know your thoughts here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kateinoigakukun WDYT? IIRC import wasi_pthread is available in recent single-threaded Swift SDKs too and these conditional imports are no longer needed?

Copy link
Contributor

@kateinoigakukun kateinoigakukun Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd say it's better to rely on the pthread stub API for better consistency with other platforms. If we don't need to support Swift 6.2, we can unconditionally import wasi_pthread regardless of p1 or p1-threads.

Copy link
Author

@scottmarchant scottmarchant Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MaxDesiatov @kateinoigakukun Would it make sense to update this build command in swiftlang/github-workflows when we're able to unconditionally import wasi_pthread, and remove the customization here? That way, the build command here will remain consistent with the other wasm CI builds.

Happy to revert this, just wanted to mention that thought before reverting this line. I believe this repo will compile fine in CI either way as long as the remaining changes are in place.

Copy link
Member

@MaxDesiatov MaxDesiatov Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If that option doesn't belong here in this repository, but is required for import wasi_pthread to work (I haven't confirmed this myself), then IMO it should be in the Swift Driver codebase, or a Swift SDK toolset (generated by Swift SDK Generator), or somewhere on that level so that everyone gets that behavior by default.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MaxDesiatov +1 for enabling the emulated pthread behavior by default. I think it would help a lot more code out there compile.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaving this as is for now. But if either of you want me to revert, please let me know. Happy to change this.

I confirmed using sdk swift-6.3-DEVELOPMENT-SNAPSHOT-2025-12-07-a_wasm that the command swift build -Xcc -D_WASI_EMULATED_PTHREAD --swift-sdk wasm32-unknown-wasip1 --target AsyncAlgorithms will make canImport(wasi_pthread) truthy, whereas swift build --swift-sdk wasm32-unknown-wasip1 --target AsyncAlgorithms makes canImport(wasi_pthread) false.

@scottmarchant scottmarchant force-pushed the feat/swift-wasm-support branch from dfe9622 to 6ac957c Compare December 18, 2025 19:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants