From 2da873aa01a691c3472b2325c42ee0f71d187790 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 29 Apr 2013 13:28:25 +0100 Subject: [PATCH] Moved synchronisation out of event handler. Fixes issue #3611966. --- .../sf/briar/transport/KeyManagerImpl.java | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java index eb0ee7a6da..9597af9ca0 100644 --- a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java +++ b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java @@ -329,30 +329,14 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener { public void eventOccurred(DatabaseEvent e) { if(e instanceof ContactRemovedEvent) { - ContactId c = ((ContactRemovedEvent) e).getContactId(); - connectionRecogniser.removeSecrets(c); - // FIXME: Listeners should not block - synchronized(this) { - removeAndEraseSecrets(c, oldSecrets); - removeAndEraseSecrets(c, currentSecrets); - removeAndEraseSecrets(c, newSecrets); - } + ContactRemovedEvent c = (ContactRemovedEvent) e; + timer.schedule(new ContactRemovedTask(c), 0); } else if(e instanceof TransportAddedEvent) { TransportAddedEvent t = (TransportAddedEvent) e; - // FIXME: Listeners should not block - synchronized(this) { - maxLatencies.put(t.getTransportId(), t.getMaxLatency()); - } + timer.schedule(new TransportAddedTask(t), 0); } else if(e instanceof TransportRemovedEvent) { - TransportId t = ((TransportRemovedEvent) e).getTransportId(); - connectionRecogniser.removeSecrets(t); - // FIXME: Listeners should not block - synchronized(this) { - maxLatencies.remove(t); - removeAndEraseSecrets(t, oldSecrets); - removeAndEraseSecrets(t, currentSecrets); - removeAndEraseSecrets(t, newSecrets); - } + TransportRemovedEvent t = (TransportRemovedEvent) e; + timer.schedule(new TransportRemovedTask(t), 0); } } @@ -410,4 +394,58 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener { return false; } } + + private class ContactRemovedTask extends TimerTask { + + private final ContactRemovedEvent event; + + private ContactRemovedTask(ContactRemovedEvent event) { + this.event = event; + } + + public void run() { + ContactId c = event.getContactId(); + connectionRecogniser.removeSecrets(c); + synchronized(KeyManagerImpl.this) { + removeAndEraseSecrets(c, oldSecrets); + removeAndEraseSecrets(c, currentSecrets); + removeAndEraseSecrets(c, newSecrets); + } + } + } + + private class TransportAddedTask extends TimerTask { + + private final TransportAddedEvent event; + + private TransportAddedTask(TransportAddedEvent event) { + this.event = event; + } + + public void run() { + synchronized(KeyManagerImpl.this) { + maxLatencies.put(event.getTransportId(), event.getMaxLatency()); + } + } + } + + private class TransportRemovedTask extends TimerTask { + + private TransportRemovedEvent event; + + private TransportRemovedTask(TransportRemovedEvent event) { + this.event = event; + } + + public void run() { + TransportId t = event.getTransportId(); + connectionRecogniser.removeSecrets(t); + synchronized(KeyManagerImpl.this) { + maxLatencies.remove(t); + removeAndEraseSecrets(t, oldSecrets); + removeAndEraseSecrets(t, currentSecrets); + removeAndEraseSecrets(t, newSecrets); + } + } + } } -- GitLab