private void async_cancel_(long id, Action ntf) { for (LinkedListNode <tuple <long, go_mutex, Action> > it = _waitQueue.First; null != it; it = it.Next) { if (id == it.Value.value1) { go_mutex mtx = it.Value.value2; mtx.async_cancel(id, ntf); return; } } ntf(); }
internal void async_timed_wait(long id, int ms, go_mutex mutex, Action <bool> ntf) { mutex.async_unlock(id, delegate() { if (_strand.running_in_this_thread()) { if (!_mustTick) { async_timed_wait_(id, ms, mutex, ntf); } else { _strand.add_last(() => async_timed_wait_(id, ms, mutex, ntf)); } } else { _strand.post(() => async_timed_wait_(id, ms, mutex, ntf)); } }); }
private void async_timed_wait_(long id, int ms, go_mutex mutex, Action <bool> ntf) { if (ms >= 0) { async_timer timer = new async_timer(_strand); LinkedListNode <tuple <long, go_mutex, Action> > node = _waitQueue.AddLast(new tuple <long, go_mutex, Action>(id, mutex, delegate() { timer.cancel(); mutex.async_lock(id, () => ntf(true)); })); timer.timeout(ms, delegate() { _waitQueue.Remove(node); mutex.async_lock(id, () => ntf(false)); }); } else { _waitQueue.AddLast(new tuple <long, go_mutex, Action>(id, mutex, () => mutex.async_lock(id, () => ntf(true)))); } }
internal void async_wait(long id, go_mutex mutex, Action ntf) { mutex.async_unlock(id, delegate() { if (_strand.running_in_this_thread()) { if (!_mustTick) { _waitQueue.AddLast(new tuple <long, go_mutex, Action>(id, mutex, () => mutex.async_lock(id, ntf))); } else { _strand.add_last(() => _waitQueue.AddLast(new tuple <long, go_mutex, Action>(id, mutex, () => mutex.async_lock(id, ntf)))); } } else { _strand.post(() => _waitQueue.AddLast(new tuple <long, go_mutex, Action>(id, mutex, () => mutex.async_lock(id, ntf)))); } }); }
public ValueTask <bool> timed_wait(go_mutex mutex, int ms) { return(generator.condition_timed_wait(this, mutex, ms)); }
public Task timed_wait(async_result_wrap <bool> res, go_mutex mutex, int ms) { return(generator.condition_timed_wait(res, this, mutex, ms)); }
public Task wait(go_mutex mutex) { return(generator.condition_wait(this, mutex)); }