Changeset 17053 for stable/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1/SimSharp-3.1.1/Core/Resources/ResourcePool.cs
- Timestamp:
- 07/04/19 12:55:52 (5 years ago)
- Location:
- stable
- Files:
-
- 3 edited
- 1 copied
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
stable
-
stable/HeuristicLab.ExtLibs
- Property svn:mergeinfo changed
/trunk/HeuristicLab.ExtLibs merged: 16779
- Property svn:mergeinfo changed
-
stable/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1/SimSharp-3.1.1/Core/Resources/ResourcePool.cs
r15972 r17053 1 1 #region License Information 2 2 /* SimSharp - A .NET port of SimPy, discrete event simulation framework 3 Copyright (C) 201 6Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 Copyright (C) 2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 22 22 23 23 namespace SimSharp { 24 /// <summary> 25 /// A ResourcePool is a crossover between a <see cref="Resource"/> and a <see cref="Store"/>. 26 /// There is a fixed number of non-anonymous resources. 27 /// 28 /// Requests are performed in FIFO order only when they match at least one resource in the pool. 29 /// Releases are processed in FIFO order (usually no simulation time passes for a Release). 30 /// </summary> 24 31 public class ResourcePool { 25 32 protected static readonly Func<object, bool> TrueFunc = _ => true; … … 31 38 public int Remaining { get { return Resources.Count; } } 32 39 33 protected EnvironmentEnvironment { get; private set; }40 protected Simulation Environment { get; private set; } 34 41 35 42 protected LinkedList<ResourcePoolRequest> RequestQueue { get; private set; } 36 43 protected Queue<Release> ReleaseQueue { get; private set; } 37 44 protected List<object> Resources { get; private set; } 45 protected List<Event> WhenAnyQueue { get; private set; } 46 protected List<Event> WhenFullQueue { get; private set; } 47 protected List<Event> WhenEmptyQueue { get; private set; } 48 protected List<Event> WhenChangeQueue { get; private set; } 38 49 39 public ResourcePool( Environmentenvironment, IEnumerable<object> resources) {50 public ResourcePool(Simulation environment, IEnumerable<object> resources) { 40 51 Environment = environment; 41 52 if (resources == null) throw new ArgumentNullException("resources"); … … 45 56 RequestQueue = new LinkedList<ResourcePoolRequest>(); 46 57 ReleaseQueue = new Queue<Release>(); 58 WhenAnyQueue = new List<Event>(); 59 WhenFullQueue = new List<Event>(); 60 WhenEmptyQueue = new List<Event>(); 61 WhenChangeQueue = new List<Event>(); 47 62 } 48 63 … … 63 78 TriggerRelease(); 64 79 return release; 80 } 81 82 public virtual Event WhenAny() { 83 var whenAny = new Event(Environment); 84 WhenAnyQueue.Add(whenAny); 85 TriggerWhenAny(); 86 return whenAny; 87 } 88 89 public virtual Event WhenFull() { 90 var whenFull = new Event(Environment); 91 WhenFullQueue.Add(whenFull); 92 TriggerWhenFull(); 93 return whenFull; 94 } 95 96 public virtual Event WhenEmpty() { 97 var whenEmpty = new Event(Environment); 98 WhenEmptyQueue.Add(whenEmpty); 99 TriggerWhenEmpty(); 100 return whenEmpty; 101 } 102 103 public virtual Event WhenChange() { 104 var whenChange = new Event(Environment); 105 WhenChangeQueue.Add(whenChange); 106 return whenChange; 65 107 } 66 108 … … 93 135 RequestQueue.Remove(current); 94 136 current = next; 137 TriggerWhenEmpty(); 138 TriggerWhenChange(); 95 139 } else current = current.Next; 96 140 if (Resources.Count == 0) break; … … 101 145 while (ReleaseQueue.Count > 0) { 102 146 var release = ReleaseQueue.Peek(); 103 DoRelease(release); 104 if (release.IsTriggered) { 147 if (release.Request.IsAlive) { 148 if (!RequestQueue.Remove((ResourcePoolRequest)release.Request)) 149 throw new InvalidOperationException("Failed to cancel a request."); 150 release.Succeed(); 105 151 ReleaseQueue.Dequeue(); 106 } else break; 152 } else { 153 DoRelease(release); 154 if (release.IsTriggered) { 155 ReleaseQueue.Dequeue(); 156 TriggerWhenAny(); 157 TriggerWhenFull(); 158 TriggerWhenChange(); 159 } else break; 160 } 107 161 } 162 } 163 164 protected virtual void TriggerWhenAny() { 165 if (Remaining > 0) { 166 if (WhenAnyQueue.Count == 0) return; 167 foreach (var evt in WhenAnyQueue) 168 evt.Succeed(); 169 WhenAnyQueue.Clear(); 170 } 171 } 172 173 protected virtual void TriggerWhenFull() { 174 if (InUse == 0) { 175 if (WhenFullQueue.Count == 0) return; 176 foreach (var evt in WhenFullQueue) 177 evt.Succeed(); 178 WhenFullQueue.Clear(); 179 } 180 } 181 182 protected virtual void TriggerWhenEmpty() { 183 if (Remaining == 0) { 184 if (WhenEmptyQueue.Count == 0) return; 185 foreach (var evt in WhenEmptyQueue) 186 evt.Succeed(); 187 WhenEmptyQueue.Clear(); 188 } 189 } 190 191 protected virtual void TriggerWhenChange() { 192 if (WhenChangeQueue.Count == 0) return; 193 foreach (var evt in WhenChangeQueue) 194 evt.Succeed(); 195 WhenChangeQueue.Clear(); 108 196 } 109 197 }
Note: See TracChangeset
for help on using the changeset viewer.