void InitEventInvoker(Int32 size) { // allocate dictionary with pre-defined capacity _eventsTriggered = new Dictionary <Int32, HashSet <Int32>[]>(size); // init trigger set pool with empty hashsets TriggeredSetPool.Init(size); }
void InvokeEvents(Quantum.Frame f) { // store previous frame value so we can restore it var previousFrameValue = _frame; try { // set current frame we are invoking the events for _frame = f; HashSet <Int32>[] triggered; // grab or create new triggered set lookup if (_eventsTriggered.TryGetValue(f.Number, out triggered) == false) { _eventsTriggered.Add(f.Number, triggered = TriggeredSetPool.Alloc()); } // grab event head var head = (IEventBaseInternal)(((IFrameInternal)f).EventHead); // step over each event while (head != null) { if (head.EventIsSynced) { if (f.IsVerified) { RaiseEvent(head); } } else { // calculate hash code var hash = head.GetHashCode(); // if this was already raised, do nothing if (triggered[head.Id].Contains(hash) == false) { // dont trigger this again triggered[head.Id].Add(hash); // trigger event RaiseEvent(head); } } // next head = head.EventTail; } // frame is verified? if (f.IsVerified) { // remove triggered set _eventsTriggered.Remove(f.Number); // free it TriggeredSetPool.Free(triggered); } } finally { // restore frame value _frame = previousFrameValue; } }