Author: mturk
Date: Wed Jul 13 17:05:30 2011
New Revision: 1146139
URL: http://svn.apache.org/viewvc?rev=1146139&view=rev
Log:
Implement common write methods
Modified:
commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c?rev=1146139&r1=1146138&r2=1146139&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c Wed Jul
13 17:05:30 2011
@@ -105,7 +105,7 @@ ACR_NET_EXPORT(jint, SocketStream, read0
rd = r_read(sd, &ch, 1);
if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
ss->fd->timeout > 0) {
- rc = AcrWaitIO(sd, AcrTimeAsMsec(ss->fd->timeout), POLLOUT);
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
if (rc != 0)
goto finally;
rd = r_read(sd, &ch, 1);
@@ -163,7 +163,7 @@ ACR_NET_EXPORT(jint, SocketStream, read1
rd = r_read(sd, bb, len);
if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
ss->fd->timeout > 0) {
- rc = AcrWaitIO(sd, AcrTimeAsMsec(ss->fd->timeout), POLLOUT);
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
if (rc != 0)
goto finally;
rd = r_read(sd, bb, len);
@@ -207,7 +207,7 @@ ACR_NET_EXPORT(jlong, SocketStream, read
int sd;
int rc = 0;
ssize_t rd = 0;
- size_t po = (size_t)off;
+ ptrdiff_t po = (ptrdiff_t)off;
size_t cs = (size_t)len;
char *bb = J2P(pa, char *);
acr_ss_t *ss = J2P(sp, acr_ss_t *);
@@ -227,7 +227,7 @@ ACR_NET_EXPORT(jlong, SocketStream, read
rd = r_read(sd, bb + po, cs);
if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
ss->fd->timeout > 0) {
- rc = AcrWaitIO(sd, AcrTimeAsMsec(ss->fd->timeout), POLLOUT);
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
if (rc != 0)
goto finally;
rd = r_read(sd, bb + po, cs);
@@ -240,10 +240,9 @@ ACR_NET_EXPORT(jlong, SocketStream, read
finally:
_release_sd(ss);
if (rc != 0) {
- rd = 0;
/* Throw exception */
ACR_THROW_NET_ERROR(rc);
- return -1LL;
+ return ACR_I64_C(-1);
}
else
return (jlong)rd;
@@ -277,7 +276,7 @@ ACR_NET_EXPORT(jint, SocketStream, read3
rd = r_read(sd, bb + off, len);
if (rd == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
ss->fd->timeout > 0) {
- rc = AcrWaitIO(sd, AcrTimeAsMsec(ss->fd->timeout), POLLOUT);
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
if (rc != 0)
goto finally;
rd = r_read(sd, bb + off, len);
@@ -296,3 +295,312 @@ finally:
}
return (jint)rd;
}
+
+ACR_NET_EXPORT(jint, SocketStream, write0)(JNI_STDARGS, jlong sp,
+ jint b)
+{
+ int sd;
+ int rc = 0;
+ unsigned char ch = (unsigned char)(b & 0xFF);
+ ssize_t wr = 0;
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+ wr = r_write(sd, &ch, 1);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ wr = r_write(sd, &ch, 1);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (rc != 0) {
+ wr = -1;
+ ACR_THROW_NET_ERROR(rc);
+ }
+ return (jint)wr;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write1)(JNI_STDARGS, jlong sp,
+ jbyteArray buf,
+ jint off,
+ jint len)
+{
+ int sd;
+ int rc = 0;
+ jbyte *bb = 0;
+ ssize_t wr = 0;
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+ bb = (*env)->GetByteArrayElements(env, buf, 0);
+ if (bb == 0) {
+ rc = ACR_EINVAL;
+ goto finally;
+ }
+ wr = r_write(sd, bb + off, len);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ wr = r_write(sd, bb + off, len);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (bb != 0)
+ (*env)->ReleaseByteArrayElements(env, buf, bb, JNI_ABORT);
+ if (rc != 0) {
+ wr = -1;
+ ACR_THROW_NET_ERROR(rc);
+ }
+ return (jint)wr;
+}
+
+ACR_NET_EXPORT(jlong, SocketStream, write2)(JNI_STDARGS, jlong sp,
+ jlong pa,
+ jlong off,
+ jlong len)
+{
+ int sd;
+ int rc = 0;
+ ptrdiff_t po = (ptrdiff_t)off;
+ size_t cs = (size_t)len;
+ ssize_t wr = 0;
+ char *bb = J2P(pa, char *);
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+ if (bb == 0) {
+ rc = ACR_EINVAL;
+ goto finally;
+ }
+ wr = r_write(sd, bb + po, cs);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ wr = r_write(sd, bb + po, cs);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (rc != 0) {
+ wr = -1;
+ ACR_THROW_NET_ERROR(rc);
+ }
+ return (jint)wr;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write3)(JNI_STDARGS, jlong sp,
+ jobject buf,
+ jint off,
+ jint len)
+{
+ int sd;
+ int rc = 0;
+ char *bb = 0;
+ ssize_t wr = 0;
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+ bb = (char *)(*env)->GetDirectBufferAddress(env, buf);
+ if (bb == 0) {
+ rc = ACR_EINVAL;
+ goto finally;
+ }
+ wr = r_write(sd, bb + off, len);
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ wr = r_write(sd, bb + off, len);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (rc != 0) {
+ wr = -1;
+ ACR_THROW_NET_ERROR(rc);
+ }
+ return (jint)wr;
+}
+
+#define ACR_IOVEC_ON_STACK 32
+ACR_NET_EXPORT(jlong, SocketStream, write4)(JNI_STDARGS, jlong sp,
+ jint file,
+ jobjectArray vec,
+ jint off,
+ jint len)
+{
+ int i, sd;
+ ssize_t wr = 0;
+ int rc = 0;
+ jbyteArray *boa = 0;
+ struct iovec *iov = 0;
+ struct iovec onstack[ACR_IOVEC_ON_STACK];
+ jbyteArray bastack[ACR_IOVEC_ON_STACK];
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+
+ if ((*env)->EnsureLocalCapacity(env, len * 2)) {
+ rc = ACR_ENOMEM;
+ goto finally;
+ }
+ if (len > ACR_IOVEC_ON_STACK) {
+ iov = ACR_CALLOC(struct iovec, len);
+ if (iov == 0) {
+ rc = ACR_ENOMEM;
+ goto finally;
+ }
+ boa = ACR_CALLOC(jbyteArray, len);
+ if (boa == 0) {
+ rc = ACR_ENOMEM;
+ goto finally;
+ }
+ }
+ else {
+ iov = onstack;
+ boa = bastack;
+ }
+
+ for (i = 0; i < len; i++) {
+ boa[i] = (*env)->GetObjectArrayElement(env, vec, (jsize)(i + off));
+ if (boa[i] == 0) {
+ /* XXX: What's the correct error ?
+ */
+ rc = ACR_EINVAL;
+ goto finally;
+ }
+ iov[i].iov_len = (size_t)(*env)->GetArrayLength(env, boa[i]);
+ iov[i].iov_base = (void *)(*env)->GetByteArrayElements(env, boa[i], 0);
+ }
+ do {
+ wr = writev(sd, iov, len);
+ } while (wr == -1 && errno == EAGAIN);
+
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ do {
+ wr = writev(sd, iov, len);
+ } while (wr == -1 && errno == EAGAIN);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (boa != 0) {
+ for (i = 0; i < len; i++) {
+ if (boa[i] != 0)
+ (*env)->ReleaseByteArrayElements(env, boa[i],
+ (jbyte *)iov[i].iov_base,
+ JNI_ABORT);
+ }
+ if (boa != bastack)
+ AcrFree(boa);
+ }
+ if (iov != onstack)
+ AcrFree(iov);
+ if (rc != 0) {
+ ACR_THROW_NET_ERROR(rc);
+ return ACR_I64_C(-1);
+ }
+ return (jlong)wr;
+}
+
+ACR_NET_EXPORT(jlong, SocketStream, write5)(JNI_STDARGS, jlong sp,
+ jint file,
+ jobjectArray vec,
+ jint off,
+ jint len)
+{
+ int i, sd;
+ ssize_t wr = 0;
+ int rc = 0;
+ struct iovec *iov = 0;
+ struct iovec onstack[ACR_IOVEC_ON_STACK];
+ acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+ if ((sd = _retain_sd(ss)) == -1) {
+ rc = ACR_EBADF;
+ goto finally;
+ }
+
+ if (len > ACR_IOVEC_ON_STACK) {
+ iov = ACR_CALLOC(struct iovec, len);
+ if (iov == 0) {
+ rc = ACR_ENOMEM;
+ goto finally;
+ }
+ }
+ else {
+ iov = onstack;
+ }
+
+ for (i = 0; i < len; i++) {
+ jobject bb = (*env)->GetObjectArrayElement(env, vec, (jsize)(i + off));
+ if (bb == 0) {
+ /* XXX: What's the correct error ?
+ */
+ rc = ACR_EINVAL;
+ goto finally;
+ }
+ iov[i].iov_len = (size_t)(*env)->GetDirectBufferCapacity(env, bb);
+ iov[i].iov_base = (*env)->GetDirectBufferAddress(env, bb);
+
+ (*env)->DeleteLocalRef(env, bb);
+ }
+ do {
+ wr = writev(sd, iov, len);
+ } while (wr == -1 && errno == EAGAIN);
+
+ if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
+ ss->fd->timeout > 0) {
+ rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+ if (rc != 0)
+ goto finally;
+ do {
+ wr = writev(sd, iov, len);
+ } while (wr == -1 && errno == EAGAIN);
+ }
+ if (wr == -1)
+ rc = ACR_GET_OS_ERROR();
+finally:
+ _release_sd(ss);
+ if (iov != onstack)
+ AcrFree(iov);
+ if (rc != 0) {
+ ACR_THROW_NET_ERROR(rc);
+ return ACR_I64_C(-1);
+ }
+ return (jint)wr;
+}