comparison Implab/Parallels/DispatchPool.cs @ 30:2fad2d1f4b03

small refactoring, cleanup.
author cin
date Mon, 07 Apr 2014 03:25:57 +0400
parents ee04e1fa78da
children dabf79fde388
comparison
equal deleted inserted replaced
29:768f7deeb55b 30:2fad2d1f4b03
141 141
142 // we can't check whether signal has been processed 142 // we can't check whether signal has been processed
143 // anyway it may take some time for the thread to start 143 // anyway it may take some time for the thread to start
144 // we will ensure that at least one thread is running 144 // we will ensure that at least one thread is running
145 145
146 if (AllocateThreadSlot(1)) { 146 EnsurePoolIsAlive();
147 // if there were no threads in the pool
148 var worker = new Thread(this.Worker);
149 worker.IsBackground = true;
150 worker.Start();
151 }
152 } else { 147 } else {
153 // if there is no sleeping threads in the pool 148 // if there is no sleeping threads in the pool
154 if (!StartWorker()) 149 if (!StartWorker()) {
155 // we haven't started a new thread, but the current can be on the way and it can't process the queue 150 // we haven't started a new thread, but the current can be on the way to terminate and it can't process the queue
156 // send it a signal to spin again 151 // send it a signal to spin again
157 SignalThread(); 152 SignalThread();
153 EnsurePoolIsAlive();
154 }
155 }
156 }
157
158 private void EnsurePoolIsAlive() {
159 if (AllocateThreadSlot(1)) {
160 // if there were no threads in the pool
161 var worker = new Thread(this.Worker);
162 worker.IsBackground = true;
163 worker.Start();
158 } 164 }
159 } 165 }
160 166
161 private bool Suspend() { 167 private bool Suspend() {
162 //no tasks left, exit if the thread is no longer needed 168 //no tasks left, exit if the thread is no longer needed
175 // release unsused thread 181 // release unsused thread
176 if (requestExit && ReleaseThreadSlot(out last)) { 182 if (requestExit && ReleaseThreadSlot(out last)) {
177 // in case at the moment the last thread was being released 183 // in case at the moment the last thread was being released
178 // a new task was added to the queue, we need to try 184 // a new task was added to the queue, we need to try
179 // to revoke the thread to avoid the situation when the task is left unprocessed 185 // to revoke the thread to avoid the situation when the task is left unprocessed
180 if (last && Sleep(0)) { // Sleep(0) will fetch pending task or will return false 186 if (last && FetchSignalOrWait(0)) { // FetchSignalOrWait(0) will fetch pending task or will return false
181 if (AllocateThreadSlot(1)) 187 SignalThread(); // since FetchSignalOrWait(0) has fetched the signal we need to reschedule it
182 return true; // spin again... 188 return AllocateThreadSlot(1); // ensure that at least one thread is alive
183 else
184 SignalThread(); // since Sleep(0) has fetched the signal we neet to reschedule it
185
186 } 189 }
187 190
188 return false; 191 return false;
189 } 192 }
190 193