From b25581f7a46e64cb6dcd8d1167e02b1102f0a769 Mon Sep 17 00:00:00 2001
From: Florian Fittkau <ffi@informatik.uni-kiel.de>
Date: Wed, 18 Mar 2015 22:48:39 +0100
Subject: [PATCH] WiP

---
 .../connector/TCPConnector.java               | 35 +++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/explorviz/live_trace_processing/connector/TCPConnector.java b/src/explorviz/live_trace_processing/connector/TCPConnector.java
index aa61398..348e593 100644
--- a/src/explorviz/live_trace_processing/connector/TCPConnector.java
+++ b/src/explorviz/live_trace_processing/connector/TCPConnector.java
@@ -36,6 +36,7 @@ IRecordSender {
 	private final ByteBuffer stringBuffer = ByteBuffer.allocate(Constants.SENDING_BUFFER_SIZE);
 
 	private volatile boolean shouldDisconnect = false;
+	private volatile boolean finishedSendingStrings = false;
 
 	private final SinglePipeConnector<IRecord> tcpConnectorConnector;
 
@@ -73,16 +74,19 @@ IRecordSender {
 			} catch (final InterruptedException e) {
 			}
 		}
+		finishedSendingStrings = false;
 
 		socketChannel = SocketChannel.open(new InetSocketAddress(getProviderURL().getHost(),
 				getProviderURL().getPort()));
 		stringRegistry.sendOutAllStringRegistryRecords();
+
+		finishedSendingStrings = true;
 	}
 
 	@Override
 	public void sendOutStringRecord(final StringRegistryRecord record) {
 		record.putIntoByteBuffer(stringBuffer, stringRegistry, this);
-		send(stringBuffer);
+		prioritizedSend(stringBuffer);
 	}
 
 	@Override
@@ -113,7 +117,8 @@ IRecordSender {
 
 	@Override
 	public void send(final ByteBuffer buffer) {
-		while ((socketChannel == null) || (!socketChannel.isConnected())) {
+		while ((socketChannel == null) || (!socketChannel.isConnected())
+				|| (!finishedSendingStrings)) {
 			try {
 				Thread.sleep(1);
 			} catch (final InterruptedException e) {
@@ -137,6 +142,32 @@ IRecordSender {
 		}
 	}
 
+	public void prioritizedSend(final ByteBuffer buffer) {
+		while ((socketChannel == null) || (!socketChannel.isConnected())) {
+			try {
+				Thread.sleep(1);
+			} catch (final InterruptedException e) {
+			}
+		}
+
+		try {
+			buffer.flip();
+			while (buffer.hasRemaining()) {
+				socketChannel.write(buffer);
+			}
+			doDisconnectIfNessecary();
+		} catch (final IOException e) {
+			System.out
+					.println("WARNING: Connection was closed during String sending - possible data loss");
+			try {
+				socketChannel.close();
+			} catch (final IOException e1) {
+			}
+		} finally {
+			buffer.clear();
+		}
+	}
+
 	private void doDisconnectIfNessecary() {
 		if (shouldDisconnect) {
 			if ((socketChannel != null) && socketChannel.isConnected()) {
-- 
GitLab