X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fldk%2Fbatteries%2FNioPeerHandler.java;h=eac4d8058a898fd7a8af0a61ddb8e2be68627f92;hb=07818350417051973536ab58828f03b70f72ac93;hp=f0a38282d04d7f7fcaf74c8818bbebdf9328fe58;hpb=b0c50b891cbca28d3bd1d86276c132ff5221d8e4;p=ldk-java diff --git a/src/main/java/org/ldk/batteries/NioPeerHandler.java b/src/main/java/org/ldk/batteries/NioPeerHandler.java index f0a38282..eac4d805 100644 --- a/src/main/java/org/ldk/batteries/NioPeerHandler.java +++ b/src/main/java/org/ldk/batteries/NioPeerHandler.java @@ -5,6 +5,7 @@ import org.ldk.structs.*; import java.io.IOException; import java.net.SocketAddress; import java.net.StandardSocketOptions; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.*; @@ -15,13 +16,6 @@ import java.nio.channels.*; public class NioPeerHandler { private static class Peer { SocketDescriptor descriptor; - // When we are told by LDK to disconnect, we can't return to LDK until we are sure - // won't call any more read/write PeerManager functions with the same connection. - // This is set to true if we're in such a condition (with disconnect checked - // before with the Peer monitor lock held) and false when we can return. - boolean block_disconnect_socket = false; - // Indicates LDK told us to disconnect this peer, and thus we should not call socket_disconnected. - boolean disconnect_requested = false; SelectionKey key; } @@ -82,22 +76,12 @@ public class NioPeerHandler { @Override public void disconnect_socket() { - synchronized (peer) { - peer.disconnect_requested = true; - } try { do_selector_action(() -> { peer.key.cancel(); peer.key.channel().close(); }); } catch (IOException ignored) { } - synchronized (peer) { - while (peer.block_disconnect_socket) { - try { - peer.wait(); - } catch (InterruptedException ignored) { } - } - } } @Override public boolean eq(SocketDescriptor other_arg) { return other_arg.hash() == our_id; } @Override public long hash() { return our_id; } @@ -168,11 +152,6 @@ public class NioPeerHandler { continue; // There is no attachment so the rest of the loop is useless } Peer peer = (Peer) key.attachment(); - synchronized (peer) { - if (peer.disconnect_requested) - continue; - peer.block_disconnect_socket = true; - } try { if (key.isValid() && (key.interestOps() & SelectionKey.OP_WRITE) != 0 && key.isWritable()) { Result_NonePeerHandleErrorZ res = this.peer_manager.write_buffer_space_avail(peer.descriptor); @@ -182,13 +161,13 @@ public class NioPeerHandler { } } if (key.isValid() && (key.interestOps() & SelectionKey.OP_READ) != 0 && key.isReadable()) { - buf.clear(); + ((Buffer)buf).clear(); int read = ((SocketChannel) key.channel()).read(buf); if (read == -1) { this.peer_manager.socket_disconnected(peer.descriptor); key.cancel(); } else if (read > 0) { - buf.flip(); + ((Buffer)buf).flip(); byte[] read_bytes = new byte[read]; buf.get(read_bytes, 0, read); Result_boolPeerHandleErrorZ res = this.peer_manager.read_event(peer.descriptor, read_bytes); @@ -207,10 +186,6 @@ public class NioPeerHandler { key.cancel(); peer_manager.socket_disconnected(peer.descriptor); } - synchronized (peer) { - peer.block_disconnect_socket = false; - peer.notifyAll(); - } } catch (CancelledKeyException e) { try { key.channel().close(); } catch (IOException ignored) { } // The key is only cancelled when we have notified the PeerManager that the socket is closed, so @@ -294,4 +269,4 @@ public class NioPeerHandler { public void check_events() { selector.wakeup(); } -} \ No newline at end of file +}