internal bool TrySchedule() { if (_resource._users.Count < _resource.Capacity) { _handle = _resource._users.Add(this, _priority); Env.ScheduleEvent(this); return(true); } return(false); }
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)); } }