public static bool MayInterleave(IInvokable req) { // not interested if (req.ArgumentCount == 0) { return(false); } string arg = null; // assume single argument message if (req.ArgumentCount == 1) { arg = (string)UnwrapImmutable(req.GetArgument <object>(0)); } // assume stream message if (req.ArgumentCount == 2) { arg = (string)UnwrapImmutable(req.GetArgument <object>(1)); } if (arg == "err") { throw new ApplicationException("boom"); } return(arg == "reentrant"); }
/// <summary> /// Sets target grain to the found instances of type GrainCancellationToken /// </summary> private void SetGrainCancellationTokensTarget(GrainReference target, IInvokable request) { for (var i = 0; i < request.ArgumentCount; i++) { var arg = request.GetArgument <object>(i); if (arg is not GrainCancellationToken grainToken) { continue; } grainToken.AddGrainReference(this.cancellationTokenRuntime, target); } }
/// <summary> /// Adds CancellationToken to the grain extension /// so that it can be canceled through remote call to the CancellationSourcesExtension. /// </summary> /// <param name="target"></param> /// <param name="request"></param> internal static void RegisterCancellationTokens( IGrainContext target, IInvokable request) { for (var i = 0; i < request.ArgumentCount; i++) { var arg = request.GetArgument <object>(i); if (arg is not GrainCancellationToken grainToken) { continue; } var cancellationExtension = (CancellationSourcesExtension)target.GetGrainExtension <ICancellationSourcesExtension>(); // Replacing the half baked GrainCancellationToken that came from the wire with locally fully created one. request.SetArgument(i, cancellationExtension.RecordCancellationToken(grainToken.Id, grainToken.IsCancellationRequested)); } }