From bf5861698f30bc241473ca4eda4409e2bee4ff04 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 5 Mar 2025 08:54:29 +0000 Subject: [PATCH 1/2] Concurrency: Fix build for p1-threads target --- .../include/_CJavaScriptEventLoop.h | 2 +- .../WebWorkerTaskExecutorTests.swift | 36 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h b/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h index 08efcb948..0fa08c9e7 100644 --- a/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h +++ b/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h @@ -66,7 +66,7 @@ extern void *_Nullable swift_task_asyncMainDrainQueue_hook SWIFT_NONISOLATED_UNS /// MARK: - thread local storage -extern _Thread_local void * _Nullable swjs_thread_local_event_loop; +extern _Thread_local void * _Nullable swjs_thread_local_event_loop SWIFT_NONISOLATED_UNSAFE; extern _Thread_local void * _Nullable swjs_thread_local_task_executor_worker SWIFT_NONISOLATED_UNSAFE; diff --git a/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift b/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift index 726f4da75..3848ba4cc 100644 --- a/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift +++ b/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift @@ -8,8 +8,8 @@ import _CJavaScriptKit // For swjs_get_worker_thread_id func isMainThread() -> Bool final class WebWorkerTaskExecutorTests: XCTestCase { - override func setUp() { - WebWorkerTaskExecutor.installGlobalExecutor() + override func setUp() async { + await WebWorkerTaskExecutor.installGlobalExecutor() } func testTaskRunOnMainThread() async throws { @@ -152,48 +152,46 @@ final class WebWorkerTaskExecutorTests: XCTestCase { func testThreadLocalPerThreadValues() async throws { struct Check { - @ThreadLocal(boxing: ()) - static var value: Int? + static let value = ThreadLocal(boxing: ()) } let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1) - XCTAssertNil(Check.value) - Check.value = 42 - XCTAssertEqual(Check.value, 42) + XCTAssertNil(Check.value.wrappedValue) + Check.value.wrappedValue = 42 + XCTAssertEqual(Check.value.wrappedValue, 42) let task = Task(executorPreference: executor) { - XCTAssertEqual(Check.value, nil) - Check.value = 100 - XCTAssertEqual(Check.value, 100) - return Check.value + XCTAssertNil(Check.value.wrappedValue) + Check.value.wrappedValue = 100 + XCTAssertEqual(Check.value.wrappedValue, 100) + return Check.value.wrappedValue } let result = await task.value XCTAssertEqual(result, 100) - XCTAssertEqual(Check.value, 42) + XCTAssertEqual(Check.value.wrappedValue, 42) executor.terminate() } func testLazyThreadLocalPerThreadInitialization() async throws { struct Check { - static var valueToInitialize = 42 - static var countOfInitialization = 0 - @LazyThreadLocal(initialize: { + nonisolated(unsafe) static var valueToInitialize = 42 + nonisolated(unsafe) static var countOfInitialization = 0 + static let value = LazyThreadLocal(initialize: { countOfInitialization += 1 return valueToInitialize }) - static var value: Int } let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1) XCTAssertEqual(Check.countOfInitialization, 0) - XCTAssertEqual(Check.value, 42) + XCTAssertEqual(Check.value.wrappedValue, 42) XCTAssertEqual(Check.countOfInitialization, 1) Check.valueToInitialize = 100 let task = Task(executorPreference: executor) { XCTAssertEqual(Check.countOfInitialization, 1) - XCTAssertEqual(Check.value, 100) + XCTAssertEqual(Check.value.wrappedValue, 100) XCTAssertEqual(Check.countOfInitialization, 2) - return Check.value + return Check.value.wrappedValue } let result = await task.value XCTAssertEqual(result, 100) From 74a9070bcf6b6a544761288948cbc85b97287107 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 5 Mar 2025 08:56:31 +0000 Subject: [PATCH 2/2] CI: Check p1-threads target --- .github/workflows/test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1c8dae632..62e2a8ac9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,14 +13,17 @@ jobs: toolchain: download-url: https://download.swift.org/swift-6.0.2-release/ubuntu2204/swift-6.0.2-RELEASE/swift-6.0.2-RELEASE-ubuntu22.04.tar.gz wasi-backend: Node + target: "wasm32-unknown-wasi" - os: ubuntu-22.04 toolchain: download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a-ubuntu22.04.tar.gz wasi-backend: Node + target: "wasm32-unknown-wasi" - os: ubuntu-22.04 toolchain: download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a-ubuntu22.04.tar.gz wasi-backend: Node + target: "wasm32-unknown-wasip1-threads" runs-on: ${{ matrix.entry.os }} env: @@ -33,6 +36,8 @@ jobs: download-url: ${{ matrix.entry.toolchain.download-url }} - uses: swiftwasm/setup-swiftwasm@v2 id: setup-swiftwasm + with: + target: ${{ matrix.entry.target }} - name: Configure Swift SDK run: echo "SWIFT_SDK_ID=${{ steps.setup-swiftwasm.outputs.swift-sdk-id }}" >> $GITHUB_ENV - run: make bootstrap