comparison Implab/Parallels/WorkerPool.cs @ 17:7cd4a843b4e4 promises

Improved worker pool
author cin
date Fri, 08 Nov 2013 01:25:42 +0400
parents 5a4b735ba669
children 1c3b3d518480
comparison
equal deleted inserted replaced
16:5a4b735ba669 17:7cd4a843b4e4
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 (ThreadCount == 0) 60 if(!ExtendPool())
61 // force to start 61 WakePool();
62 WakeNewWorker(false);
63 } 62 }
64 63
65 protected override void WakeNewWorker(bool extend) { 64 protected override bool ExtendPool() {
66 if (extend && m_queueLength <= m_threshold) 65 if (m_queueLength <= m_threshold*ThreadCount)
67 // in this case we are in active thread and it request for additional workers 66 // in this case we are in active thread and it request for additional workers
68 // satisfy it only when queue is longer than threshold 67 // satisfy it only when queue is longer than threshold
69 return; 68 return false;
70 base.WakeNewWorker(extend); 69 return base.ExtendPool();
71 } 70 }
72 71
73 protected override bool TryDequeue(out Action unit) { 72 protected override bool TryDequeue(out Action unit) {
74 if (m_queue.TryDequeue(out unit)) { 73 if (m_queue.TryDequeue(out unit)) {
75 Interlocked.Decrement(ref m_queueLength); 74 Interlocked.Decrement(ref m_queueLength);