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