Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/Sema/CodeSynthesisDistributedActor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,10 @@ static FuncDecl *createSameSignatureDistributedThunkDecl(DeclContext *DC,
thunk->setSynthesized(true);
thunk->setDistributedThunk(true);
thunk->getAttrs().add(NonisolatedAttr::createImplicit(C));
// TODO(distributed): It would be nicer to make distributed thunks nonisolated(nonsending) instead;
// this way we would not hop off the caller when calling system.remoteCall;
// it'd need new ABI and the remoteCall also to become nonisolated(nonsending)
thunk->getAttrs().add(new (C) ConcurrentAttr(/*IsImplicit=*/true));

return thunk;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s --enable-var-scope

// X: %target-run-simple-swift( -Xfrontend -module-name=main -target %target-swift-5.7-abi-triple -parse-as-library -Xfrontend -I -Xfrontend %t ) | %FileCheck %s

// REQUIRES: executable_test
// REQUIRES: concurrency
// REQUIRES: distributed
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/FakeDistributedActorSystems.swiftmodule \
// RUN: -module-name FakeDistributedActorSystems -target %target-swift-5.7-abi-triple \
// RUN: %S/../Inputs/FakeDistributedActorSystems.swift

// RUN: %target-build-swift -module-name main -enable-upcoming-feature NonisolatedNonsendingByDefault \
// RUN: -target %target-swift-5.7-abi-triple -j2 -parse-as-library -I %t %s \
// RUN: %S/../Inputs/FakeDistributedActorSystems.swift -o %t/a.out

// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s --enable-var-scope

// REQUIRES: swift_feature_NonisolatedNonsendingByDefault

// REQUIRES: executable_test
// REQUIRES: concurrency
// REQUIRES: distributed

// rdar://76038845
// UNSUPPORTED: use_os_stdlib
// UNSUPPORTED: back_deployment_runtime

// FIXME(distributed): Distributed actors currently have some issues on windows, isRemote always returns false. rdar://82593574
// UNSUPPORTED: OS=windows-msvc

import Distributed
import FakeDistributedActorSystems

typealias DefaultDistributedActorSystem = FakeRoundtripActorSystem

distributed actor Greeter: CustomStringConvertible {
distributed func echo(name: String) -> String {
return "Echo: \(name) (impl on: \(self.id))"
}

nonisolated var description: String {
"\(Self.self)(\(id))"
}
}

extension Greeter {
distributed func echoInExtension(name: String) -> String {
return "Echo: \(name) (impl on: \(self.id))"
}
}

nonisolated extension Greeter {
distributed func echoInNonisolatedExtension(name: String) -> String {
return "Echo: \(name) (impl on: \(self.id))"
}
}

struct SomeError: Error {}

// ==== Test -------------------------------------------------------------------

func test() async throws {
let system = DefaultDistributedActorSystem()

let local = Greeter(actorSystem: system)
let ref = try Greeter.resolve(id: local.id, using: system)

let reply = try await ref.echo(name: "Caplin")
// CHECK: > encode argument name:name, value: Caplin
// CHECK-NOT: > encode error type
// CHECK: > encode return type: Swift.String
// CHECK: > done recording
// CHECK: >> remoteCall
// CHECK: > decode return type: Swift.String
// CHECK: > decode argument: Caplin
// CHECK: << onReturn: Echo: Caplin (impl on: ActorAddress(address: "<unique-id>"))

print("got: \(reply)")
// CHECK: got: Echo: Caplin (impl on: ActorAddress(address: "<unique-id>"))

// just double check there's no surprises with distributed thunks in extensions
_ = try await ref.echoInExtension(name: "Bob")
_ = try await ref.echoInNonisolatedExtension(name: "Alice")

print("OK") // CHECK: OK
}

@main struct Main {
static func main() async {
try! await test()
}
}