summaryrefslogtreecommitdiffstats
path: root/opengl/libs/GLES_trace/src/gltrace_transport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'opengl/libs/GLES_trace/src/gltrace_transport.cpp')
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_transport.cpp132
1 files changed, 83 insertions, 49 deletions
diff --git a/opengl/libs/GLES_trace/src/gltrace_transport.cpp b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
index 0900a11..7758e48 100644
--- a/opengl/libs/GLES_trace/src/gltrace_transport.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
@@ -28,85 +28,119 @@
namespace android {
namespace gltrace {
-int gServerSocket, gClientSocket;
-
-void startServer(int port) {
- if (gServerSocket > 0) {
- ALOGD("startServer: server socket already open!");
- return;
- }
-
- gServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (gServerSocket < 0) {
+int acceptClientConnection(int serverPort) {
+ int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (serverSocket < 0) {
LOGE("Error (%d) while creating socket. Check if app has network permissions.",
- gServerSocket);
- exit(-1);
+ serverSocket);
+ return -1;
}
struct sockaddr_in server, client;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
- server.sin_port = htons(port);
+ server.sin_port = htons(serverPort);
socklen_t sockaddr_len = sizeof(sockaddr_in);
- if (bind(gServerSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
- close(gServerSocket);
+ if (bind(serverSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
+ close(serverSocket);
LOGE("Failed to bind the server socket");
- exit(-1);
+ return -1;
}
- if (listen(gServerSocket, 1) < 0) {
- close(gServerSocket);
+ if (listen(serverSocket, 1) < 0) {
+ close(serverSocket);
LOGE("Failed to listen on server socket");
- exit(-1);
+ return -1;
}
- ALOGD("startServer: server started on %d", port);
+ ALOGD("gltrace::waitForClientConnection: server listening @ port %d", serverPort);
- /* Wait for client connection */
- if ((gClientSocket = accept(gServerSocket, (struct sockaddr *)&client, &sockaddr_len)) < 0) {
- close(gServerSocket);
+ int clientSocket = accept(serverSocket, (struct sockaddr *)&client, &sockaddr_len);
+ if (clientSocket < 0) {
+ close(serverSocket);
LOGE("Failed to accept client connection");
- exit(-1);
+ return -1;
}
- ALOGD("startServer: client connected: %s", inet_ntoa(client.sin_addr));
+ ALOGD("gltrace::waitForClientConnection: client connected: %s", inet_ntoa(client.sin_addr));
+
+ // do not accept any more incoming connections
+ close(serverSocket);
+
+ return clientSocket;
+}
+
+TCPStream::TCPStream(int socket) {
+ mSocket = socket;
+ pthread_mutex_init(&mSocketWriteMutex, NULL);
}
-void stopServer() {
- if (gServerSocket > 0) {
- close(gServerSocket);
- close(gClientSocket);
- gServerSocket = gClientSocket = 0;
+TCPStream::~TCPStream() {
+ pthread_mutex_destroy(&mSocketWriteMutex);
+}
+
+void TCPStream::closeStream() {
+ if (mSocket > 0) {
+ close(mSocket);
+ mSocket = 0;
}
}
-/** Send GLMessage to the receiver on the host. */
-void traceGLMessage(GLMessage *call) {
- if (gClientSocket <= 0) {
- LOGE("traceGLMessage: Attempt to send while client connection is not established");
- return;
+int TCPStream::send(void *buf, size_t len) {
+ if (mSocket <= 0) {
+ return -1;
}
- std::string str;
- call->SerializeToString(&str);
- const uint32_t len = str.length();
+ pthread_mutex_lock(&mSocketWriteMutex);
+ int n = write(mSocket, buf, len);
+ pthread_mutex_unlock(&mSocketWriteMutex);
+
+ return n;
+}
- int n = write(gClientSocket, &len, sizeof len);
- if (n != sizeof len) {
- LOGE("traceGLMessage: Error (%d) while writing message length\n", n);
- stopServer();
- exit(-1);
+int TCPStream::receive(void *data, size_t len) {
+ if (mSocket <= 0) {
+ return -1;
}
- n = write(gClientSocket, str.data(), str.length());
- if (n != (int) str.length()) {
- LOGE("traceGLMessage: Error while writing out message, result = %d, length = %d\n",
- n, str.length());
- stopServer();
- exit(-1);
+ return read(mSocket, data, len);
+}
+
+BufferedOutputStream::BufferedOutputStream(TCPStream *stream, size_t bufferSize) {
+ mStream = stream;
+
+ mBufferSize = bufferSize;
+ mStringBuffer = "";
+ mStringBuffer.reserve(bufferSize);
+}
+
+int BufferedOutputStream::flush() {
+ if (mStringBuffer.size() == 0) {
+ return 0;
+ }
+
+ int n = mStream->send((void *)mStringBuffer.data(), mStringBuffer.size());
+ mStringBuffer.clear();
+ return n;
+}
+
+void BufferedOutputStream::enqueueMessage(GLMessage *msg) {
+ const uint32_t len = msg->ByteSize();
+
+ mStringBuffer.append((const char *)&len, sizeof(len)); // append header
+ msg->AppendToString(&mStringBuffer); // append message
+}
+
+int BufferedOutputStream::send(GLMessage *msg) {
+ enqueueMessage(msg);
+
+ if (mStringBuffer.size() > mBufferSize) {
+ return flush();
}
+
+ return 0;
}
}; // namespace gltrace