mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 21:59:54 +01:00
Add InterruptibleConnection interface for easier testing.
This commit is contained in:
@@ -5,18 +5,28 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.sync.Priority;
|
import org.briarproject.bramble.api.sync.Priority;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chooses one connection per contact and transport to keep open and closes
|
||||||
|
* any other connections.
|
||||||
|
*/
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
interface ConnectionChooser {
|
interface ConnectionChooser {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds the given connection to the chooser with the given priority.
|
* Adds the given connection to the chooser with the given priority.
|
||||||
|
* <p>
|
||||||
|
* If the chooser has a connection with the same contact and transport and
|
||||||
|
* a lower {@link Priority priority}, that connection will be
|
||||||
|
* {@link InterruptibleConnection#interruptOutgoingSession() interrupted}.
|
||||||
|
* If the chooser has a connection with the same contact and transport and
|
||||||
|
* a higher priority, the newly added connection will be interrupted.
|
||||||
*/
|
*/
|
||||||
void addConnection(ContactId c, TransportId t, DuplexSyncConnection conn,
|
void addConnection(ContactId c, TransportId t, InterruptibleConnection conn,
|
||||||
Priority p);
|
Priority p);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the given connection from the chooser.
|
* Removes the given connection from the chooser.
|
||||||
*/
|
*/
|
||||||
void removeConnection(ContactId c, TransportId t,
|
void removeConnection(ContactId c, TransportId t,
|
||||||
DuplexSyncConnection conn);
|
InterruptibleConnection conn);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ class ConnectionChooserImpl implements ConnectionChooser {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addConnection(ContactId c, TransportId t,
|
public void addConnection(ContactId c, TransportId t,
|
||||||
DuplexSyncConnection conn, Priority p) {
|
InterruptibleConnection conn, Priority p) {
|
||||||
DuplexSyncConnection close = null;
|
InterruptibleConnection close = null;
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
Key k = new Key(c, t);
|
Key k = new Key(c, t);
|
||||||
Value best = bestConnections.get(k);
|
Value best = bestConnections.get(k);
|
||||||
@@ -52,7 +52,7 @@ class ConnectionChooserImpl implements ConnectionChooser {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeConnection(ContactId c, TransportId t,
|
public void removeConnection(ContactId c, TransportId t,
|
||||||
DuplexSyncConnection conn) {
|
InterruptibleConnection conn) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
Key k = new Key(c, t);
|
Key k = new Key(c, t);
|
||||||
Value best = bestConnections.get(k);
|
Value best = bestConnections.get(k);
|
||||||
@@ -89,10 +89,10 @@ class ConnectionChooserImpl implements ConnectionChooser {
|
|||||||
|
|
||||||
private static class Value {
|
private static class Value {
|
||||||
|
|
||||||
private final DuplexSyncConnection connection;
|
private final InterruptibleConnection connection;
|
||||||
private final Priority priority;
|
private final Priority priority;
|
||||||
|
|
||||||
private Value(DuplexSyncConnection connection, Priority priority) {
|
private Value(InterruptibleConnection connection, Priority priority) {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
this.priority = priority;
|
this.priority = priority;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ import javax.annotation.concurrent.GuardedBy;
|
|||||||
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
abstract class DuplexSyncConnection extends SyncConnection {
|
abstract class DuplexSyncConnection extends SyncConnection
|
||||||
|
implements InterruptibleConnection {
|
||||||
|
|
||||||
final Executor ioExecutor;
|
final Executor ioExecutor;
|
||||||
final ConnectionChooser connectionChooser;
|
final ConnectionChooser connectionChooser;
|
||||||
@@ -44,7 +45,8 @@ abstract class DuplexSyncConnection extends SyncConnection {
|
|||||||
@GuardedBy("interruptLock")
|
@GuardedBy("interruptLock")
|
||||||
private boolean interruptWaiting = false;
|
private boolean interruptWaiting = false;
|
||||||
|
|
||||||
void interruptOutgoingSession() {
|
@Override
|
||||||
|
public void interruptOutgoingSession() {
|
||||||
synchronized (interruptLock) {
|
synchronized (interruptLock) {
|
||||||
if (outgoingSession == null) interruptWaiting = true;
|
if (outgoingSession == null) interruptWaiting = true;
|
||||||
else outgoingSession.interrupt();
|
else outgoingSession.interrupt();
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package org.briarproject.bramble.connection;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A duplex sync connection that can be closed by interrupting its outgoing
|
||||||
|
* sync session.
|
||||||
|
*/
|
||||||
|
@NotNullByDefault
|
||||||
|
interface InterruptibleConnection {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interrupts the connection's outgoing sync session. If the underlying
|
||||||
|
* transport connection is alive and the remote peer is cooperative, this
|
||||||
|
* should result in both sync sessions ending and the connection being
|
||||||
|
* cleanly closed.
|
||||||
|
*/
|
||||||
|
void interruptOutgoingSession();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user