X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fldk%2Fstructs%2FEventsProvider.java;h=f4f22f3933eeacb55f7d063b04a14d2def807a35;hb=5e9de82b3a7712a41189756d9d16d946142b2ac5;hp=7bcb3367d63ffaab7f515a6cf7cdafb76d7ce3c1;hpb=246459dcbc3be28c38b4951140a5933f4b3aa024;p=ldk-java diff --git a/src/main/java/org/ldk/structs/EventsProvider.java b/src/main/java/org/ldk/structs/EventsProvider.java index 7bcb3367..f4f22f39 100644 --- a/src/main/java/org/ldk/structs/EventsProvider.java +++ b/src/main/java/org/ldk/structs/EventsProvider.java @@ -4,7 +4,41 @@ import org.ldk.impl.bindings; import org.ldk.enums.*; import org.ldk.util.*; import java.util.Arrays; +import java.lang.ref.Reference; +import javax.annotation.Nullable; +/** + * A trait indicating an object may generate events. + * + * Events are processed by passing an [`EventHandler`] to [`process_pending_events`]. + * + * # Requirements + * + * When using this trait, [`process_pending_events`] will call [`handle_event`] for each pending + * event since the last invocation. + * + * In order to ensure no [`Event`]s are lost, implementors of this trait will persist [`Event`]s + * and replay any unhandled events on startup. An [`Event`] is considered handled when + * [`process_pending_events`] returns, thus handlers MUST fully handle [`Event`]s and persist any + * relevant changes to disk *before* returning. + * + * Further, because an application may crash between an [`Event`] being handled and the + * implementor of this trait being re-serialized, [`Event`] handling must be idempotent - in + * effect, [`Event`]s may be replayed. + * + * Note, handlers may call back into the provider and thus deadlocking must be avoided. Be sure to + * consult the provider's documentation on the implication of processing events and how a handler + * may safely use the provider (e.g., see [`ChannelManager::process_pending_events`] and + * [`ChainMonitor::process_pending_events`]). + * + * (C-not implementable) As there is likely no reason for a user to implement this trait on their + * own type(s). + * + * [`process_pending_events`]: Self::process_pending_events + * [`handle_event`]: EventHandler::handle_event + * [`ChannelManager::process_pending_events`]: crate::ln::channelmanager::ChannelManager#method.process_pending_events + * [`ChainMonitor::process_pending_events`]: crate::chain::chainmonitor::ChainMonitor#method.process_pending_events + */ @SuppressWarnings("unchecked") // We correctly assign various generic arrays public class EventsProvider extends CommonBase { final bindings.LDKEventsProvider bindings_instance; @@ -20,31 +54,36 @@ public class EventsProvider extends CommonBase { } public static interface EventsProviderInterface { - Event[] get_and_clear_pending_events(); + /** + * Processes any events generated since the last call using the given event handler. + * + * See the trait-level documentation for requirements. + */ + void process_pending_events(EventHandler handler); } private static class LDKEventsProviderHolder { EventsProvider held; } public static EventsProvider new_impl(EventsProviderInterface arg) { final LDKEventsProviderHolder impl_holder = new LDKEventsProviderHolder(); impl_holder.held = new EventsProvider(new bindings.LDKEventsProvider() { - @Override public long[] get_and_clear_pending_events() { - Event[] ret = arg.get_and_clear_pending_events(); - long[] result = Arrays.stream(ret).mapToLong(ret_conv_7 -> ret_conv_7.ptr).toArray(); - /* TODO 2 Event */; - return result; + @Override public void process_pending_events(long handler) { + EventHandler ret_hu_conv = new EventHandler(null, handler); + if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.add(this); }; + arg.process_pending_events(ret_hu_conv); + Reference.reachabilityFence(arg); } }); return impl_holder.held; } - public Event[] get_and_clear_pending_events() { - long[] ret = bindings.EventsProvider_get_and_clear_pending_events(this.ptr); - Event[] ret_conv_7_arr = new Event[ret.length]; - for (int h = 0; h < ret.length; h++) { - long ret_conv_7 = ret[h]; - Event ret_conv_7_hu_conv = Event.constr_from_ptr(ret_conv_7); - ret_conv_7_hu_conv.ptrs_to.add(this); - ret_conv_7_arr[h] = ret_conv_7_hu_conv; - } - return ret_conv_7_arr; + /** + * Processes any events generated since the last call using the given event handler. + * + * See the trait-level documentation for requirements. + */ + public void process_pending_events(EventHandler handler) { + bindings.EventsProvider_process_pending_events(this.ptr, handler == null ? 0 : handler.ptr); + Reference.reachabilityFence(this); + Reference.reachabilityFence(handler); + if (this != null) { this.ptrs_to.add(handler); }; } }