Mercurial > pub > ImplabNet
comparison Implab/Parallels/WorkerPool.cs @ 20:1c3b3d518480 promises
refactoring, sync
author | cin |
---|---|
date | Tue, 12 Nov 2013 02:27:22 +0400 |
parents | 7cd4a843b4e4 |
children | 6a56df4ec59e |
comparison
equal
deleted
inserted
replaced
19:e3935fdf59a2 | 20:1c3b3d518480 |
---|---|
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 if(!ExtendPool()) | 60 ExtendPool(); |
61 WakePool(); | |
62 } | 61 } |
63 | 62 |
64 protected override bool ExtendPool() { | 63 protected override bool ExtendPool() { |
65 if (m_queueLength <= m_threshold*ThreadCount) | 64 if (m_queueLength <= m_threshold*ActiveThreads) |
66 // in this case we are in active thread and it request for additional workers | 65 // in this case we are in active thread and it request for additional workers |
67 // satisfy it only when queue is longer than threshold | 66 // satisfy it only when queue is longer than threshold |
68 return false; | 67 return false; |
69 return base.ExtendPool(); | 68 return base.ExtendPool(); |
70 } | 69 } |
79 | 78 |
80 protected override void InvokeUnit(Action unit) { | 79 protected override void InvokeUnit(Action unit) { |
81 unit(); | 80 unit(); |
82 } | 81 } |
83 | 82 |
84 protected override void Suspend() { | 83 protected override bool Suspend() { |
85 if (m_queueLength == 0) | 84 if (m_queueLength == 0) |
86 base.Suspend(); | 85 return base.Suspend(); |
86 else | |
87 return true; // spin again without locks... | |
87 } | 88 } |
88 } | 89 } |
89 } | 90 } |