You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/11/24 19:47:16 UTC

svn commit: r883810 [1/3] - in /commons/sandbox/runtime/trunk/src/main/native: Makefile.in Makefile.msc.in include/arch/unix/acr_arch.h os/unix/fsysio.c os/unix/fsysrw.c os/win32/fsysio.c os/win32/fsysrw.c

Author: mturk
Date: Tue Nov 24 18:47:13 2009
New Revision: 883810

URL: http://svn.apache.org/viewvc?rev=883810&view=rev
Log:
Split fsysrw.c files

Added:
    commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c   (with props)
    commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysrw.c   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.in
    commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
    commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/fsysio.c

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.in?rev=883810&r1=883809&r2=883810&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Tue Nov 24 18:47:13 2009
@@ -128,6 +128,7 @@
 	$(SRCDIR)/os/unix/file.$(OBJ) \
 	$(SRCDIR)/os/unix/finfo.$(OBJ) \
 	$(SRCDIR)/os/unix/fsysio.$(OBJ) \
+	$(SRCDIR)/os/unix/fsysrw.$(OBJ) \
 	$(SRCDIR)/os/unix/main.$(OBJ) \
 	$(SRCDIR)/os/unix/ios.$(OBJ) \
 	$(SRCDIR)/os/unix/group.$(OBJ) \
@@ -167,6 +168,7 @@
 	$(SRCDIR)/os/unix/file.$(OBJ) \
 	$(SRCDIR)/os/unix/finfo.$(OBJ) \
 	$(SRCDIR)/os/unix/fsysio.$(OBJ) \
+	$(SRCDIR)/os/unix/fsysrw.$(OBJ) \
 	$(SRCDIR)/os/unix/main.$(OBJ) \
 	$(SRCDIR)/os/unix/ios.$(OBJ) \
 	$(SRCDIR)/os/unix/group.$(OBJ) \
@@ -203,6 +205,7 @@
 	$(SRCDIR)/os/unix/file.$(OBJ) \
 	$(SRCDIR)/os/unix/finfo.$(OBJ) \
 	$(SRCDIR)/os/unix/fsysio.$(OBJ) \
+	$(SRCDIR)/os/unix/fsysrw.$(OBJ) \
 	$(SRCDIR)/os/unix/main.$(OBJ) \
 	$(SRCDIR)/os/unix/ios.$(OBJ) \
 	$(SRCDIR)/os/unix/group.$(OBJ) \
@@ -240,6 +243,7 @@
 	$(SRCDIR)/os/unix/file.$(OBJ) \
 	$(SRCDIR)/os/unix/finfo.$(OBJ) \
 	$(SRCDIR)/os/unix/fsysio.$(OBJ) \
+	$(SRCDIR)/os/unix/fsysrw.$(OBJ) \
 	$(SRCDIR)/os/unix/main.$(OBJ) \
 	$(SRCDIR)/os/unix/ios.$(OBJ) \
 	$(SRCDIR)/os/unix/group.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=883810&r1=883809&r2=883810&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Tue Nov 24 18:47:13 2009
@@ -121,6 +121,7 @@
 	$(SRCDIR)/os/win32/file.$(OBJ) \
 	$(SRCDIR)/os/win32/finfo.$(OBJ) \
 	$(SRCDIR)/os/win32/fsysio.$(OBJ) \
+	$(SRCDIR)/os/win32/fsysrw.$(OBJ) \
 	$(SRCDIR)/os/win32/main.$(OBJ) \
 	$(SRCDIR)/os/win32/platform.$(OBJ) \
 	$(SRCDIR)/os/win32/proc.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=883810&r1=883809&r2=883810&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h Tue Nov 24 18:47:13 2009
@@ -200,7 +200,7 @@
     ssize_t r;
     do {
         r = read(fd, buf, count);
-    } while (r < 0 && errno == EINTR);
+    } while (r == -1 && errno == EINTR);
 
     return r;
 }
