Mercurial > pub > ImplabNet
comparison Implab/Parallels/WorkerPool.cs @ 21:6a56df4ec59e promises
DispatchPool works again, but performance is poor in some cases
| author | cin |
|---|---|
| date | Tue, 12 Nov 2013 19:52:10 +0400 |
| parents | 1c3b3d518480 |
| children | dabf79fde388 |
comparison
equal
deleted
inserted
replaced
| 20:1c3b3d518480 | 21:6a56df4ec59e |
|---|---|
| 55 protected void EnqueueTask(Action unit) { | 55 protected void EnqueueTask(Action unit) { |
| 56 Debug.Assert(unit != null); | 56 Debug.Assert(unit != null); |
| 57 var len = Interlocked.Increment(ref m_queueLength); | 57 var len = Interlocked.Increment(ref m_queueLength); |
| 58 m_queue.Enqueue(unit); | 58 m_queue.Enqueue(unit); |
| 59 | 59 |
| 60 ExtendPool(); | 60 if (len > m_threshold*ActiveThreads) |
| 61 } | 61 GrowPool(); |
| 62 | |
| 63 protected override bool ExtendPool() { | |
| 64 if (m_queueLength <= m_threshold*ActiveThreads) | |
| 65 // in this case we are in active thread and it request for additional workers | |
| 66 // satisfy it only when queue is longer than threshold | |
| 67 return false; | |
| 68 return base.ExtendPool(); | |
| 69 } | 62 } |
| 70 | 63 |
| 71 protected override bool TryDequeue(out Action unit) { | 64 protected override bool TryDequeue(out Action unit) { |
| 72 if (m_queue.TryDequeue(out unit)) { | 65 if (m_queue.TryDequeue(out unit)) { |
| 73 Interlocked.Decrement(ref m_queueLength); | 66 Interlocked.Decrement(ref m_queueLength); |
| 78 | 71 |
| 79 protected override void InvokeUnit(Action unit) { | 72 protected override void InvokeUnit(Action unit) { |
| 80 unit(); | 73 unit(); |
| 81 } | 74 } |
| 82 | 75 |
| 83 protected override bool Suspend() { | |
| 84 if (m_queueLength == 0) | |
| 85 return base.Suspend(); | |
| 86 else | |
| 87 return true; // spin again without locks... | |
| 88 } | |
| 89 } | 76 } |
| 90 } | 77 } |
