Mercurial > pub > ImplabNet
comparison Implab/AbstractEvent.cs @ 233:d6fe09f5592c v2
Improved AsyncQueue
Removed ImplabFx
| author | cin |
|---|---|
| date | Wed, 04 Oct 2017 15:44:47 +0300 |
| parents | 75103928da09 |
| children | fa6cbf4d8841 |
comparison
equal
deleted
inserted
replaced
| 229:5f7a3e1d32b9 | 233:d6fe09f5592c |
|---|---|
| 22 Exception m_error; | 22 Exception m_error; |
| 23 int m_handlersCount; | 23 int m_handlersCount; |
| 24 | 24 |
| 25 //readonly THandler[] m_handlers = new THandler[RESERVED_HANDLERS_COUNT]; | 25 //readonly THandler[] m_handlers = new THandler[RESERVED_HANDLERS_COUNT]; |
| 26 THandler[] m_handlers; | 26 THandler[] m_handlers; |
| 27 MTQueue<THandler> m_extraHandlers; | 27 SimpleAsyncQueue<THandler> m_extraHandlers; |
| 28 int m_handlerPointer = -1; | 28 int m_handlerPointer = -1; |
| 29 int m_handlersCommited; | 29 int m_handlersCommited; |
| 30 | 30 |
| 31 int m_cancelRequest; | 31 int m_cancelRequest; |
| 32 Exception m_cancelationReason; | 32 Exception m_cancelationReason; |
| 33 MTQueue<Action<Exception>> m_cancelationHandlers; | 33 SimpleAsyncQueue<Action<Exception>> m_cancelationHandlers; |
| 34 | 34 |
| 35 | 35 |
| 36 #region state managment | 36 #region state managment |
| 37 bool BeginTransit() { | 37 bool BeginTransit() { |
| 38 return UNRESOLVED_SATE == Interlocked.CompareExchange(ref m_state, TRANSITIONAL_STATE, UNRESOLVED_SATE); | 38 return UNRESOLVED_SATE == Interlocked.CompareExchange(ref m_state, TRANSITIONAL_STATE, UNRESOLVED_SATE); |
| 180 break; | 180 break; |
| 181 } while(true); | 181 } while(true); |
| 182 } | 182 } |
| 183 } else { | 183 } else { |
| 184 if (slot == RESERVED_HANDLERS_COUNT) { | 184 if (slot == RESERVED_HANDLERS_COUNT) { |
| 185 m_extraHandlers = new MTQueue<THandler>(); | 185 m_extraHandlers = new SimpleAsyncQueue<THandler>(); |
| 186 } else { | 186 } else { |
| 187 while (m_extraHandlers == null) | 187 while (m_extraHandlers == null) |
| 188 Thread.MemoryBarrier(); | 188 Thread.MemoryBarrier(); |
| 189 } | 189 } |
| 190 | 190 |
| 243 Safe.ArgumentNotNull(handler, "handler"); | 243 Safe.ArgumentNotNull(handler, "handler"); |
| 244 if (IsCancellationRequested) | 244 if (IsCancellationRequested) |
| 245 handler(CancellationReason); | 245 handler(CancellationReason); |
| 246 | 246 |
| 247 if (m_cancelationHandlers == null) | 247 if (m_cancelationHandlers == null) |
| 248 Interlocked.CompareExchange(ref m_cancelationHandlers, new MTQueue<Action<Exception>>(), null); | 248 Interlocked.CompareExchange(ref m_cancelationHandlers, new SimpleAsyncQueue<Action<Exception>>(), null); |
| 249 | 249 |
| 250 m_cancelationHandlers.Enqueue(handler); | 250 m_cancelationHandlers.Enqueue(handler); |
| 251 | 251 |
| 252 if (IsCancellationRequested && m_cancelationHandlers.TryDequeue(out handler)) | 252 if (IsCancellationRequested && m_cancelationHandlers.TryDequeue(out handler)) |
| 253 // TryDeque implies MemoryBarrier() | 253 // TryDeque implies MemoryBarrier() |
