Files
swift-mirror/lib/SILGen/ExecutorBreadcrumb.h
Joe Groff 79fb05b362 Concurrency: Hop back to the previous executor after actor calls.
Tasks shouldn't normally hog the actor context indefinitely after making a call that's bound to
that actor, since that prevents the actor from potentially taking on other jobs it needs to
be able to address. Set up SILGen so that it saves the current executor (using a new runtime
entry point) and hops back to it after every actor call, not only ones where the caller context
is also actor-bound.

The added executor hopping here also exposed a bug in the runtime implementation while processing
DefaultActor jobs, where if an actor job returned to the processing loop having already yielded
the thread back to a generic executor, we would still attempt to make the actor give up the thread
again, corrupting its state.

rdar://71905765
2021-03-18 11:47:50 -07:00

37 lines
1.2 KiB
C++

//===--- ExecutorBreadcrumb.h - executor hop tracking for SILGen ----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
namespace swift {
namespace Lowering {
/// Represents the information necessary to return to a caller's own
/// active executor after making a hop to an actor for actor-isolated calls.
class ExecutorBreadcrumb {
SILValue Executor;
public:
// An empty breadcrumb, indicating no hop back is necessary.
ExecutorBreadcrumb() : Executor() {}
// A breadcrumb representing the need to hop back to the executor
// represented by the given value.
explicit ExecutorBreadcrumb(SILValue executor)
: Executor(executor) {}
// Emits the hop back sequence, if any, necessary to get back to
// the executor represented by this breadcrumb.
void emit(SILGenFunction &SGF, SILLocation loc);
};
} // namespace Lowering
} // namespace swift