private CallOneResult CallOne(TLS tls) { CallbackInfo info = tls.Head; if (info == null) { return(CallOneResult.Empty); } IDInfo idinfo = null; idinfo = GetIdInfo(info.RemovalId); if (idinfo != null) { CallbackInterface cb = info.Callback; lock (idinfo.calling_rw_mutex) { CallbackInterface.CallResult result = CallbackInterface.CallResult.Invalid; tls.SpliceOut(info); if (!info.MarkedForRemoval) { try { result = cb.Call(); } catch (Exception ex) { ROS.Error()($"[{ThisNode.Name}] Error during callback. Error: {ex.ToString()}, Stacktrace: {ex.StackTrace}"); } } if (result == CallbackInterface.CallResult.TryAgain && !info.MarkedForRemoval) { lock ( mutex ) { callbacks.Add(info); count++; } return(CallOneResult.TryAgain); } } return(CallOneResult.Called); } CallbackInfo cbi = tls.SpliceOut(info); if (cbi != null) { cbi.Callback.Call(); } return(CallOneResult.Called); }
public CallOneResult CallOne(TLS tls) { CallbackInfo info = tls.Head; if (info == null) { return(CallOneResult.Empty); } IDInfo idinfo = null; idinfo = GetIdInfo(info.RemovalId); if (idinfo != null) { CallbackInterface cb = info.Callback; lock (idinfo.calling_rw_mutex) { CallbackInterface.CallResult result = CallbackInterface.CallResult.Invalid; tls.SpliceOut(info); if (!info.MarkedForRemoval) { result = cb.Call(); } if (result == CallbackInterface.CallResult.TryAgain && !info.MarkedForRemoval) { lock ( mutex ) { callbacks.Add(info); count++; } return(CallOneResult.TryAgain); } } return(CallOneResult.Called); } CallbackInfo cbi = tls.SpliceOut(info); if (cbi != null) { cbi.Callback.Call(); } return(CallOneResult.Called); }
public CallOneResult CallOne() { CallbackInfo call; lock (gate) { if (!enabled) { return(CallOneResult.Disabled); } if (callbacks.Count == 0) { return(CallOneResult.Empty); } call = callbacks.Front; callbacks.PopFront(); calling += 1; } var owner = call.Owner; try { CallbackInterface cb = call.Callback; var result = CallbackInterface.CallResult.Invalid; if (owner != null) { Monitor.Enter(owner); } try { result = cb.Call(); } catch (Exception ex) { ROS.Error()("Error during callback. Error: %s, Stacktrace: %s", ex.ToString(), ex.StackTrace); } if (result == CallbackInterface.CallResult.TryAgain) { lock (gate) { callbacks.PushBack(call); } return(CallOneResult.TryAgain); } return(CallOneResult.Called); } finally { if (owner != null) { Monitor.Exit(owner); } lock (gate) { calling -= 1; } } }