Mercurial > pub > ImplabNet
comparison Implab/Parallels/MTQueue.cs @ 19:e3935fdf59a2 promises
Promise is rewritten to use interlocked operations instead of locks
| author | cin |
|---|---|
| date | Sun, 10 Nov 2013 00:21:33 +0400 |
| parents | e943453e5039 |
| children | ee04e1fa78da |
comparison
equal
deleted
inserted
replaced
| 17:7cd4a843b4e4 | 19:e3935fdf59a2 |
|---|---|
| 40 if (first == null) | 40 if (first == null) |
| 41 return false; | 41 return false; |
| 42 next = first.next; | 42 next = first.next; |
| 43 if (next == null) { | 43 if (next == null) { |
| 44 // this is the last element, | 44 // this is the last element, |
| 45 // then try to update tail | 45 // then try to update the tail |
| 46 if (first != Interlocked.CompareExchange(ref m_last, null, first)) { | 46 if (first != Interlocked.CompareExchange(ref m_last, null, first)) { |
| 47 // this is inconsistent situation which means that the queue is empty | 47 // this is a ace condition |
| 48 if (m_last == null) | 48 if (m_last == null) |
| 49 // the queue is empty | |
| 49 return false; | 50 return false; |
| 50 // tail has been changed, that means that we need to restart | 51 // tail has been changed, than we need to restart |
| 51 continue; | 52 continue; |
| 52 } | 53 } |
| 53 | 54 |
| 54 // tail succesfully updated and first.next will never be changed | 55 // tail succesfully updated and first.next will never be changed |
| 55 // other readers will fail due to inconsistency m_last != m_fist, but m_first.next == null | 56 // other readers will fail due to inconsistency m_last != m_fist, but m_first.next == null |
