/// <summary> /// Construct a <see cref="IBatchEventProcessor{TEvent}"/> that will automatically track the progress by updating its sequence when the <see cref="IEventHandler{TEvent}.OnEvent(TEvent,long,bool)"/> method returns. /// </summary> /// <param name="exceptionHandler"></param> /// <param name="dataProvider">to which events are published.</param> /// <param name="sequenceBarrier">on which it is waiting.</param> /// <param name="eventHandler">is the delegate to which events are dispatched.</param> public BatchEventProcessor( IDataProvider <TEvent> dataProvider, ISequenceBarrier sequenceBarrier, IEventHandler <TEvent> eventHandler, IExceptionHandler <TEvent> exceptionHandler) { _exceptionHandler = exceptionHandler; _dataProvider = dataProvider; _sequenceBarrier = sequenceBarrier; _eventHandler = eventHandler; _sequence = new Sequence(); if (eventHandler is ISequenceReportingEventHandler <TEvent> reporting) { reporting?.SetSequenceCallback(_sequence); } if (eventHandler is IBatchStartAware batchStartAware) { _batchStartAware = batchStartAware; } if (eventHandler is ITimeoutHandler timeoutHandler) { _timeoutHandler = timeoutHandler; } if (eventHandler is ILifecycleAware lifecycleAware) { _lifecycleAware = lifecycleAware; } }
/// <summary> /// Construct a <see cref="WorkProcessor{T}"/>. /// </summary> /// <param name="ringBuffer">to which events are published.</param> /// <param name="barrier">on which it is waiting.</param> /// <param name="workHandler">is the delegate to which events are dispatched.</param> /// <param name="exceptionHandler">to be called back when an error occurs.</param> /// <param name="workSequence">from which to claim the next event to be worked on. It should always be initialised <see cref="Sequence.InitialValue"/></param> public WorkProcessor( RingBuffer <T> ringBuffer, ISequenceBarrier barrier, IWorkHandler <T> workHandler, IExceptionHandler <T> exceptionHandler, ISequence workSequence) { _ringBuffer = ringBuffer; _barrier = barrier; _workHandler = workHandler; _exceptionHandler = exceptionHandler; _workSequence = workSequence; _sequence = new Sequence(); if (_workHandler is ITimeoutHandler timeoutHandler) { _timeoutHandler = timeoutHandler; } if (_workHandler is ILifecycleAware lifecycleAware) { _lifecycleAware = lifecycleAware; } if (_workHandler is IEventReleaseAware eventReleaseAware) { _eventReleaser = new EventReleaser(_sequence); eventReleaseAware.SetEventReleaser(_eventReleaser); } }
public T Register <T> (T instance) { // Registration is ignored during reset if (_resetInProgress) { return(instance); } ILifecycleAware resettableInstance = instance as ILifecycleAware; // If instance does not implement ILifecycleAware, bail. if (resettableInstance == null) { return(instance); } RegisterInternal(resettableInstance); return(instance); }
public AccessorEventHandler(IEventHandler <E> handler) { this.handler = handler; lifecycle = handler is ILifecycleAware ? (ILifecycleAware)handler : null; }
public static string GetName(this ILifecycleAware caller) { return(caller.GetType().Name); }