Merge "gltrace: Allow receiving commands of length > 4" into jb-dev

This commit is contained in:
Siva Velusamy 2012-05-16 15:33:16 -07:00 committed by Android (Google) Code Review
commit f34ec7a476
3 changed files with 53 additions and 9 deletions

View File

@ -44,9 +44,14 @@ static void *commandReceiveTask(void *arg) {
GLTraceState *state = (GLTraceState *)arg; GLTraceState *state = (GLTraceState *)arg;
TCPStream *stream = state->getStream(); TCPStream *stream = state->getStream();
// Currently, there are very few user configurable settings. // The control stream always receives an integer size of the
// As a result, they can be encoded in a single integer. // command buffer, followed by the actual command buffer.
int cmd; uint32_t cmdSize;
// Command Buffer
void *cmdBuf = NULL;
uint32_t cmdBufSize = 0;
enum TraceSettingsMasks { enum TraceSettingsMasks {
READ_FB_ON_EGLSWAP_MASK = 1 << 0, READ_FB_ON_EGLSWAP_MASK = 1 << 0,
READ_FB_ON_GLDRAW_MASK = 1 << 1, READ_FB_ON_GLDRAW_MASK = 1 << 1,
@ -54,12 +59,33 @@ static void *commandReceiveTask(void *arg) {
}; };
while (true) { while (true) {
int n = stream->receive(&cmd, 4); // read command size
if (n != 4) { if (stream->receive(&cmdSize, sizeof(uint32_t)) < 0) {
break;
}
cmdSize = ntohl(cmdSize);
// ensure command buffer is of required size
if (cmdBufSize < cmdSize) {
free(cmdBuf);
cmdBufSize = cmdSize;
cmdBuf = malloc(cmdSize);
if (cmdBuf == NULL)
break;
}
// receive the command
if (stream->receive(cmdBuf, cmdSize) < 0) {
break; break;
} }
cmd = ntohl(cmd); if (cmdSize != sizeof(uint32_t)) {
// Currently, we only support commands that are a single integer,
// so we skip all other commands
continue;
}
uint32_t cmd = ntohl(*(uint32_t*)cmdBuf);
bool collectFbOnEglSwap = (cmd & READ_FB_ON_EGLSWAP_MASK) != 0; bool collectFbOnEglSwap = (cmd & READ_FB_ON_EGLSWAP_MASK) != 0;
bool collectFbOnGlDraw = (cmd & READ_FB_ON_GLDRAW_MASK) != 0; bool collectFbOnGlDraw = (cmd & READ_FB_ON_GLDRAW_MASK) != 0;
@ -73,6 +99,9 @@ static void *commandReceiveTask(void *arg) {
collectFbOnEglSwap, collectFbOnGlDraw, collectTextureData); collectFbOnEglSwap, collectFbOnGlDraw, collectTextureData);
} }
ALOGE("Stopping OpenGL Trace Command Receiver\n");
free(cmdBuf);
return NULL; return NULL;
} }

View File

@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@ -123,7 +124,18 @@ int TCPStream::receive(void *data, size_t len) {
return -1; return -1;
} }
return read(mSocket, data, len); size_t totalRead = 0;
while (totalRead < len) {
int n = read(mSocket, (uint8_t*)data + totalRead, len - totalRead);
if (n < 0) {
ALOGE("Error receiving data from stream: %d", errno);
return -1;
}
totalRead += n;
}
return 0;
} }
BufferedOutputStream::BufferedOutputStream(TCPStream *stream, size_t bufferSize) { BufferedOutputStream::BufferedOutputStream(TCPStream *stream, size_t bufferSize) {

View File

@ -42,8 +42,11 @@ public:
/** Send @data of size @len to host. . Returns -1 on error, 0 on success. */ /** Send @data of size @len to host. . Returns -1 on error, 0 on success. */
int send(void *data, size_t len); int send(void *data, size_t len);
/** Receive data into @buf from the remote end. This is a blocking call. */ /**
int receive(void *buf, size_t size); * Receive @len bytes of data into @buf from the remote end. This is a blocking call.
* Returns -1 on failure, 0 on success.
*/
int receive(void *buf, size_t len);
}; };
/** /**