protected virtual void DoRequest(Request request) { if (Users.Count < Capacity) { WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time)); Users.Add(request); request.Succeed(); } }
protected virtual void DoRequest(ResourcePoolRequest request) { foreach (var o in Resources) { if (!request.Filter(o)) { continue; } WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time)); Resources.Remove(o); request.Succeed(o); return; } }
protected virtual void DoRequest(PreemptiveRequest request) { if (Users.Count >= Capacity && request.Preempt) { // Check if we can preempt another process // MaxItems are the least important according to priorty, time, and preemption flag var preempt = Users.MaxItems(x => x).Last(); if (preempt.CompareTo(request) > 0) { InterruptTime?.Add(Environment.ToDouble(Environment.Now - request.Time)); preempt.IsPreempted = true; Users.Remove(preempt); preempt.Owner?.Interrupt(new Preempted(request.Owner, preempt.Time)); } } if (Users.Count < Capacity) { WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time)); Users.Add(request); request.Succeed(); } }