Revert "put gl pipes in nonblocking mode"
This reverts commit d3bca26efeec406d39aa77326c3878a05e573e71.
Reason for revert: cause CTS regression in CtsOpenGlPerf2TestCases
BUG: 138452674
Change-Id: I54da80e3e0168930e01a3c54b4940b4488d8fd3b
diff --git a/shared/OpenglCodecCommon/qemu_pipe.h b/shared/OpenglCodecCommon/qemu_pipe.h
index 82c4a94..429b3fe 100644
--- a/shared/OpenglCodecCommon/qemu_pipe.h
+++ b/shared/OpenglCodecCommon/qemu_pipe.h
@@ -41,16 +41,6 @@
#define QEMU_PIPE_INVALID_HANDLE (-1)
-#ifndef QEMU_PIPE_RETRY
-#define QEMU_PIPE_RETRY(exp) ({ \
- __typeof__(exp) _rc; \
- do { \
- _rc = (exp); \
- } while (_rc == -1 && (errno == EINTR || errno == EAGAIN)); \
- _rc; }) \
-
-#endif
-
#ifndef QEMU_PIPE_PATH
#define QEMU_PIPE_PATH "/dev/qemu_pipe"
#endif
@@ -90,7 +80,7 @@
const uint8_t* p = (const uint8_t*)(data);
size_t remaining = byte_count;
while (remaining > 0) {
- ssize_t n = QEMU_PIPE_RETRY(write(fd, p, remaining));
+ ssize_t n = TEMP_FAILURE_RETRY(write(fd, p, remaining));
if (n == -1) return false;
p += n;
remaining -= n;
@@ -133,10 +123,9 @@
snprintf(buff, sizeof buff, "pipe:%s", pipeName);
- fd = QEMU_PIPE_RETRY(open(QEMU_PIPE_PATH, O_RDWR | O_NONBLOCK));
- if (fd < 0 && errno == ENOENT) {
- fd = QEMU_PIPE_RETRY(open("/dev/goldfish_pipe", O_RDWR | O_NONBLOCK));
- }
+ fd = TEMP_FAILURE_RETRY(open(QEMU_PIPE_PATH, O_RDWR));
+ if (fd < 0 && errno == ENOENT)
+ fd = TEMP_FAILURE_RETRY(open("/dev/goldfish_pipe", O_RDWR));
if (fd < 0) {
D("%s: Could not open " QEMU_PIPE_PATH ": %s", __FUNCTION__, strerror(errno));
//errno = ENOSYS;
@@ -170,7 +159,7 @@
static __inline__ bool
qemu_pipe_try_again() {
- return errno == EINTR || errno == EAGAIN;
+ return errno == EINTR;
}
static __inline__ bool
diff --git a/system/OpenglSystemCommon/ProcessPipe.cpp b/system/OpenglSystemCommon/ProcessPipe.cpp
index e04d153..3f203f1 100644
--- a/system/OpenglSystemCommon/ProcessPipe.cpp
+++ b/system/OpenglSystemCommon/ProcessPipe.cpp
@@ -142,7 +142,7 @@
stat =
qemu_pipe_read(sProcPipe, (char*)&sProcUID,
sizeof(sProcUID));
- } while (stat < 0 && (errno == EINTR || errno == EAGAIN));
+ } while (stat < 0 && errno == EINTR);
if (stat != sizeof(sProcUID)) {
qemu_pipe_close(sProcPipe);
diff --git a/system/OpenglSystemCommon/QemuPipeStream.cpp b/system/OpenglSystemCommon/QemuPipeStream.cpp
index 4f5bd24..ea1dda7 100644
--- a/system/OpenglSystemCommon/QemuPipeStream.cpp
+++ b/system/OpenglSystemCommon/QemuPipeStream.cpp
@@ -26,16 +26,11 @@
#include <unistd.h>
#include <string.h>
-static const size_t kReadSize = 512 * 1024;
-static const size_t kWriteOffset = kReadSize;
-
QemuPipeStream::QemuPipeStream(size_t bufSize) :
IOStream(bufSize),
m_sock((QEMU_PIPE_HANDLE)(-1)),
m_bufsize(bufSize),
- m_buf(NULL),
- m_read(0),
- m_readLeft(0)
+ m_buf(NULL)
{
}
@@ -43,9 +38,7 @@
IOStream(bufSize),
m_sock(sock),
m_bufsize(bufSize),
- m_buf(NULL),
- m_read(0),
- m_readLeft(0)
+ m_buf(NULL)
{
}
@@ -74,9 +67,6 @@
void *QemuPipeStream::allocBuffer(size_t minSize)
{
- // Add dedicated read buffer space at the front of the buffer.
- minSize += kReadSize;
-
size_t allocSize = (m_bufsize < minSize ? minSize : m_bufsize);
if (!m_buf) {
m_buf = (unsigned char *)malloc(allocSize);
@@ -94,13 +84,13 @@
}
}
- return m_buf + kWriteOffset;
+ return m_buf;
};
int QemuPipeStream::commitBuffer(size_t size)
{
if (size == 0) return 0;
- return writeFully(m_buf + kWriteOffset, size);
+ return writeFully(m_buf, size);
}
int QemuPipeStream::writeFully(const void *buf, size_t len)
@@ -150,96 +140,44 @@
const unsigned char *QemuPipeStream::readFully(void *buf, size_t len)
{
- return commitBufferAndReadFully(0, buf, len);
-}
-
-const unsigned char *QemuPipeStream::commitBufferAndReadFully(size_t writeSize, void *userReadBufPtr, size_t totalReadSize) {
-
- unsigned char* userReadBuf = static_cast<unsigned char*>(userReadBufPtr);
-
+ //DBG(">> QemuPipeStream::readFully %d\n", len);
if (!valid()) return NULL;
-
- if (!userReadBuf) {
- if (totalReadSize > 0) {
- ALOGE("QemuPipeStream::commitBufferAndReadFully failed, userReadBuf=NULL, totalReadSize %zu, lethal"
- " error, exiting.", totalReadSize);
+ if (!buf) {
+ if (len > 0) {
+ // If len is non-zero, buf must not be NULL. Otherwise the pipe would be
+ // in a corrupted state, which is lethal for the emulator.
+ ERR("QemuPipeStream::readFully failed, buf=NULL, len %zu, lethal"
+ " error, exiting.", len);
abort();
}
- if (!writeSize) {
+ return NULL; // do not allow NULL buf in that implementation
+ }
+ size_t res = len;
+ while (res > 0) {
+ ssize_t stat = qemu_pipe_read(m_sock, (char *)(buf) + len - res, res);
+ if (stat == 0) {
+ // client shutdown;
return NULL;
+ } else if (stat < 0) {
+ if (qemu_pipe_try_again()) {
+ continue;
+ } else {
+ ERR("QemuPipeStream::readFully failed (buf %p, len %zu"
+ ", res %zu): %s, lethal error, exiting.", buf, len, res,
+ strerror(errno));
+ abort();
+ }
+ } else {
+ res -= stat;
}
}
+ //DBG("<< QemuPipeStream::readFully %d\n", len);
+ return (const unsigned char *)buf;
+}
- // Advance buffered read if not yet consumed.
- size_t remaining = totalReadSize;
- size_t bufferedReadSize = m_readLeft < remaining ? m_readLeft : remaining;
- if (bufferedReadSize) {
- memcpy(userReadBuf, m_buf + (m_read - m_readLeft), bufferedReadSize);
- remaining -= bufferedReadSize;
- m_readLeft -= bufferedReadSize;
- }
-
- // Early out if nothing left to do.
- if (!writeSize && !remaining) {
- return userReadBuf;
- }
-
- int writeFullyRes = writeFully(m_buf + kWriteOffset, writeSize);
-
- // Now done writing. Early out if no reading left to do.
- if (!remaining) {
- return userReadBuf;
- }
-
- // Read up to kReadSize bytes if all buffered read has been consumed.
- size_t maxRead = m_readLeft ? 0 : kReadSize;
-
- ssize_t actual = 0;
-
- if (maxRead) {
- actual = qemu_pipe_read(m_sock, m_buf, maxRead);
- // Updated buffered read size.
- if (actual > 0) {
- m_read = m_readLeft = actual;
- }
-
- if (actual == 0) {
- ALOGD("%s: end of pipe", __FUNCTION__);
- return NULL;
- }
- }
-
- // Consume buffered read and read more if necessary.
- while (remaining) {
- bufferedReadSize = m_readLeft < remaining ? m_readLeft : remaining;
- if (bufferedReadSize) {
- memcpy(userReadBuf + (totalReadSize - remaining),
- m_buf + (m_read - m_readLeft),
- bufferedReadSize);
- remaining -= bufferedReadSize;
- m_readLeft -= bufferedReadSize;
- continue;
- }
-
- actual = qemu_pipe_read(m_sock, m_buf, kReadSize);
-
- if (actual == 0) {
- ALOGD("%s: Failed reading from pipe: %d", __FUNCTION__, errno);
- return NULL;
- }
-
- if (actual > 0) {
- m_read = m_readLeft = actual;
- continue;
- }
-
- if (!qemu_pipe_try_again()) {
- ALOGD("%s: Error reading from pipe: %d", __FUNCTION__, errno);
- return NULL;
- }
- }
-
- return userReadBuf;
+const unsigned char *QemuPipeStream::commitBufferAndReadFully(size_t size, void *buf, size_t len)
+{
+ return commitBuffer(size) ? nullptr : readFully(buf, len);
}
const unsigned char *QemuPipeStream::read( void *buf, size_t *inout_len)
@@ -278,9 +216,8 @@
if (res == 0) { /* EOF */
break;
}
- if (qemu_pipe_try_again()) {
+ if (qemu_pipe_try_again())
continue;
- }
/* A real error */
if (ret == 0)
diff --git a/system/OpenglSystemCommon/QemuPipeStream.h b/system/OpenglSystemCommon/QemuPipeStream.h
index 65755da..f8d6fef 100644
--- a/system/OpenglSystemCommon/QemuPipeStream.h
+++ b/system/OpenglSystemCommon/QemuPipeStream.h
@@ -55,13 +55,13 @@
QEMU_PIPE_HANDLE m_sock;
size_t m_bufsize;
unsigned char *m_buf;
- size_t m_read;
- size_t m_readLeft;
#ifdef __Fuchsia__
fuchsia::hardware::goldfish::pipe::DeviceSyncPtr m_device;
fuchsia::hardware::goldfish::pipe::PipeSyncPtr m_pipe;
zx::event m_event;
zx::vmo m_vmo;
+ size_t m_read = 0;
+ size_t m_readLeft = 0;
#endif
QemuPipeStream(QEMU_PIPE_HANDLE sock, size_t bufSize);
};
diff --git a/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp b/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
index e0aa0b5..de95a8d 100644
--- a/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
+++ b/system/OpenglSystemCommon/QemuPipeStreamFuchsia.cpp
@@ -234,7 +234,7 @@
}
// Early out if nothing left to do.
- if (!size && !remaining) {
+ if (!size && !remaining) {
return static_cast<const unsigned char *>(buf);
}