Mercurial > pub > ImplabNet
comparison Implab/Parallels/DispatchPool.cs @ 34:dabf79fde388
fixed race condition in DispatchPool
| author | cin |
|---|---|
| date | Thu, 10 Apr 2014 04:20:25 +0400 |
| parents | 2fad2d1f4b03 |
| children | 2fc0fbe7d58b |
comparison
equal
deleted
inserted
replaced
| 33:b255e4aeef17 | 34:dabf79fde388 |
|---|---|
| 153 EnsurePoolIsAlive(); | 153 EnsurePoolIsAlive(); |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 } | 156 } |
| 157 | 157 |
| 158 private void EnsurePoolIsAlive() { | 158 protected void EnsurePoolIsAlive() { |
| 159 if (AllocateThreadSlot(1)) { | 159 if (AllocateThreadSlot(1)) { |
| 160 // if there were no threads in the pool | 160 // if there were no threads in the pool |
| 161 var worker = new Thread(this.Worker); | 161 var worker = new Thread(this.Worker); |
| 162 worker.IsBackground = true; | 162 worker.IsBackground = true; |
| 163 worker.Start(); | 163 worker.Start(); |
| 164 } | 164 } |
| 165 } | 165 } |
| 166 | 166 |
| 167 private bool Suspend() { | 167 protected virtual bool Suspend() { |
| 168 //no tasks left, exit if the thread is no longer needed | 168 //no tasks left, exit if the thread is no longer needed |
| 169 bool last; | 169 bool last; |
| 170 bool requestExit; | 170 bool requestExit; |
| 171 | 171 |
| 172 // if threads have a timeout before releasing | 172 // if threads have a timeout before releasing |
| 293 // fetch task | 293 // fetch task |
| 294 if (TryDequeue(out unit)) { | 294 if (TryDequeue(out unit)) { |
| 295 InvokeUnit(unit); | 295 InvokeUnit(unit); |
| 296 continue; | 296 continue; |
| 297 } | 297 } |
| 298 | |
| 299 Interlocked.Decrement(ref m_activeThreads); | 298 Interlocked.Decrement(ref m_activeThreads); |
| 300 | 299 |
| 301 // entering suspend state | 300 // entering suspend state |
| 302 // keep this thread and wait | 301 // keep this thread and wait |
| 303 if (!Suspend()) | 302 if (!Suspend()) |