@@ -211,7 +211,31 @@
     ssize_t w;
     do {
         w = write(fd, buf, count);
-    } while (w < 0 && errno == EINTR);
+    } while (w == -1 && errno == EINTR);
+
+    return w;
+}
+
+/* restartable pread() */
+static ACR_INLINE ssize_t r_pread(int fd, void *buf, size_t count,
+                                  off_t offset)
+{
+    ssize_t r;
+    do {
+        r = pread(fd, buf, count, offset);
+    } while (r == -1 && errno == EINTR);
+
+    return r;
+}
+
+/* restartable pwrite() */
+static ACR_INLINE ssize_t r_pwrite(int fd, const void *buf, size_t count,
+                                   off_t offset)
+{
+    ssize_t w;
+    do {
+        w = pwrite(fd, buf, count, offset);
+    } while (w == -1 && errno == EINTR);
 
     return w;
 }

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c?rev=883810&r1=883809&r2=883810&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c Tue Nov 24 18:47:13 2009
@@ -389,61 +389,6 @@
     return fdo;
 }
 
-static int wait_for_io_or_timeout(acr_file_t *f, int for_read)
-{
-    int rc;
-    acr_time_t     prev, nexttime;
-    struct timeval t;
-    int    timeout  = f->timeout;
-
-    f->ppoll.fd     = f->fd;
-    f->ppoll.events = for_read ? POLLIN : POLLOUT;
-    /* Store the the current time
-     */
-    gettimeofday(&t, NULL);
-    prev = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
-    for (;;) {
-        rc = poll(&f->ppoll, 1, timeout);
-        if (rc == -1 && errno == EINTR) {
-            if (timeout >= 0) {
-                gettimeofday(&t, NULL);
-                nexttime = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
-                timeout -= (int)(nexttime - prev);
-                if (timeout <= 0) {
-                    rc = 0;
-                    break;
-                }
-                prev = nexttime;
-            }
-        }
-        else
-            break;
-    }
-    if (rc == 0)
-        return ACR_TIMEUP;
-    else if (rc > 0)
-        return ACR_SUCCESS;
-    else
-        return errno;
-}
-
-static int wait_for_io(acr_file_t *f, int for_read)
-{
-    int rc;
-    f->ppoll.fd     = f->fd;
-    f->ppoll.events = for_read ? POLLIN : POLLOUT;
-
-    do {
-        rc = poll(&f->ppoll, 1, -1);
-    } while (rc == -1 && errno == EINTR);
-    if (rc == 0)
-        return ACR_TIMEUP;
-    else if (rc > 0)
-        return ACR_SUCCESS;
-    else
-        return errno;
-}
-
 ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, lock0)(ACR_JNISTDARGS,
                                                  jint file,
                                                  jint type)
