[fuchsia] improve io performance
- reduce wait operations, try a read/write first
- increase buffer size to match io.fidl common message size
- avoid unnecessary non-blocking io
Change-Id: Ibc790edbe6bf445d1fbfa00203fafc58c65842a3
diff --git a/fuchsia/fuchsia-compat.c b/fuchsia/fuchsia-compat.c
index d6e56c1..151ae93 100644
--- a/fuchsia/fuchsia-compat.c
+++ b/fuchsia/fuchsia-compat.c
@@ -141,16 +141,18 @@
uint32_t events;
size_t offset = 0;
while (offset < length) {
- if (fdio_wait_fd(fd, FDIO_EVT_WRITABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
- // Wait failed.
- return false;
- }
ssize_t length_written = write(fd, buffer + offset, length - offset);
if (length_written == -1 && errno == EAGAIN) {
- // Wait and read again.
+ if (fdio_wait_fd(fd, FDIO_EVT_WRITABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
+ // Wait failed.
+ return false;
+ }
+ if ((events & FDIO_EVT_PEER_CLOSED) != 0){
+ return false;
+ }
continue;
}
- if (length_written <= 0) {
+ if (length_written == 0) {
// EOF or error.
return false;
}
@@ -165,15 +167,21 @@
pthread_detach(pthread_self());
int* fds = voidp;
- char buf[128];
+ char buf[FDIO_CHUNK_SIZE];
for (;;) {
uint32_t events;
- if (fdio_wait_fd(fds[0], FDIO_EVT_READABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
- // Wait failed.
- break;
- }
int length = read(fds[0], buf, sizeof(buf));
+ if (length == -1 && errno == EAGAIN) {
+ if (fdio_wait_fd(fds[0], FDIO_EVT_READABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
+ // Wait failed.
+ break;
+ }
+ if ((events & FDIO_EVT_PEER_CLOSED) != 0) {
+ break;
+ }
+ continue;
+ }
if (length <= 0) {
// EOF or error.
break;
@@ -200,9 +208,6 @@
return -1;
}
- set_nonblock(pip[0]);
- set_nonblock(pip[1]);
-
// Allocate the structure to send the fds to the thread.
int* fds = malloc(2 * sizeof(int));
if (!fds) {
@@ -228,16 +233,22 @@
pthread_detach(pthread_self());
int* fds = voidp;
- char buf[128];
+ char buf[FDIO_CHUNK_SIZE];
for (;;) {
- uint32_t events;
- if (fdio_wait_fd(fds[0], FDIO_EVT_READABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
- // Wait failed.
- break;
- }
int length = read(fds[0], buf, sizeof(buf));
- if (length <= 0) {
+ if (length < 0) {
+ uint32_t events;
+ if (fdio_wait_fd(fds[0], FDIO_EVT_READABLE|FDIO_EVT_PEER_CLOSED, &events, ZX_TIME_INFINITE) < 0) {
+ // Wait failed.
+ break;
+ }
+ if ((events & FDIO_EVT_PEER_CLOSED) != 0) {
+ break;
+ }
+ continue;
+ }
+ if (length == 0) {
// EOF or error.
break;
}
@@ -289,9 +300,6 @@
return -1;
}
- set_nonblock(pip[0]);
- set_nonblock(pip[1]);
-
// Allocate the structure to send the fds to the thread.
int* fds = malloc(2 * sizeof(int));
if (!fds) {