Beispiel #1
0
            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));
                }
            }
Beispiel #2
0
 internal ReleaseEvent(PreemptiveResource resource, RequestEvent request)
     : base(resource.Env, Default.Priority)
 {
     _request = request;
     Env.ScheduleEvent(this);
 }