private static void EventCompletion(IntPtr ptr) { if (handleToCallback.ContainsKey(ptr)) { var ev = new BPSEvent(ptr, false); var callback = handleToCallback[ptr]; handleToCallback.Remove(ptr); try { callback(ev); } catch { } } BPSEventPayload.FreeDataPointer(bps_event_get_payload(ptr)); }
private BPSEvent(int domain, uint code, BPSEventPayload payload, Action <BPSEvent> completionFunction, bool recordCompletion) : this(IntPtr.Zero, true) { if (domain < 0 || domain > BPS_EVENT_DOMAIN_MAX) { throw new ArgumentOutOfRangeException("domain", domain, "0 <= domain < BPS_EVENT_DOMAIN_MAX"); } if (code > ushort.MaxValue) { throw new ArgumentOutOfRangeException("code", code, "0 <= code < UInt16.MaxValue"); } Util.GetBPSOrException(); var payloadPtr = payload.GetDataPointer(); var success = bps_event_create(out handle, (uint)domain, code, payloadPtr, EventCompletion) != BPS.BPS_SUCCESS; if (payloadPtr != IntPtr.Zero) { if (!success) { BPSEventPayload.FreeDataPointer(payloadPtr); } Stdlib.free(payloadPtr); } if (success) { if (recordCompletion) { handleToCallback.Add(handle, completionFunction); } } else { Util.ThrowExceptionForLastErrno(); } IsDisposable = true; }