internal RequestEvent(PreemptiveResource resource, double priority, bool preempt) : base(resource.Env, priority) { _resource = resource; _priority = new ReqPriority(priority, Env.Now, preempt, resource._nextVersion++); _process = Env.ActiveProcess; if (_resource._requestQueue.Count == 0 && TrySchedule()) { return; } _handle = _resource._requestQueue.Add(this, _priority); if (preempt && _resource._requestQueue.Min.Value.Equals(this)) { var toPreempt = _resource._users.Min.Value; if (ReqPriority.Comparer.Compare(toPreempt._priority, _priority) <= 0) { return; } toPreempt.Dispose(); toPreempt._process.Interrupt(new PreemptionInfo(_process, toPreempt.Time)); } }
internal ReleaseEvent(PreemptiveResource resource, RequestEvent request) : base(resource.Env, Default.Priority) { _request = request; Env.ScheduleEvent(this); }