/// <summary> /// Process blocking event. /// </summary> /// <param name="targetObjectId">Target object id for which to process.</param> /// <param name="eventToProcess">Event to be processed.</param> /// <param name="caller">Parent Network id from which this is called. Set NetworkId.Invalid if no parent.</param> /// <param name="eventHandler">Handler for processing event.</param> /// <param name="isBlockedHandler">Handler for checking if processing of events should be canceled.</param> /// <param name="postProcessQueue">Queue that should be post processed.</param> /// <returns>True if was success.</returns> private bool ProcessBlockingEvent(NetworkId targetObjectId, MyBufferedEvent eventToProcess, NetworkId caller, Handler eventHandler, IsBlockedHandler isBlockedHandler, ref Queue <NetworkId> postProcessQueue) { if (isBlockedHandler(eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId)) { return(false); } bool result = this.TryLiftBarrier(eventToProcess.BlockingObjectId); // If success than we can proceede with blocking event. // If not, that means barrier holder have some events before actual barrier. Then we need to process that first. if (result) { eventHandler(eventToProcess.Stream, eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId, eventToProcess.EventId, eventToProcess.Sender); if (eventToProcess.BlockingObjectId.IsValid && !eventToProcess.BlockingObjectId.Equals(caller)) { postProcessQueue.Enqueue(eventToProcess.BlockingObjectId); } } else { bool success = ProcessEvents(eventToProcess.BlockingObjectId, eventHandler, isBlockedHandler, targetObjectId); return(success); } return(true); }
/// <summary> /// Process barrier event. /// </summary> /// <param name="targetObjectId">Target of the barrier event.</param> /// <param name="eventToProcess">Event to process.</param> /// <param name="eventHandler">Handler for processing event.</param> /// <param name="isBlockedHandler">Handler for checking if processing of events should be canceled.</param> /// <returns>True if success.</returns> private bool ProcessBarrierEvent(NetworkId targetObjectId, MyBufferedEvent eventToProcess, Handler eventHandler, IsBlockedHandler isBlockedHandler) { if (isBlockedHandler(eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId)) { return(false); } bool success = ProcessEvents(eventToProcess.BlockingObjectId, eventHandler, isBlockedHandler, targetObjectId); return(success); }
/// <summary> /// Tries to lift barrier from target network object. If successfull, removes this barrier from /// target object events queue. Also barrier must be aiming target object id. /// </summary> /// <param name="targetObjectId">Target network object id.</param> /// <returns>True if barrier found on the top of target object events queue. Otherwise false.</returns> private bool TryLiftBarrier(NetworkId targetObjectId) { MyObjectEventsBuffer eventBuffer; if (m_buffer.TryGetValue(targetObjectId, out eventBuffer)) { MyBufferedEvent firstEvent = eventBuffer.Events.Peek(); // Check if first event is a barrier and if it is designed for target object id. if (firstEvent.IsBarrier && firstEvent.TargetObjectId.Equals(targetObjectId)) { eventBuffer.Events.Dequeue(); ReturnEvent(firstEvent); return(true); } } return(false); }
private bool ProcessEventsBuffer(MyObjectEventsBuffer eventsBuffer, NetworkId targetObjectId, Handler eventHandler, IsBlockedHandler isBlockedHandler, NetworkId caller, ref Queue <NetworkId> postProcessQueue) { while (eventsBuffer.Events.Count > 0) { bool success = true; MyBufferedEvent e = eventsBuffer.Events.Peek(); if (e.IsBarrier) { success = this.ProcessBarrierEvent(targetObjectId, e, eventHandler, isBlockedHandler); } else { // If you have blocking entity id, than try to check if it has your barrier on top, // If yes, than process yourself, and put the other id to process later. // If no, than process that id first, as you cannot proceede without it. if (e.BlockingObjectId.IsValid) { success = this.ProcessBlockingEvent(targetObjectId, e, caller, eventHandler, isBlockedHandler, ref postProcessQueue); } else { eventHandler(e.Stream, e.TargetObjectId, e.BlockingObjectId, e.EventId, e.Sender); } if (success) { e.Stream.CheckTerminator(); eventsBuffer.Events.Dequeue(); ReturnEvent(e); } } if (!success) { eventsBuffer.IsProcessing = false; return(false); } } return(true); }
void ReturnEvent(MyBufferedEvent evnt) { m_eventPool.Push(evnt); }
/// <summary> /// Process blocking event. /// </summary> /// <param name="targetObjectId">Target object id for which to process.</param> /// <param name="eventToProcess">Event to be processed.</param> /// <param name="caller">Parent Network id from which this is called. Set NetworkId.Invalid if no parent.</param> /// <param name="eventHandler">Handler for processing event.</param> /// <param name="isBlockedHandler">Handler for checking if processing of events should be canceled.</param> /// <param name="postProcessQueue">Queue that should be post processed.</param> /// <returns>True if was success.</returns> private bool ProcessBlockingEvent(NetworkId targetObjectId, MyBufferedEvent eventToProcess, NetworkId caller, Handler eventHandler, IsBlockedHandler isBlockedHandler, ref Queue<NetworkId> postProcessQueue) { if (isBlockedHandler(eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId)) { return false; } bool result = this.TryLiftBarrier(eventToProcess.BlockingObjectId); // If success than we can proceede with blocking event. // If not, that means barrier holder have some events before actual barrier. Then we need to process that first. if (result) { eventHandler(eventToProcess.Stream, eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId, eventToProcess.EventId, eventToProcess.Sender); if (eventToProcess.BlockingObjectId.IsValid && !eventToProcess.BlockingObjectId.Equals(caller)) postProcessQueue.Enqueue(eventToProcess.BlockingObjectId); } else { bool success = ProcessEvents(eventToProcess.BlockingObjectId, eventHandler, isBlockedHandler, targetObjectId); return success; } return true; }
/// <summary> /// Process barrier event. /// </summary> /// <param name="targetObjectId">Target of the barrier event.</param> /// <param name="eventToProcess">Event to process.</param> /// <param name="eventHandler">Handler for processing event.</param> /// <param name="isBlockedHandler">Handler for checking if processing of events should be canceled.</param> /// <returns>True if success.</returns> private bool ProcessBarrierEvent(NetworkId targetObjectId, MyBufferedEvent eventToProcess, Handler eventHandler, IsBlockedHandler isBlockedHandler) { if (isBlockedHandler(eventToProcess.TargetObjectId, eventToProcess.BlockingObjectId)) { return false; } bool success = ProcessEvents(eventToProcess.BlockingObjectId, eventHandler, isBlockedHandler, targetObjectId); return success; }