Skip to content

Commit 4c1e214

Browse files
authored
Merge pull request #2872 from ControlSystemStudio/pva_2871
PVA: TCPHandler started receiver too early
2 parents 0ed38e3 + 050beba commit 4c1e214

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

core/pva/src/main/java/org/epics/pva/client/ClientTCPHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,11 @@ public ClientTCPHandler(final PVAClient client, final InetSocketAddress address,
124124
last_life_sign = last_message_sent = System.currentTimeMillis();
125125
final long period = Math.max(1, PVASettings.EPICS_PVA_CONN_TMO * 1000L / 30 * 3);
126126
alive_check = timer.scheduleWithFixedDelay(this::checkResponsiveness, period, period, TimeUnit.MILLISECONDS);
127-
// Don't start the send thread, yet.
127+
128+
// Start receiver, but not the send thread, yet.
128129
// To prevent sending messages before the server is ready,
129130
// it's started when server confirms the connection.
131+
startReceiver();
130132
}
131133

132134
private static Socket createSocket(final InetSocketAddress address, final boolean tls) throws Exception

core/pva/src/main/java/org/epics/pva/common/TCPHandler.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.net.SocketAddress;
1717
import java.nio.ByteBuffer;
1818
import java.nio.ByteOrder;
19+
import java.util.Objects;
1920
import java.util.concurrent.BlockingQueue;
2021
import java.util.concurrent.ExecutorService;
2122
import java.util.concurrent.Executors;
@@ -61,7 +62,7 @@ abstract public class TCPHandler
6162
private final boolean client_mode;
6263

6364
/** TCP socket to PVA peer
64-
*
65+
*
6566
* Reading and writing is handled by receive and send threads,
6667
* but 'protected' so that derived classes may peek at socket properties.
6768
*/
@@ -105,10 +106,10 @@ public void encodeRequest(final byte version, final ByteBuffer buffer) throws Ex
105106
});
106107

107108
/** Thread that runs {@link TCPHandler#receiver()} */
108-
private final Future<Void> receive_thread;
109+
private volatile Future<Void> receive_thread = null;
109110

110111
/** Thread that runs {@link TCPHandler#sender()} */
111-
private volatile Future<Void> send_thread;
112+
private volatile Future<Void> send_thread = null;
112113

113114
/** Start receiving messages
114115
*
@@ -122,16 +123,21 @@ public void encodeRequest(final byte version, final ByteBuffer buffer) throws Ex
122123
*/
123124
public TCPHandler(final Socket socket, final boolean client_mode)
124125
{
125-
this.socket = socket;
126+
this.socket = Objects.requireNonNull(socket);
126127
this.client_mode = client_mode;
127128

128129
// Receive buffer byte order is set based on header flag of each received message.
129130
// Send buffer of server and client starts out with native byte order.
130131
// For server, it stays that way.
131132
// For client, order is updated during connection validation (PVAHeader.CTRL_SET_BYTE_ORDER)
132133
send_buffer.order(ByteOrder.nativeOrder());
134+
}
133135

134-
// Start receiving data
136+
/** Start receiving data
137+
* To be called by Client/ServerTCPHandler when fully constructed
138+
*/
139+
protected void startReceiver()
140+
{
135141
receive_thread = thread_pool.submit(this::receiver);
136142
}
137143

@@ -558,7 +564,7 @@ public void close(final boolean wait)
558564
{
559565
running = false;
560566
socket.close();
561-
if (wait)
567+
if (wait && receive_thread != null)
562568
receive_thread.get(5, TimeUnit.SECONDS);
563569
}
564570
catch (Exception ex)

core/pva/src/main/java/org/epics/pva/server/ServerTCPHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.net.InetSocketAddress;
1313
import java.net.Socket;
1414
import java.nio.ByteBuffer;
15+
import java.util.Objects;
1516
import java.util.logging.Level;
1617

1718
import org.epics.pva.common.CommandHandlers;
@@ -62,10 +63,11 @@ class ServerTCPHandler extends TCPHandler
6263
public ServerTCPHandler(final PVAServer server, final Socket client, final TLSHandshakeInfo tls_info) throws Exception
6364
{
6465
super(client, false);
65-
this.server = server;
66+
this.server = Objects.requireNonNull(server);
6667
this.tls_info = tls_info;
6768

6869
server.register(this);
70+
startReceiver();
6971
startSender();
7072

7173
// Initialize TCP connection by setting byte order..

0 commit comments

Comments
 (0)