| @@ -1,6 +1,7 | |||||
| 1 | using Implab.Diagnostics; |  | 1 | using Implab.Diagnostics; | |
| 2 | using System; |  | 2 | using System; | |
| 3 | using System.Threading; |  | 3 | using System.Threading; | |
|  | 4 | using System.Linq; | |||
| 4 |  | 5 | |||
| 5 | namespace Implab.Parallels { |  | 6 | namespace Implab.Parallels { | |
| 6 | /// <summary> |  | 7 | /// <summary> | |
| @@ -73,5 +74,13 namespace Implab.Parallels { | |||||
| 73 |  | 74 | |||
| 74 | return p; |  | 75 | return p; | |
| 75 | } |  | 76 | } | |
|  | 77 | ||||
|  | 78 | public static IPromise[] ThreadRun(params Action[] func) { | |||
|  | 79 | return func.Select(f => InvokeNewThread(f)).ToArray(); | |||
|  | 80 | } | |||
|  | 81 | ||||
|  | 82 | public static IPromise<T>[] ThreadRun<T>(params Func<T>[] func) { | |||
|  | 83 | return func.Select(f => InvokeNewThread(f)).ToArray(); | |||
|  | 84 | } | |||
| 76 | } |  | 85 | } | |
| 77 | } |  | 86 | } | |
| @@ -36,19 +36,14 namespace Implab.Parallels { | |||||
| 36 | } |  | 36 | } | |
| 37 |  | 37 | |||
| 38 | public bool TryEnqueue(T value,out bool extend) { |  | 38 | public bool TryEnqueue(T value,out bool extend) { | |
| 39 | extend = false; |  | 39 | var alloc = Interlocked.Increment(ref m_alloc) - 1; | |
| 40 | int alloc; |  | |||
| 41 | do { |  | |||
| 42 | alloc = m_alloc; |  | |||
| 43 | if (alloc > m_size) |  | |||
| 44 | return false; |  | |||
| 45 | } while(alloc != Interlocked.CompareExchange(ref m_alloc, alloc+1, alloc)); |  | |||
| 46 |  | 40 | |||
| 47 | if (alloc |  | 41 | if (alloc >= m_size) { | |
| 48 | extend = |  | 42 | extend = alloc == m_size; | |
| 49 | return false; |  | 43 | return false; | |
| 50 | } |  | 44 | } | |
| 51 |  | 45 | |||
|  | 46 | extend = false; | |||
| 52 | m_data[alloc] = value; |  | 47 | m_data[alloc] = value; | |
| 53 |  | 48 | |||
| 54 | while (alloc != Interlocked.CompareExchange(ref m_hi, alloc + 1, alloc)) { |  | 49 | while (alloc != Interlocked.CompareExchange(ref m_hi, alloc + 1, alloc)) { | |
| @@ -74,6 +69,38 namespace Implab.Parallels { | |||||
| 74 | return true; |  | 69 | return true; | |
| 75 | } |  | 70 | } | |
| 76 |  | 71 | |||
|  | 72 | public bool TryEnqueueBatch(T[] batch, int offset, int length, out int enqueued, out bool extend) { | |||
|  | 73 | int alloc; | |||
|  | 74 | int allocSize; | |||
|  | 75 | ||||
|  | 76 | do { | |||
|  | 77 | alloc = m_alloc; | |||
|  | 78 | ||||
|  | 79 | if (alloc > m_size) { | |||
|  | 80 | enqueued = 0; | |||
|  | 81 | extend = false; | |||
|  | 82 | return false; | |||
|  | 83 | } | |||
|  | 84 | ||||
|  | 85 | allocSize = Math.Min(m_size - m_alloc, length); | |||
|  | 86 | } while(alloc != Interlocked.CompareExchange(ref m_alloc, alloc + allocSize, alloc)); | |||
|  | 87 | ||||
|  | 88 | if (alloc == m_size) { | |||
|  | 89 | enqueued = 0; | |||
|  | 90 | extend = true; | |||
|  | 91 | return false; | |||
|  | 92 | } | |||
|  | 93 | ||||
|  | 94 | Array.Copy(batch, offset, m_data, alloc, allocSize); | |||
|  | 95 | enqueued = allocSize; | |||
|  | 96 | extend = false; | |||
|  | 97 | ||||
|  | 98 | while (alloc != Interlocked.CompareExchange(ref m_hi, alloc + allocSize, alloc)) { | |||
|  | 99 | // spin wait for commit | |||
|  | 100 | } | |||
|  | 101 | return true; | |||
|  | 102 | } | |||
|  | 103 | ||||
| 77 | public T GetAt(int pos) { |  | 104 | public T GetAt(int pos) { | |
| 78 | return m_data[pos]; |  | 105 | return m_data[pos]; | |
| 79 | } |  | 106 | } | |
| @@ -19,30 +19,30 namespace MonoPlay { | |||||
| 19 |  | 19 | |||
| 20 | var t1 = Environment.TickCount; |  | 20 | var t1 = Environment.TickCount; | |
| 21 |  | 21 | |||
| 22 | new [] { |  | 22 | AsyncPool.ThreadRun( | |
| 23 |  |  | 23 | () => { | |
| 24 | for (var i = 0; i < count; i++) |  | 24 | for (var i = 0; i < count; i++) | |
| 25 | q1.Enqueue(i); |  | 25 | q1.Enqueue(i); | |
| 26 | } |  | 26 | }, | |
| 27 |  |  | 27 | () => { | |
| 28 | for (var i = 0; i < count; i++) |  | 28 | for (var i = 0; i < count; i++) | |
| 29 | q1.Enqueue(i); |  | 29 | q1.Enqueue(i); | |
| 30 | } |  | 30 | }, | |
| 31 |  |  | 31 | () => { | |
| 32 | int temp = 0; |  | 32 | int temp = 0; | |
| 33 | int i = 0; |  | 33 | int i = 0; | |
| 34 | while (i < count) |  | 34 | while (i < count) | |
| 35 | if (q1.TryDequeue(out temp)) |  | 35 | if (q1.TryDequeue(out temp)) | |
| 36 | i++; |  | 36 | i++; | |
| 37 | } |  | 37 | }, | |
| 38 |  |  | 38 | () => { | |
| 39 | int temp = 0; |  | 39 | int temp = 0; | |
| 40 | int i = 0; |  | 40 | int i = 0; | |
| 41 | while (i < count) |  | 41 | while (i < count) | |
| 42 | if (q1.TryDequeue(out temp)) |  | 42 | if (q1.TryDequeue(out temp)) | |
| 43 | i++; |  | 43 | i++; | |
| 44 | } |  | 44 | } | |
| 45 |  |  | 45 | ) | |
| 46 | .Combine() |  | 46 | .Combine() | |
| 47 | .Join(); |  | 47 | .Join(); | |
| 48 |  | 48 | |||
| @@ -65,18 +65,18 namespace MonoPlay { | |||||
| 65 | t1 = Environment.TickCount; |  | 65 | t1 = Environment.TickCount; | |
| 66 |  | 66 | |||
| 67 |  | 67 | |||
| 68 | new [] { |  | 68 | AsyncPool.ThreadRun( | |
| 69 |  |  | 69 | () => { | |
| 70 | for (var i = 0; i < count; i++) |  | 70 | for (var i = 0; i < count; i++) | |
| 71 | lock (q2) |  | 71 | lock (q2) | |
| 72 | q2.Enqueue(i); |  | 72 | q2.Enqueue(i); | |
| 73 | } |  | 73 | }, | |
| 74 |  |  | 74 | () => { | |
| 75 | for (var i = 0; i < count; i++) |  | 75 | for (var i = 0; i < count; i++) | |
| 76 | lock (q2) |  | 76 | lock (q2) | |
| 77 | q2.Enqueue(i); |  | 77 | q2.Enqueue(i); | |
| 78 | } |  | 78 | }, | |
| 79 |  |  | 79 | () => { | |
| 80 | for (int i = 0; i < count ;) |  | 80 | for (int i = 0; i < count ;) | |
| 81 | lock (q2) { |  | 81 | lock (q2) { | |
| 82 | if (q2.Count == 0) |  | 82 | if (q2.Count == 0) | |
| @@ -85,8 +85,8 namespace MonoPlay { | |||||
| 85 | i++; |  | 85 | i++; | |
| 86 | } |  | 86 | } | |
| 87 |  | 87 | |||
| 88 | } |  | 88 | }, | |
| 89 |  |  | 89 | () => { | |
| 90 | for (int i = 0; i < count ;) |  | 90 | for (int i = 0; i < count ;) | |
| 91 | lock (q2) { |  | 91 | lock (q2) { | |
| 92 | if (q2.Count == 0) |  | 92 | if (q2.Count == 0) | |
| @@ -95,8 +95,8 namespace MonoPlay { | |||||
| 95 | i++; |  | 95 | i++; | |
| 96 | } |  | 96 | } | |
| 97 |  | 97 | |||
| 98 | } |  | 98 | } | |
| 99 |  |  | 99 | ) | |
| 100 | .Combine() |  | 100 | .Combine() | |
| 101 | .Join(); |  | 101 | .Join(); | |
| 102 |  | 102 | |||
        
        General Comments 0
    
    
  
  
                      You need to be logged in to leave comments.
                      Login now
                    
                