Mercurial > pub > ImplabNet
comparison Implab/Parallels/DispatchPool.cs @ 24:ee04e1fa78da
fixed dispatch pool race condition
author | cin |
---|---|
date | Thu, 14 Nov 2013 01:15:07 +0400 |
parents | 5a35900264f5 |
children | 2fad2d1f4b03 |
comparison
equal
deleted
inserted
replaced
23:f0568ff069a5 | 24:ee04e1fa78da |
---|---|
149 worker.IsBackground = true; | 149 worker.IsBackground = true; |
150 worker.Start(); | 150 worker.Start(); |
151 } | 151 } |
152 } else { | 152 } else { |
153 // if there is no sleeping threads in the pool | 153 // if there is no sleeping threads in the pool |
154 StartWorker(); | 154 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 | |
156 // send it a signal to spin again | |
157 SignalThread(); | |
155 } | 158 } |
156 } | 159 } |
157 | 160 |
158 private bool Suspend() { | 161 private bool Suspend() { |
159 //no tasks left, exit if the thread is no longer needed | 162 //no tasks left, exit if the thread is no longer needed |
279 Interlocked.Decrement(ref m_activeThreads); | 282 Interlocked.Decrement(ref m_activeThreads); |
280 if (ReleaseThreadSlotAnyway()) // it was the last worker | 283 if (ReleaseThreadSlotAnyway()) // it was the last worker |
281 m_hasTasks.Dispose(); | 284 m_hasTasks.Dispose(); |
282 else | 285 else |
283 SignalThread(); // wake next worker | 286 SignalThread(); // wake next worker |
284 unit = default(TUnit); | |
285 break; | 287 break; |
286 } | 288 } |
287 | 289 |
288 // fetch task | 290 // fetch task |
289 if (TryDequeue(out unit)) { | 291 if (TryDequeue(out unit)) { |