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/09/29 09:50:31 UTC
svn commit: r819851 -
/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
Author: mturk
Date: Tue Sep 29 07:50:31 2009
New Revision: 819851
URL: http://svn.apache.org/viewvc?rev=819851&view=rev
Log:
Implement full write methods
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
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=819851&r1=819850&r2=819851&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 Sep 29 07:50:31 2009
@@ -838,6 +838,8 @@
jint len)
{
jbyte *bb;
+ size_t po = (size_t)off;
+ size_t cs = (size_t)len;
ssize_t wr;
acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
@@ -853,7 +855,7 @@
if (!bb) {
return -1;
}
- wr = r_write(f->fd, bb + (size_t)off, (size_t)len);
+ wr = r_write(f->fd, bb + po, cs);
if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
f->timeout != 0) {
int rc;
@@ -863,7 +865,7 @@
return rc == ACR_TIMEUP ? 0 : -1;
}
else {
- wr = r_write(f->fd, bb + (size_t)off, (size_t)len);
+ wr = r_write(f->fd, bb + po, cs);
}
}
if (wr == -1) {
@@ -871,7 +873,7 @@
if (ACR_STATUS_IS_EAGAIN(f->err))
wr = 0;
}
- else if (wr == 1)
+ else if (wr > 0)
f->err = 0;
(*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
return (jint)wr;
@@ -924,7 +926,7 @@
if (ACR_STATUS_IS_EAGAIN(f->err))
wr = 0;
}
- else if (wr == 1)
+ else if (wr > 0)
f->err = 0;
return (jint)wr;
}
@@ -981,7 +983,7 @@
if (ACR_STATUS_IS_EAGAIN(f->err))
wr = 0;
}
- else if (wr == 1)
+ else if (wr > 0)
f->err = 0;
return (jint)wr;
}
@@ -1067,7 +1069,7 @@
if (ACR_STATUS_IS_EAGAIN(f->err))
wr = 0;
}
- else if (wr == 1)
+ else if (wr > 0)
f->err = 0;
for (i = 0; i < cs; i++) {
(*_E)->ReleaseByteArrayElements(_E, boa[i], iov[i].iov_base, JNI_ABORT);
@@ -1143,9 +1145,185 @@
if (ACR_STATUS_IS_EAGAIN(f->err))
wr = 0;
}
- else if (wr == 1)
+ else if (wr > 0)
f->err = 0;
if (iov != onstack)
x_free(iov);
return (jint)wr;
}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemProvider, 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;
+ acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+ if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+ ACR_THROW_IO_IF_ERR(ACR_EFTYPE);
+ return -1;
+ }
+ if (IS_INVALID_HANDLE(f)) {
+ ACR_THROW_IO_IF_ERR(ACR_EBADF);
+ return -1;
+ }
+ bb = (*_E)->GetByteArrayElements(_E, buf, NULL);
+ if (!bb) {
+ return -1;
+ }
+ wb = bb + po;
+ f->err = 0;
+ do {
+ wr = r_write(f->fd, wb, cs);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ f->timeout != 0) {
+ int rc;
+ if ((rc = wait_for_io_or_timeout(f, 0))) {
+ f->err = rc;
+ if (rc != ACR_TIMEUP) {
+ break;
+ }
+ }
+ else {
+ wr = r_write(f->fd, wb, cs);
+ }
+ }
+ if (wr > 0) {
+ wb += wr;
+ cs -= wr;
+ wt += wr;
+ }
+ } while (wr >= 0 && cs > 0);
+ if (wt == 0)
+ f->err = ACR_GET_OS_ERROR();
+ (*_E)->ReleaseByteArrayElements(_E, buf, bb, JNI_ABORT);
+ return (jint)wt;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemProvider, 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;
+ acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+ if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+ ACR_THROW_IO_IF_ERR(ACR_EFTYPE);
+ return -1;
+ }
+ if (IS_INVALID_HANDLE(f)) {
+ ACR_THROW_IO_IF_ERR(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;
+ f->err = 0;
+ do {
+ wr = r_write(f->fd, pb, cs);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ f->timeout != 0) {
+ int rc;
+ if ((rc = wait_for_io_or_timeout(f, 0))) {
+ f->err = rc;
+ if (rc != ACR_TIMEUP)
+ break;
+ }
+ else {
+ wr = r_write(f->fd, pb, cs);
+ }
+ }
+ if (wr > 0) {
+ pb += wr;
+ cs -= wr;
+ wt += wr;
+ }
+ } while (wr >= 0 && cs > 0);
+ if (wt == 0)
+ f->err = ACR_GET_OS_ERROR();
+ return (jint)wr;
+}
+
+ACR_IO_EXPORT_DECLARE(jint, FileSystemProvider, fullw2)(ACR_JNISTDARGS,
+ jint file,
+ jobject dbb,
+ jlong off,
+ jlong 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;
+ acr_file_t *f = (acr_file_t *)ACR_IOH_FDATA(file);
+
+ if (ACR_IOH_FTYPE(file) != ACR_DT_FILE) {
+ ACR_THROW_IO_IF_ERR(ACR_EFTYPE);
+ return -1;
+ }
+ if (IS_INVALID_HANDLE(f)) {
+ ACR_THROW_IO_IF_ERR(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;
+ f->err = 0;
+ do {
+ wr = r_write(f->fd, pb, cs);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ f->timeout != 0) {
+ int rc;
+ if ((rc = wait_for_io_or_timeout(f, 0))) {
+ f->err = rc;
+ if (rc != ACR_TIMEUP)
+ break;
+ }
+ else {
+ wr = r_write(f->fd, pb, cs);
+ }
+ }
+ if (wr > 0) {
+ pb += wr;
+ cs -= wr;
+ wt += wr;
+ }
+ } while (wr >= 0 && cs > 0);
+ if (wt == 0)
+ f->err = ACR_GET_OS_ERROR();
+ return (jint)wr;
+}