Skip to content

Commit ccecacc

Browse files
authored
Merge pull request #81123 from ktoso/wip-correct-metadata-handling-distributed
[Distributed] thread-safety also for parameter type metadata
2 parents c25d463 + 284c060 commit ccecacc

File tree

2 files changed

+64
-49
lines changed

2 files changed

+64
-49
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,25 +2907,6 @@ static NodePointer getParameterList(NodePointer funcType) {
29072907
return parameterContainer;
29082908
}
29092909

2910-
static const Metadata *decodeType(TypeDecoder<DecodedMetadataBuilder> &decoder,
2911-
NodePointer type) {
2912-
assert(type->getKind() == Node::Kind::Type);
2913-
2914-
auto builtTypeOrError = decoder.decodeMangledType(type);
2915-
2916-
if (builtTypeOrError.isError()) {
2917-
auto err = builtTypeOrError.getError();
2918-
char *errStr = err->copyErrorString();
2919-
err->freeErrorString(errStr);
2920-
return nullptr;
2921-
}
2922-
2923-
if (!builtTypeOrError.getType().isMetadata())
2924-
return nullptr;
2925-
2926-
return builtTypeOrError.getType().getMetadata();
2927-
}
2928-
29292910
SWIFT_CC(swift)
29302911
SWIFT_RUNTIME_STDLIB_SPI
29312912
unsigned swift_func_getParameterCount(const char *typeNameStart,
@@ -3009,8 +2990,21 @@ swift_func_getParameterTypeInfo(
30092990

30102991
SubstGenericParametersFromMetadata substFn(genericEnv, genericArguments);
30112992

3012-
DecodedMetadataBuilder builder(
3013-
demangler,
2993+
// for each parameter (TupleElement), store it into the provided buffer
2994+
for (unsigned index = 0; index != typesLength; ++index) {
2995+
auto nodePointer = parameterList->getChild(index);
2996+
2997+
if (nodePointer->getKind() == Node::Kind::TupleElement) {
2998+
assert(nodePointer->getNumChildren() == 1);
2999+
nodePointer = nodePointer->getFirstChild();
3000+
}
3001+
assert(nodePointer->getKind() == Node::Kind::Type);
3002+
3003+
auto request = MetadataRequest(MetadataState::Complete);
3004+
3005+
auto typeInfoOrErr = swift_getTypeByMangledNode(
3006+
request, demangler, nodePointer,
3007+
/*arguments=*/genericArguments,
30143008
/*substGenericParam=*/
30153009
[&substFn](unsigned depth, unsigned index) {
30163010
return substFn.getMetadata(depth, index).Ptr;
@@ -3019,24 +3013,13 @@ swift_func_getParameterTypeInfo(
30193013
[&substFn](const Metadata *type, unsigned index) {
30203014
return substFn.getWitnessTable(type, index);
30213015
});
3022-
TypeDecoder<DecodedMetadataBuilder> decoder(builder);
3023-
3024-
// for each parameter (TupleElement), store it into the provided buffer
3025-
for (unsigned index = 0; index != typesLength; ++index) {
3026-
auto *parameter = parameterList->getChild(index);
3027-
3028-
if (parameter->getKind() == Node::Kind::TupleElement) {
3029-
assert(parameter->getNumChildren() == 1);
3030-
parameter = parameter->getFirstChild();
3031-
}
3032-
3033-
assert(parameter->getKind() == Node::Kind::Type);
30343016

3035-
auto type = decodeType(decoder, parameter);
3036-
if (!type)
3017+
if (typeInfoOrErr.isError()) {
30373018
return -3; // Failed to decode a type.
3019+
}
30383020

3039-
types[index] = type;
3021+
auto typeInfo = typeInfoOrErr.getType();
3022+
types[index] = typeInfo.getMetadata();
30403023
} // end foreach parameter
30413024

30423025
return typesLength;

test/Distributed/Runtime/distributed_actor_func_calls_without_touching_returnType_metadata_first.swift

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/FakeDistributedActorSystems.swiftmodule -module-name FakeDistributedActorSystems -target %target-swift-5.7-abi-triple %S/../Inputs/FakeDistributedActorSystems.swift
32
// RUN: %target-build-swift -module-name dist -target %target-swift-5.7-abi-triple -parse-as-library -j2 -parse-as-library -plugin-path %swift-plugin-dir -I %t %s %S/../Inputs/FakeDistributedActorSystems.swift -o %t/a.out
43
// RUN: %target-codesign %t/a.out
5-
// RUN: %target-run %t/a.out
4+
5+
// RUN: %target-run %t/a.out PARAMETER_TYPE
6+
// RUN: %target-run %t/a.out RETURN_TYPE
67

78
// REQUIRES: executable_test
89
// REQUIRES: concurrency
@@ -17,7 +18,6 @@
1718

1819
import Darwin
1920
import Distributed
20-
import FakeDistributedActorSystems
2121
import Foundation
2222

2323
typealias DefaultDistributedActorSystem = FakeRoundtripActorSystem
@@ -1052,20 +1052,39 @@ struct BigGeneric<T>: Codable {
10521052
}
10531053

10541054
distributed actor D {
1055+
public distributed func getBigGeneric(_ value: BigGeneric<TypeXXXX>) {}
10551056
public distributed func getBigGeneric() -> BigGeneric<TypeXXXX> {
1056-
return BigGeneric()
1057-
}
1057+
return BigGeneric()
1058+
}
10581059
}
10591060

1060-
func attempt(n: Int) {
1061-
var fname = "$s4dist1DC13getBigGenericAA0cD0VyAA8Type\(n)VGyF"
1061+
func attempt(_ mode: Mode, n: Int) {
1062+
var funcName_returnType = "$s4dist1DC13getBigGenericAA0cD0VyAA8Type\(n)VGyF"
1063+
var funcName_param = "$s4dist1DC13getBigGenericyyAA0cD0VyAA8Type\(n)VGF"
10621064

10631065
func tryLookup() {
1064-
let t = fname.withUTF8 {
1065-
__getReturnTypeInfo($0.baseAddress!, UInt($0.count), nil, nil)
1066-
}
1066+
let t: (any Any.Type)? =
1067+
switch mode {
1068+
case .returnType:
1069+
funcName_returnType.withUTF8 {
1070+
__getReturnTypeInfo($0.baseAddress!, UInt($0.count), nil, nil)
1071+
}
1072+
1073+
case .paramType:
1074+
funcName_param.withUTF8 { nameBuf in
1075+
var type: Any.Type?
1076+
withUnsafeMutablePointer(to: &type) { typePtr in
1077+
let ret = __getParameterTypeInfo(nameBuf.baseAddress!, UInt(nameBuf.count), nil, nil, typePtr._rawValue, 1)
1078+
if ret != 1 {
1079+
fatalError("Decoded \(ret) parameters, expected 1")
1080+
}
1081+
}
1082+
return type
1083+
}
1084+
}
1085+
10671086
guard let t else {
1068-
print("couldn't look up type for: \(fname)")
1087+
print("couldn't look up type for mode: \(mode)")
10691088
exit(1)
10701089
}
10711090
func examineType<T>(_t: T.Type) {
@@ -1081,10 +1100,23 @@ func attempt(n: Int) {
10811100
}
10821101
}
10831102

1103+
enum Mode: String {
1104+
case returnType = "RETURN_TYPE"
1105+
case paramType = "PARAMETER_TYPE"
1106+
}
1107+
10841108
@main struct Main {
10851109
static func main() {
1110+
if CommandLine.arguments.count < 2 {
1111+
fatalError("Expected explicit mode in command line arguments, was: \(CommandLine.arguments)")
1112+
}
1113+
1114+
let mode = Mode.init(rawValue: CommandLine.arguments.dropFirst().first!)!
1115+
print("Checking in mode: \(mode)...")
1116+
10861117
for i in 1000...1999 {
1087-
attempt(n: i)
1118+
attempt(mode, n: i)
10881119
}
1120+
print("Passed in mode: \(mode)!")
10891121
}
1090-
}
1122+
}

0 commit comments

Comments
 (0)