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;
+}


Reply via email to