diff --git a/briar-api/src/org/briarproject/api/event/ShutdownEvent.java b/briar-api/src/org/briarproject/api/event/ShutdownEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..b4d65fbb69e2765ed712063e18829598a1bb0401 --- /dev/null +++ b/briar-api/src/org/briarproject/api/event/ShutdownEvent.java @@ -0,0 +1,6 @@ +package org.briarproject.api.event; + +/** An event that is broadcast when the app is shutting down. */ +public class ShutdownEvent extends Event { + +} diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java index e6ff2c9780cb1ed18666dbb6f1f9e81ff6895324..6c68745f9cc221467c056a8c67a409fdab691ce6 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java @@ -19,6 +19,8 @@ import javax.inject.Inject; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.Service; import org.briarproject.api.system.Clock; @@ -30,6 +32,7 @@ class LifecycleManagerImpl implements LifecycleManager { private final Clock clock; private final DatabaseComponent db; + private final EventBus eventBus; private final Collection<Service> services; private final Collection<ExecutorService> executors; private final Semaphore startStopSemaphore = new Semaphore(1); @@ -38,9 +41,10 @@ class LifecycleManagerImpl implements LifecycleManager { private final CountDownLatch shutdownLatch = new CountDownLatch(1); @Inject - LifecycleManagerImpl(Clock clock, DatabaseComponent db) { + LifecycleManagerImpl(Clock clock, DatabaseComponent db, EventBus eventBus) { this.clock = clock; this.db = db; + this.eventBus = eventBus; services = new CopyOnWriteArrayList<Service>(); executors = new CopyOnWriteArrayList<ExecutorService>(); } @@ -111,6 +115,7 @@ class LifecycleManagerImpl implements LifecycleManager { } try { LOG.info("Stopping services"); + eventBus.broadcast(new ShutdownEvent()); for(Service s : services) { boolean stopped = s.stop(); if(LOG.isLoggable(INFO)) { diff --git a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java index ae8265cd6e316f500f025644251e8d2f7ec9ff1c..d2eeab7a9ad34964f432a519a2406ae66ca5738b 100644 --- a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java +++ b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java @@ -30,6 +30,7 @@ import org.briarproject.api.event.MessageToRequestEvent; import org.briarproject.api.event.RemoteRetentionTimeUpdatedEvent; import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent; import org.briarproject.api.event.RemoteTransportsUpdatedEvent; +import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.TransportRemovedEvent; import org.briarproject.api.messaging.Ack; import org.briarproject.api.messaging.MessagingSession; @@ -169,6 +170,8 @@ class DuplexOutgoingSession implements MessagingSession, EventListener { (RemoteTransportsUpdatedEvent) e; if(r.getContactId().equals(contactId)) dbExecutor.execute(new GenerateTransportAcks()); + } else if(e instanceof ShutdownEvent) { + interrupt(); } else if(e instanceof TransportRemovedEvent) { TransportRemovedEvent t = (TransportRemovedEvent) e; if(t.getTransportId().equals(transportId)) interrupt(); diff --git a/briar-core/src/org/briarproject/messaging/IncomingSession.java b/briar-core/src/org/briarproject/messaging/IncomingSession.java index ff5c7e9b1589b962ed31146afa2c209d56415ef2..bdb3a96c30bb6c670716a1c7bc16eed138ac22a1 100644 --- a/briar-core/src/org/briarproject/messaging/IncomingSession.java +++ b/briar-core/src/org/briarproject/messaging/IncomingSession.java @@ -17,6 +17,7 @@ import org.briarproject.api.event.ContactRemovedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; +import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.TransportRemovedEvent; import org.briarproject.api.messaging.Ack; import org.briarproject.api.messaging.Message; @@ -108,8 +109,7 @@ class IncomingSession implements MessagingSession, EventListener { } public void interrupt() { - // This won't interrupt a blocking read, but the read will throw an - // exception when the transport connection is closed + // FIXME: This won't interrupt a blocking read interrupted = true; } @@ -117,6 +117,8 @@ class IncomingSession implements MessagingSession, EventListener { if(e instanceof ContactRemovedEvent) { ContactRemovedEvent c = (ContactRemovedEvent) e; if(c.getContactId().equals(contactId)) interrupt(); + } else if(e instanceof ShutdownEvent) { + interrupt(); } else if(e instanceof TransportRemovedEvent) { TransportRemovedEvent t = (TransportRemovedEvent) e; if(t.getTransportId().equals(transportId)) interrupt(); diff --git a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java b/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java index 4f4d0acd91d91fc504832ce4bc821ee3c44bb797..32a197f5a6b3f73817e7028f00eae7cca38e076d 100644 --- a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java +++ b/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java @@ -21,6 +21,7 @@ import org.briarproject.api.event.ContactRemovedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; +import org.briarproject.api.event.ShutdownEvent; import org.briarproject.api.event.TransportRemovedEvent; import org.briarproject.api.messaging.Ack; import org.briarproject.api.messaging.MessagingSession; @@ -121,6 +122,8 @@ class SimplexOutgoingSession implements MessagingSession, EventListener { if(e instanceof ContactRemovedEvent) { ContactRemovedEvent c = (ContactRemovedEvent) e; if(c.getContactId().equals(contactId)) interrupt(); + } else if(e instanceof ShutdownEvent) { + interrupt(); } else if(e instanceof TransportRemovedEvent) { TransportRemovedEvent t = (TransportRemovedEvent) e; if(t.getTransportId().equals(transportId)) interrupt();