Moved lifecycle management into briar-core and reconfigured executors.

CryptoExecutor and DatabaseExecutor now use bounded thread pools with
unbounded queues, since running too many tasks in parallel is likely to
harm performance; IncomingConnectionExecutor, PluginExecutor and
ReliabilityExecutor use unbounded thread pools with direct handoff,
since their tasks may run indefinitely. There are no longer any bounded
executors, and all executors discard tasks when shutting down, which
fixes issue #3612189.

Responsibility for starting and stopping services has been moved from
BriarService in briar-android to LifecycleManagerImpl in briar-core.
However, BriarService is still responsible for stopping the
Android-specific executors, which is ugly. It would be better if
executors registered themselves with LifecycleManager.
This commit is contained in:
akwizgran
2013-05-04 01:25:30 +01:00
parent e1842e11c5
commit 673d7fa0c3
44 changed files with 432 additions and 583 deletions

View File

@@ -48,6 +48,9 @@ import net.sf.briar.lifecycle.LifecycleModule;
import net.sf.briar.messaging.MessagingModule;
import net.sf.briar.messaging.duplex.DuplexMessagingModule;
import net.sf.briar.messaging.simplex.SimplexMessagingModule;
import net.sf.briar.plugins.JavaSePluginsModule;
import net.sf.briar.plugins.PluginsModule;
import net.sf.briar.reliability.ReliabilityModule;
import net.sf.briar.serial.SerialModule;
import net.sf.briar.transport.TransportModule;
@@ -79,9 +82,11 @@ public class ProtocolIntegrationTest extends BriarTestCase {
public ProtocolIntegrationTest() throws Exception {
super();
Injector i = Guice.createInjector(new TestDatabaseModule(),
new ClockModule(), new CryptoModule(), new DatabaseModule(),
new LifecycleModule(), new MessagingModule(),
new DuplexMessagingModule(), new SimplexMessagingModule(),
new TestUiModule(), new ClockModule(), new CryptoModule(),
new DatabaseModule(), new LifecycleModule(),
new MessagingModule(), new DuplexMessagingModule(),
new SimplexMessagingModule(), new PluginsModule(),
new JavaSePluginsModule(), new ReliabilityModule(),
new SerialModule(), new TransportModule());
connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);

View File

@@ -0,0 +1,24 @@
package net.sf.briar;
import net.sf.briar.api.ui.UiCallback;
import com.google.inject.AbstractModule;
public class TestUiModule extends AbstractModule {
@Override
protected void configure() {
bind(UiCallback.class).toInstance(new UiCallback() {
public int showChoice(String[] options, String... message) {
return -1;
}
public boolean showConfirmationMessage(String... message) {
return false;
}
public void showMessage(String... message) {}
});
}
}

View File

@@ -9,6 +9,7 @@ import java.util.Random;
import net.sf.briar.BriarTestCase;
import net.sf.briar.TestDatabaseModule;
import net.sf.briar.TestUiModule;
import net.sf.briar.TestUtils;
import net.sf.briar.api.Author;
import net.sf.briar.api.AuthorId;
@@ -38,6 +39,9 @@ import net.sf.briar.lifecycle.LifecycleModule;
import net.sf.briar.messaging.MessagingModule;
import net.sf.briar.messaging.duplex.DuplexMessagingModule;
import net.sf.briar.plugins.ImmediateExecutor;
import net.sf.briar.plugins.JavaSePluginsModule;
import net.sf.briar.plugins.PluginsModule;
import net.sf.briar.reliability.ReliabilityModule;
import net.sf.briar.serial.SerialModule;
import net.sf.briar.transport.TransportModule;
@@ -80,11 +84,13 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
}
private Injector createInjector(File dir) {
return Guice.createInjector(new ClockModule(), new CryptoModule(),
return Guice.createInjector(new TestDatabaseModule(dir),
new TestUiModule(), new ClockModule(), new CryptoModule(),
new DatabaseModule(), new LifecycleModule(),
new MessagingModule(), new SerialModule(),
new TestDatabaseModule(dir), new SimplexMessagingModule(),
new TransportModule(), new DuplexMessagingModule());
new MessagingModule(), new DuplexMessagingModule(),
new SimplexMessagingModule(), new PluginsModule(),
new JavaSePluginsModule(), new ReliabilityModule(),
new SerialModule(), new TransportModule());
}
@Test

View File

@@ -1,13 +1,12 @@
package net.sf.briar.plugins;
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import net.sf.briar.BriarTestCase;
import net.sf.briar.TestUtils;
import net.sf.briar.api.TransportId;
import net.sf.briar.api.android.AndroidExecutor;
import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.plugins.duplex.DuplexPlugin;
import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
@@ -29,9 +28,7 @@ public class PluginManagerImplTest extends BriarTestCase {
@Test
public void testStartAndStop() throws Exception {
Mockery context = new Mockery();
final ExecutorService pluginExecutor = Executors.newCachedThreadPool();
final AndroidExecutor androidExecutor =
context.mock(AndroidExecutor.class);
final Executor pluginExecutor = Executors.newCachedThreadPool();
final SimplexPluginConfig simplexPluginConfig =
context.mock(SimplexPluginConfig.class);
final DuplexPluginConfig duplexPluginConfig =
@@ -119,12 +116,10 @@ public class PluginManagerImplTest extends BriarTestCase {
// Stop the plugins
oneOf(simplexPlugin).stop();
oneOf(duplexPlugin).stop();
// Shut down the executor
oneOf(androidExecutor).shutdown();
}});
PluginManagerImpl p = new PluginManagerImpl(pluginExecutor,
androidExecutor, simplexPluginConfig, duplexPluginConfig, db,
poller, dispatcher, uiCallback);
simplexPluginConfig, duplexPluginConfig, db, poller,
dispatcher, uiCallback);
// Two plugins should be started and stopped
assertEquals(2, p.start());
assertEquals(2, p.stop());