/// <summary> /// Enqueues an event to the actor with the specified id. /// </summary> private EnqueueStatus EnqueueEvent(Actor actor, Event e, Actor sender, Guid opGroupId, SendOptions options) { EventOriginInfo originInfo; string stateName = null; if (sender is StateMachine senderStateMachine) { originInfo = new EventOriginInfo(sender.Id, senderStateMachine.GetType().FullName, NameResolver.GetStateNameForLogging(senderStateMachine.CurrentState)); stateName = senderStateMachine.CurrentStateName; } else if (sender is Actor senderActor) { originInfo = new EventOriginInfo(sender.Id, senderActor.GetType().FullName, string.Empty); } else { // Message comes from the environment. originInfo = new EventOriginInfo(null, "Env", "Env"); } EventInfo eventInfo = new EventInfo(e, originInfo) { MustHandle = options?.MustHandle ?? false, Assert = options?.Assert ?? -1 }; this.LogWriter.LogSendEvent(actor.Id, sender?.Id.Name, sender?.Id.Type, stateName, e, opGroupId, isTargetHalted: false); return(actor.Enqueue(e, opGroupId, eventInfo)); }
/// <inheritdoc/> internal override void NotifyReceivedEvent(Actor actor, Event e, EventInfo eventInfo) { string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null; this.LogWriter.LogReceiveEvent(actor.Id, stateName, e, wasBlocked: true); var op = this.Scheduler.GetOperationWithId <ActorOperation>(actor.Id.Value); op.OnReceivedEvent(); }
/// <inheritdoc/> internal override void NotifyDequeuedEvent(Actor actor, Event e, EventInfo eventInfo) { var op = this.Scheduler.GetOperationWithId <ActorOperation>(actor.Id.Value); // Skip `ReceiveEventAsync` if the last operation exited the previous event handler, // to avoid scheduling duplicate `ReceiveEventAsync` operations. if (op.SkipNextReceiveSchedulingPoint) { op.SkipNextReceiveSchedulingPoint = false; } else { this.Scheduler.ScheduleNextEnabledOperation(); ResetProgramCounter(actor); } string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null; this.LogWriter.LogDequeueEvent(actor.Id, stateName, e); }
/// <inheritdoc/> internal override void NotifyReceivedEventWithoutWaiting(Actor actor, Event e, EventInfo eventInfo) { string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null; this.LogWriter.LogReceiveEvent(actor.Id, stateName, e, wasBlocked: false); this.Scheduler.ScheduleNextEnabledOperation(); ResetProgramCounter(actor); }
/// <inheritdoc/> internal override void NotifyRaisedEvent(Actor actor, Event e, EventInfo eventInfo) { string stateName = actor is StateMachine stateMachine ? stateMachine.CurrentStateName : null; this.LogWriter.LogRaiseEvent(actor.Id, stateName, e); }