+ Event[] get_monitor_events(int expected_len) {
+ if (use_chan_manager_constructor) {
+ while (true) {
+ synchronized (this.pending_manager_events) {
+ if (expected_len != 0 && this.pending_manager_events.size() != expected_len) {
+ break;
+ }
+ }
+ try { Thread.sleep(500); } catch (InterruptedException e) { assert false; }
+ break;
+ }
+ synchronized (this.pending_manager_events) {
+ Event[] res = this.pending_manager_events.toArray(new Event[0]);
+ this.pending_manager_events.clear();
+ assert res.length == expected_len;
+ return res;
+ }
+ } else if (chain_monitor != null) {
+ return chain_monitor.as_EventsProvider().get_and_clear_pending_events();
+ } else {
+ synchronized (monitors) {
+ assert monitors.size() == 1;
+ for (ChannelMonitor mon : monitors.values()) {
+ Event[] res = mon.get_and_clear_pending_events();
+ assert res.length == expected_len;
+ return res;
+ }
+ return null;
+ }
+ }
+ }
+
+ Event[] get_manager_events(int expected_len) {
+ Event[] res = new Event[0];
+ if (use_chan_manager_constructor) {
+ while (res.length < expected_len) {
+ synchronized (this.pending_manager_events) {
+ res = this.pending_manager_events.toArray(res);
+ assert res.length == expected_len || res.length == 0; // We don't handle partial results
+ this.pending_manager_events.clear();
+ if (res.length < expected_len) {
+ try { this.pending_manager_events.wait(); } catch (InterruptedException e) { assert false; }
+ }
+ }
+ }
+ } else {
+ res = this.chan_manager.as_EventsProvider().get_and_clear_pending_events();
+ }
+ assert res.length == expected_len;
+ return res;
+ }
+