@@ -722,913 +667,3 @@
         return 0;
 }
 
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read0)(ACR_JNISTDARGS,
-                                                 jint file)
-{
-    unsigned char c;
-    ssize_t rd;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    if (f->eof) {
-        return -1;
-    }
-    rd = r_read(f->fd, &c, 1);
-    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
-            rd = r_read(f->fd, &c, 1);
-        }
-    }
-    if (rd == -1) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (rd == 0) {
-        ACR_DescriptorSetErrEx(_E, f->descriptor, ACR_EOF);
-        f->eof = 1;
-        return  -1;
-    }
-    if (rd > 0)
-        return (jint)rd;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ETIMEOUT, rc);
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read1)(ACR_JNISTDARGS,
-                                                 jint file,
-                                                 jbyteArray buf,
-                                                 jint off,
-                                                 jint len)
-{
-    jbyte  *bb = NULL;
-    jbyte  *bc = NULL;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    jbyte   onstack[ACR_PBUFF_SIZ];
-    ssize_t rd;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    if (f->eof) {
-        return -1;
-    }
-    if (cs > sizeof(onstack)) {
-        if (cs > (1024 * 1024)) {
-            bc = (*_E)->GetByteArrayElements(_E, buf, NULL);
-            if (bc)
-                bb = bc + po;
-        }
-        else
-            bb = ACR_Malloc(_E, THROW_FMARK, cs);
-    }
-    else
-        bb = onstack;
-    if (!bb) {
-        /* Exception was already thrown */
-        return -1;
-    }
-    rd = r_read(f->fd, bb, cs);
-    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
-            rd = r_read(f->fd, bb, cs);
-        }
-    }
-    if (rd == -1) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (rd > 0) {
-        if (bc) {
-            (*_E)->ReleaseByteArrayElements(_E, buf, bc, 0);
-            return (jint)rd;
-        }
-        else {
-            (*_E)->SetByteArrayRegion(_E, buf, (jsize)po, (jsize)rd, bb);
-        }
-    }
-    if (bb != onstack) {
-        if (bc)
-            (*_E)->ReleaseByteArrayElements(_E, buf, bc, JNI_ABORT);
-        else
-            x_free(bb);
-    }
-    if (rd > 0)
-        return (jint)rd;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-            f->eof = 1;
-        break;
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-
-}
-
-ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, read2)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jobject ptr,
-                                                  jlong off,
-                                                  jlong len)
-{
-    size_t  pl;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    jbyte  *pb;
-    ssize_t rd;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    if (f->eof) {
-        return -1;
-    }
-    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-    rd = r_read(f->fd, pb + po, cs);
-    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
-            rd = r_read(f->fd, pb + po, cs);
-        }
-    }
-    if (rd == -1) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (rd > 0)
-        return (jlong)rd;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-            f->eof = 1;
-        break;
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read3)(ACR_JNISTDARGS,
-                                                 jint file,
-                                                 jobject dbb,
-                                                 jint off,
-                                                 jint len)
-{
-#if defined(_DEBUG)
-    size_t  pl;
-#endif
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    jbyte  *pb;
-    ssize_t rd;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    if (f->eof) {
-        return -1;
-    }
-    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-#if defined(_DEBUG)
-    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-#endif
-    rd = r_read(f->fd, pb + po, cs);
-    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
-            rd = r_read(f->fd, pb + po, cs);
-        }
-    }
-    if (rd == -1) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (rd > 0)
-        return (jint)rd;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-            f->eof = 1;
-        break;
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write0)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jint b)
-{
-    unsigned char c = (unsigned char)(b & 0xFF);
-    ssize_t wr;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    wr = r_write(f->fd, &c, 1);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            wr = r_write(f->fd, &c, 1);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (wr > 0)
-        return (jint)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write1)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jbyteArray buf,
-                                                  jint off,
-                                                  jint len)
-{
-    jbyte  *bb;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    ssize_t wr;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    bb = (*_E)->GetByteArrayElements(_E, buf, NULL);
-    if (!bb) {
-        return -1;
-    }
-
-    wr = r_write(f->fd, bb + po, cs);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            wr = r_write(f->fd, bb + po, cs);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-   (*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
-    if (wr > 0)
-        return (jint)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write2)(ACR_JNISTDARGS,
-                                                   jint file,
-                                                   jobject ptr,
-                                                   jlong off,
-                                                   jlong len)
-{
-    size_t  pl;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    jbyte  *pb;
-    ssize_t wr;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-    wr = r_write(f->fd, pb + po, cs);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            wr = r_write(f->fd, pb + po, cs);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (wr > 0)
-        return (jlong)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write3)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jobject dbb,
-                                                  jlong off,
-                                                  jlong len)
-{
-#if defined(_DEBUG)
-    size_t  pl;
-#endif
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    jbyte  *pb;
-    ssize_t wr;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-#if defined(_DEBUG)
-    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-#endif
-    wr = r_write(f->fd, pb + po, cs);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            wr = r_write(f->fd, pb + po, cs);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (wr > 0)
-        return (jint)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-#define ACR_IOVEC_ON_STACK 32
-ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write4)(ACR_JNISTDARGS,
-                                                   jint file,
-                                                   jobjectArray vec,
-                                                   jint off,
-                                                   jint len)
-{
-    size_t   i;
-    size_t  pl;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    ssize_t wr;
-    int     rc = 0;
-    struct iovec *iov;
-    struct iovec  onstack[ACR_IOVEC_ON_STACK];
-    jbyteArray    bastack[ACR_IOVEC_ON_STACK];
-    jbyteArray   *boa;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pl = (size_t)(*_E)->GetArrayLength(_E, vec);
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-    if ((*_E)->EnsureLocalCapacity(_E, (jint)(cs * 2)))
-        return -1;
-    if (cs > ACR_IOVEC_ON_STACK) {
-        iov = ACR_MALLOC(struct iovec, cs);
-        boa = ACR_MALLOC(jbyteArray, cs);
-    }
-    else {
-        iov = onstack;
-        boa = bastack;
-    }
-    if (!iov || !boa) {
-        x_free(iov);
-        x_free(boa);
-        return -1;
-    }
-
-    for (i = 0; i < cs; i++) {
-        boa[i] = (*_E)->GetObjectArrayElement(_E, vec, (jsize)(i + po));
-        iov[i].iov_len  = (size_t)(*_E)->GetArrayLength(_E, boa[i]);
-        iov[i].iov_base = (void *)(*_E)->GetByteArrayElements(_E, boa[i], NULL);
-    }
-    do {
-        wr = writev(f->fd, iov, pl);
-    } while (wr == -1 && errno == EAGAIN);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            do {
-                wr = writev(f->fd, iov, pl);
-            } while (wr == -1 && errno == EAGAIN);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    for (i = 0; i < cs; i++) {
-        (*_E)->ReleaseByteArrayElements(_E, boa[i], (jbyte *)iov[i].iov_base,
-                                        JNI_ABORT);
-    }
-    if (iov != onstack) {
-        x_free(iov);
-        x_free(boa);
-    }
-    if (wr > 0)
-        return (jlong)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write5)(ACR_JNISTDARGS,
-                                                   jint file,
-                                                   jobjectArray vec,
-                                                   jint off,
-                                                   jint len)
-{
-    size_t   i;
-    size_t  pl;
-    size_t  po = (size_t)off;
-    size_t  cs = (size_t)len;
-    ssize_t wr;
-    int     rc = 0;
-    struct iovec *iov;
-    struct iovec  onstack[ACR_IOVEC_ON_STACK];
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pl = (size_t)(*_E)->GetArrayLength(_E, vec);
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-    if (cs > ACR_IOVEC_ON_STACK)
-        iov = ACR_MALLOC(struct iovec, cs);
-    else
-        iov = onstack;
-    if (!iov)
-        return -1;
-
-    for (i = 0; i < cs; i++) {
-        jobject bb = (*_E)->GetObjectArrayElement(_E, vec, (jsize)(i + po));
-        iov[i].iov_len  = (size_t)(*_E)->GetDirectBufferCapacity(_E, bb);
-        iov[i].iov_base = (*_E)->GetDirectBufferAddress(_E, bb);
-        (*_E)->DeleteLocalRef(_E, bb);
-    }
-    do {
-        wr = writev(f->fd, iov, pl);
-    } while (wr == -1 && errno == EAGAIN);
-    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
-        f->timeout != 0) {
-        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
-            do {
-                wr = writev(f->fd, iov, pl);
-            } while (wr == -1 && errno == EAGAIN);
-        }
-    }
-    if (wr < 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (iov != onstack)
-        x_free(iov);
-    if (wr > 0)
-        return (jlong)wr;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, fullw0)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jbyteArray buf,
-                                                  jint off,
-                                                  jint len)
-{
-    jbyte  *bb;
-    jbyte  *wb;
-    size_t  po = (size_t)off;
-    ssize_t cs = (ssize_t)len;
-    ssize_t wt = 0;
-    ssize_t wr;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    bb = (*_E)->GetByteArrayElements(_E, buf, NULL);
-    if (!bb) {
-        return -1;
-    }
-    wb = bb + po;
-    do {
-        wr = r_write(f->fd, wb, cs);
-        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
-            if ((rc = wait_for_io(f, 0)) == 0) {
-                wr = r_write(f->fd, wb, cs);
-            }
-            else if (rc != ACR_TIMEUP)
-                break;
-        }
-        if (wr > 0) {
-            wb += wr;
-            cs -= wr;
-            wt += wr;
-        }
-    } while (wr >= 0 && cs > 0);
-    if (wt == 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-   (*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
-    if (wt > 0)
-        return (jint)wt;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, fullw1)(ACR_JNISTDARGS,
-                                                   jint file,
-                                                   jobject ptr,
-                                                   jlong off,
-                                                   jlong len)
-{
-    size_t  pl;
-    size_t  po = (size_t)off;
-    ssize_t cs = (ssize_t)len;
-    jbyte  *pb;
-    ssize_t wr;
-    ssize_t wt = 0;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-    pb = pb + po;
-    do {
-        wr = r_write(f->fd, pb, cs);
-        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
-            if ((rc = wait_for_io(f, 0)) == 0) {
-                wr = r_write(f->fd, pb, cs);
-            }
-            else if (rc != ACR_TIMEUP)
-                break;
-        }
-        if (wr > 0) {
-            pb += wr;
-            cs -= wr;
-            wt += wr;
-        }
-    } while (wr >= 0 && cs > 0);
-    if (wt == 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (wt > 0)
-        return (jlong)wt;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}
-
-ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, fullw2)(ACR_JNISTDARGS,
-                                                  jint file,
-                                                  jobject dbb,
-                                                  jint off,
-                                                  jint len)
-{
-#if defined(_DEBUG)
-    size_t  pl;
-#endif
-    size_t  po = (size_t)off;
-    ssize_t cs = (ssize_t)len;
-    jbyte  *pb;
-    ssize_t wr;
-    ssize_t wt = 0;
-    int     rc = 0;
-    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
-
-    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
-        return -1;
-    }
-    if (IS_INVALID_HANDLE(f)) {
-        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
-        return -1;
-    }
-    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
-    if (!pb) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return -1;
-    }
-#if defined(_DEBUG)
-    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
-    if ((po + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return -1;
-    }
-#endif
-    pb = pb + po;
-    do {
-        wr = r_write(f->fd, pb, cs);
-        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
-            if ((rc = wait_for_io(f, 0)) == 0) {
-                wr = r_write(f->fd, pb, cs);
-            }
-            else if (rc != ACR_TIMEUP)
-                break;
-        }
-        if (wr > 0) {
-            pb += wr;
-            cs -= wr;
-            wt += wr;
-        }
-    } while (wr >= 0 && cs > 0);
-    if (wt == 0) {
-        rc = rc ? rc : ACR_GET_OS_ERROR();
-        if (ACR_STATUS_IS_EAGAIN(rc))
-            rc = ACR_TIMEUP;
-    }
-    if (wt > 0)
-        return (jint)wt;
-
-    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
-    switch (rc) {
-        case 0:
-        case ACR_TIMEUP:
-            return 0;
-        break;
-        case EBADF:
-            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
-        break;
-        default:
-            ACR_THROW_IO_IF_ERR(rc);
-        break;
-    }
-    return -1;
-}

Added: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c?rev=883810&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c Tue Nov 24 18:47:13 2009
@@ -0,0 +1,998 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "acr.h"
+#include "acr_private.h"
+#include "acr_arch.h"
+#include "acr_port.h"
+#include "acr_error.h"
+#include "acr_string.h"
+#include "acr_memory.h"
+#include "acr_descriptor.h"
+#include "acr_pointer.h"
+#include "acr_file.h"
+#include "acr_fileio.h"
+
+/* Platform includes
+ */
+#include <sys/time.h>
+
+
+static int wait_for_io_or_timeout(acr_file_t *f, int for_read)
+{
+    int rc;
+    acr_time_t     prev, nexttime;
+    struct timeval t;
+    int    timeout  = f->timeout;
+
+    f->ppoll.fd     = f->fd;
+    f->ppoll.events = for_read ? POLLIN : POLLOUT;
+    /* Store the the current time
+     */
+    gettimeofday(&t, NULL);
+    prev = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
+    for (;;) {
+        rc = poll(&f->ppoll, 1, timeout);
+        if (rc == -1 && errno == EINTR) {
+            if (timeout >= 0) {
+                gettimeofday(&t, NULL);
+                nexttime = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
+                timeout -= (int)(nexttime - prev);
+                if (timeout <= 0) {
+                    rc = 0;
+                    break;
+                }
+                prev = nexttime;
+            }
+        }
+        else
+            break;
+    }
+    if (rc == 0)
+        return ACR_TIMEUP;
+    else if (rc > 0)
+        return ACR_SUCCESS;
+    else
+        return errno;
+}
+
+static int wait_for_io(acr_file_t *f, int for_read)
+{
+    int rc;
+    f->ppoll.fd     = f->fd;
+    f->ppoll.events = for_read ? POLLIN : POLLOUT;
+
+    do {
+        rc = poll(&f->ppoll, 1, -1);
+    } while (rc == -1 && errno == EINTR);
+    if (rc == 0)
+        return ACR_TIMEUP;
+    else if (rc > 0)
+        return ACR_SUCCESS;
+    else
+        return errno;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read0)(ACR_JNISTDARGS,
+                                                 jint file)
+{
+    unsigned char c;
+    ssize_t rd;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    rd = r_read(f->fd, &c, 1);
+    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
+            rd = r_read(f->fd, &c, 1);
+        }
+    }
+    if (rd == -1) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (rd == 0) {
+        ACR_DescriptorSetErrEx(_E, f->descriptor, ACR_EOF);
+        f->eof = 1;
+        return  -1;
+    }
+    if (rd > 0)
+        return (jint)rd;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ETIMEOUT, rc);
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read1)(ACR_JNISTDARGS,
+                                                 jint file,
+                                                 jbyteArray buf,
+                                                 jint off,
+                                                 jint len)
+{
+    jbyte  *bb = NULL;
+    jbyte  *bc = NULL;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    jbyte   onstack[ACR_PBUFF_SIZ];
+    ssize_t rd;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    if (cs > sizeof(onstack)) {
+        if (cs > (1024 * 1024)) {
+            bc = (*_E)->GetByteArrayElements(_E, buf, NULL);
+            if (bc)
+                bb = bc + po;
+        }
+        else
+            bb = ACR_Malloc(_E, THROW_FMARK, cs);
+    }
+    else
+        bb = onstack;
+    if (!bb) {
+        /* Exception was already thrown */
+        return -1;
+    }
+    rd = r_read(f->fd, bb, cs);
+    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
+            rd = r_read(f->fd, bb, cs);
+        }
+    }
+    if (rd == -1) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (rd > 0) {
+        if (bc) {
+            (*_E)->ReleaseByteArrayElements(_E, buf, bc, 0);
+            return (jint)rd;
+        }
+        else {
+            (*_E)->SetByteArrayRegion(_E, buf, (jsize)po, (jsize)rd, bb);
+        }
+    }
+    if (bb != onstack) {
+        if (bc)
+            (*_E)->ReleaseByteArrayElements(_E, buf, bc, JNI_ABORT);
+        else
+            x_free(bb);
+    }
+    if (rd > 0)
+        return (jint)rd;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+            f->eof = 1;
+        break;
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+
+}
+
+ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, read2)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jobject ptr,
+                                                  jlong off,
+                                                  jlong len)
+{
+    size_t  pl;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    jbyte  *pb;
+    ssize_t rd;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    rd = r_read(f->fd, pb + po, cs);
+    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
+            rd = r_read(f->fd, pb + po, cs);
+        }
+    }
+    if (rd == -1) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (rd > 0)
+        return (jlong)rd;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+            f->eof = 1;
+        break;
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, read3)(ACR_JNISTDARGS,
+                                                 jint file,
+                                                 jobject dbb,
+                                                 jint off,
+                                                 jint len)
+{
+#if defined(_DEBUG)
+    size_t  pl;
+#endif
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    jbyte  *pb;
+    ssize_t rd;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    if (f->eof) {
+        return -1;
+    }
+    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+#if defined(_DEBUG)
+    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+#endif
+    rd = r_read(f->fd, pb + po, cs);
+    if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 1)) == 0) {
+            rd = r_read(f->fd, pb + po, cs);
+        }
+    }
+    if (rd == -1) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (rd > 0)
+        return (jint)rd;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+            f->eof = 1;
+        break;
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write0)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jint b)
+{
+    unsigned char c = (unsigned char)(b & 0xFF);
+    ssize_t wr;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    wr = r_write(f->fd, &c, 1);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            wr = r_write(f->fd, &c, 1);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (wr > 0)
+        return (jint)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write1)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jbyteArray buf,
+                                                  jint off,
+                                                  jint len)
+{
+    jbyte  *bb;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    ssize_t wr;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    bb = (*_E)->GetByteArrayElements(_E, buf, NULL);
+    if (!bb) {
+        return -1;
+    }
+
+    wr = r_write(f->fd, bb + po, cs);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            wr = r_write(f->fd, bb + po, cs);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+   (*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
+    if (wr > 0)
+        return (jint)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write2)(ACR_JNISTDARGS,
+                                                   jint file,
+                                                   jobject ptr,
+                                                   jlong off,
+                                                   jlong len)
+{
+    size_t  pl;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    jbyte  *pb;
+    ssize_t wr;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    wr = r_write(f->fd, pb + po, cs);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            wr = r_write(f->fd, pb + po, cs);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (wr > 0)
+        return (jlong)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, write3)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jobject dbb,
+                                                  jlong off,
+                                                  jlong len)
+{
+#if defined(_DEBUG)
+    size_t  pl;
+#endif
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    jbyte  *pb;
+    ssize_t wr;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+#if defined(_DEBUG)
+    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+#endif
+    wr = r_write(f->fd, pb + po, cs);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            wr = r_write(f->fd, pb + po, cs);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (wr > 0)
+        return (jint)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+#define ACR_IOVEC_ON_STACK 32
+ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write4)(ACR_JNISTDARGS,
+                                                   jint file,
+                                                   jobjectArray vec,
+                                                   jint off,
+                                                   jint len)
+{
+    size_t   i;
+    size_t  pl;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    ssize_t wr;
+    int     rc = 0;
+    struct iovec *iov;
+    struct iovec  onstack[ACR_IOVEC_ON_STACK];
+    jbyteArray    bastack[ACR_IOVEC_ON_STACK];
+    jbyteArray   *boa;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pl = (size_t)(*_E)->GetArrayLength(_E, vec);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    if ((*_E)->EnsureLocalCapacity(_E, (jint)(cs * 2)))
+        return -1;
+    if (cs > ACR_IOVEC_ON_STACK) {
+        iov = ACR_MALLOC(struct iovec, cs);
+        boa = ACR_MALLOC(jbyteArray, cs);
+    }
+    else {
+        iov = onstack;
+        boa = bastack;
+    }
+    if (!iov || !boa) {
+        x_free(iov);
+        x_free(boa);
+        return -1;
+    }
+
+    for (i = 0; i < cs; i++) {
+        boa[i] = (*_E)->GetObjectArrayElement(_E, vec, (jsize)(i + po));
+        iov[i].iov_len  = (size_t)(*_E)->GetArrayLength(_E, boa[i]);
+        iov[i].iov_base = (void *)(*_E)->GetByteArrayElements(_E, boa[i], NULL);
+    }
+    do {
+        wr = writev(f->fd, iov, pl);
+    } while (wr == -1 && errno == EAGAIN);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            do {
+                wr = writev(f->fd, iov, pl);
+            } while (wr == -1 && errno == EAGAIN);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    for (i = 0; i < cs; i++) {
+        (*_E)->ReleaseByteArrayElements(_E, boa[i], (jbyte *)iov[i].iov_base,
+                                        JNI_ABORT);
+    }
+    if (iov != onstack) {
+        x_free(iov);
+        x_free(boa);
+    }
+    if (wr > 0)
+        return (jlong)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, write5)(ACR_JNISTDARGS,
+                                                   jint file,
+                                                   jobjectArray vec,
+                                                   jint off,
+                                                   jint len)
+{
+    size_t   i;
+    size_t  pl;
+    size_t  po = (size_t)off;
+    size_t  cs = (size_t)len;
+    ssize_t wr;
+    int     rc = 0;
+    struct iovec *iov;
+    struct iovec  onstack[ACR_IOVEC_ON_STACK];
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pl = (size_t)(*_E)->GetArrayLength(_E, vec);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    if (cs > ACR_IOVEC_ON_STACK)
+        iov = ACR_MALLOC(struct iovec, cs);
+    else
+        iov = onstack;
+    if (!iov)
+        return -1;
+
+    for (i = 0; i < cs; i++) {
+        jobject bb = (*_E)->GetObjectArrayElement(_E, vec, (jsize)(i + po));
+        iov[i].iov_len  = (size_t)(*_E)->GetDirectBufferCapacity(_E, bb);
+        iov[i].iov_base = (*_E)->GetDirectBufferAddress(_E, bb);
+        (*_E)->DeleteLocalRef(_E, bb);
+    }
+    do {
+        wr = writev(f->fd, iov, pl);
+    } while (wr == -1 && errno == EAGAIN);
+    if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+        f->timeout != 0) {
+        if ((rc = wait_for_io_or_timeout(f, 0)) == 0) {
+            do {
+                wr = writev(f->fd, iov, pl);
+            } while (wr == -1 && errno == EAGAIN);
+        }
+    }
+    if (wr < 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (iov != onstack)
+        x_free(iov);
+    if (wr > 0)
+        return (jlong)wr;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, fullw0)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jbyteArray buf,
+                                                  jint off,
+                                                  jint len)
+{
+    jbyte  *bb;
+    jbyte  *wb;
+    size_t  po = (size_t)off;
+    ssize_t cs = (ssize_t)len;
+    ssize_t wt = 0;
+    ssize_t wr;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    bb = (*_E)->GetByteArrayElements(_E, buf, NULL);
+    if (!bb) {
+        return -1;
+    }
+    wb = bb + po;
+    do {
+        wr = r_write(f->fd, wb, cs);
+        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+            if ((rc = wait_for_io(f, 0)) == 0) {
+                wr = r_write(f->fd, wb, cs);
+            }
+            else if (rc != ACR_TIMEUP)
+                break;
+        }
+        if (wr > 0) {
+            wb += wr;
+            cs -= wr;
+            wt += wr;
+        }
+    } while (wr >= 0 && cs > 0);
+    if (wt == 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+   (*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
+    if (wt > 0)
+        return (jint)wt;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jlong, FileSystemIo, fullw1)(ACR_JNISTDARGS,
+                                                   jint file,
+                                                   jobject ptr,
+                                                   jlong off,
+                                                   jlong len)
+{
+    size_t  pl;
+    size_t  po = (size_t)off;
+    ssize_t cs = (ssize_t)len;
+    jbyte  *pb;
+    ssize_t wr;
+    ssize_t wt = 0;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pb = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+    pb = pb + po;
+    do {
+        wr = r_write(f->fd, pb, cs);
+        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+            if ((rc = wait_for_io(f, 0)) == 0) {
+                wr = r_write(f->fd, pb, cs);
+            }
+            else if (rc != ACR_TIMEUP)
+                break;
+        }
+        if (wr > 0) {
+            pb += wr;
+            cs -= wr;
+            wt += wr;
+        }
+    } while (wr >= 0 && cs > 0);
+    if (wt == 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (wt > 0)
+        return (jlong)wt;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemIo, fullw2)(ACR_JNISTDARGS,
+                                                  jint file,
+                                                  jobject dbb,
+                                                  jint off,
+                                                  jint len)
+{
+#if defined(_DEBUG)
+    size_t  pl;
+#endif
+    size_t  po = (size_t)off;
+    ssize_t cs = (ssize_t)len;
+    jbyte  *pb;
+    ssize_t wr;
+    ssize_t wt = 0;
+    int     rc = 0;
+    acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+    if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_INVALID_DESC, ACR_EFTYPE);
+        return -1;
+    }
+    if (IS_INVALID_HANDLE(f)) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_CLOSED_DESC, ACR_EBADF);
+        return -1;
+    }
+    pb = (jbyte *)(*_E)->GetDirectBufferAddress(_E, dbb);
+    if (!pb) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return -1;
+    }
+#if defined(_DEBUG)
+    pl = (size_t)(*_E)->GetDirectBufferCapacity(_E, dbb);
+    if ((po + cs) > pl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return -1;
+    }
+#endif
+    pb = pb + po;
+    do {
+        wr = r_write(f->fd, pb, cs);
+        if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+            if ((rc = wait_for_io(f, 0)) == 0) {
+                wr = r_write(f->fd, pb, cs);
+            }
+            else if (rc != ACR_TIMEUP)
+                break;
+        }
+        if (wr > 0) {
+            pb += wr;
+            cs -= wr;
+            wt += wr;
+        }
+    } while (wr >= 0 && cs > 0);
+    if (wt == 0) {
+        rc = rc ? rc : ACR_GET_OS_ERROR();
+        if (ACR_STATUS_IS_EAGAIN(rc))
+            rc = ACR_TIMEUP;
+    }
+    if (wt > 0)
+        return (jint)wt;
+
+    ACR_DescriptorSetErrEx(_E, f->descriptor, rc);
+    switch (rc) {
+        case 0:
+        case ACR_TIMEUP:
+            return 0;
+        break;
+        case EBADF:
+            ACR_THROW_EX_IF_ERR(ACR_EX_ACLOSED_DESC, rc);
+        break;
+        default:
+            ACR_THROW_IO_IF_ERR(rc);
+        break;
+    }
+    return -1;
+}

Propchange: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysrw.c
------------------------------------------------------------------------------
    svn:eol-style = native