Author: mturk
Date: Fri Jul 15 15:43:41 2011
New Revision: 1147198

URL: http://svn.apache.org/viewvc?rev=1147198&view=rev
Log:
Implement sockstream

Added:
    commons/sandbox/runtime/trunk/src/main/native/os/win32/sockstream.c   (with 
props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
    commons/sandbox/runtime/trunk/src/main/native/os/unix/sockstream.c

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=1147198&r1=1147197&r2=1147198&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Fri Jul 15 
15:43:41 2011
@@ -94,6 +94,7 @@ WIN32_SOURCES=\
        $(TOPDIR)\os\win32\selectset.c \
        $(TOPDIR)\os\win32\semaphore.c \
        $(TOPDIR)\os\win32\shmem.c \
+       $(TOPDIR)\os\win32\sockstream.c \
        $(TOPDIR)\os\win32\time.c \
        $(TOPDIR)\os\win32\util.c \
        $(TOPDIR)\os\win32\winapi.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=1147198&r1=1147197&r2=1147198&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 Fri Jul 
15 15:43:41 2011
@@ -40,7 +40,7 @@ typedef struct acr_ss_t {
     acr_sd_t    *fd;
 } acr_ss_t;
 
-ACR_INLINE(int) retain_sd(acr_ss_t *ss)
+ACR_INLINE(int) sdretain(acr_ss_t *ss)
 {
     if (ss->fd != 0)
         return AcrSdRetain(ss->fd);
@@ -48,7 +48,7 @@ ACR_INLINE(int) retain_sd(acr_ss_t *ss)
         return -1;
 }
 
-ACR_INLINE(int) release_sd(acr_ss_t *ss)
+ACR_INLINE(int) sdrelease(acr_ss_t *ss)
 {
     if (ss->fd == 0)
         return 0;
@@ -99,7 +99,7 @@ ACR_NET_EXPORT(jboolean, SocketStream, e
     jboolean rv = JNI_TRUE;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -122,7 +122,7 @@ ACR_NET_EXPORT(jboolean, SocketStream, e
         ACR_SETFLAG(ss->fd, ACR_DT_HITEOF);
     }
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         ACR_THROW_NET_ERROR(rc);
     }
@@ -154,7 +154,7 @@ ACR_NET_EXPORT(jint, SocketStream, read0
     unsigned char ch;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -169,13 +169,13 @@ ACR_NET_EXPORT(jint, SocketStream, read0
         rd = r_read(sd, &ch, 1);
     }
     if (rd == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
     else if (rd == 1)
         rv = ch;
     else
         ss->fd->flags |= ACR_DT_HITEOF;
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         ACR_THROW_NET_ERROR(rc);
         return -1;
@@ -196,7 +196,7 @@ ACR_NET_EXPORT(jint, SocketStream, read1
     jbyte   onstack[ACR_PBUFF_SIZ];
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -225,12 +225,12 @@ ACR_NET_EXPORT(jint, SocketStream, read1
         rd = r_read(sd, bb, len);
     }
     if (rd == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
     else if (rd == 0)
         ss->fd->flags |= ACR_DT_HITEOF;
 
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc == 0) {
         if (rd > 0) {
             if (bc != 0) {
@@ -267,7 +267,7 @@ ACR_NET_EXPORT(jint, SocketStream, read2
     char     *bb = J2P(pa, char *);
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -286,12 +286,12 @@ ACR_NET_EXPORT(jint, SocketStream, read2
         rd = r_read(sd, bb + po, len);
     }
     if (rd == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
     else if (rd == 0)
         ss->fd->flags |= ACR_DT_HITEOF;
 
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         rd = 0;
         /* Throw exception */
@@ -311,7 +311,7 @@ ACR_NET_EXPORT(jint, SocketStream, read3
     char     *bb = 0;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -332,12 +332,12 @@ ACR_NET_EXPORT(jint, SocketStream, read3
         rd = r_read(sd, bb + off, len);
     }
     if (rd == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
     else if (rd == 0)
         ss->fd->flags |= ACR_DT_HITEOF;
 
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         rd = 0;
         /* Throw exception */
@@ -355,7 +355,7 @@ ACR_NET_EXPORT(jint, SocketStream, write
     ssize_t wr = 0;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -368,9 +368,9 @@ ACR_NET_EXPORT(jint, SocketStream, write
         wr = r_write(sd, &ch, 1);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         wr = -1;
         ACR_THROW_NET_ERROR(rc);
@@ -389,14 +389,14 @@ ACR_NET_EXPORT(jint, SocketStream, write
     ssize_t wr = 0;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
     bb = (*env)->GetByteArrayElements(env, buf, 0);
     if (bb == 0) {
         rc = ACR_EINVAL;
-        goto finally;        
+        goto finally;
     }
     wr = r_write(sd, bb + off, len);
     if (wr == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) &&
@@ -407,9 +407,9 @@ ACR_NET_EXPORT(jint, SocketStream, write
         wr = r_write(sd, bb + off, len);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (bb != 0)
         (*env)->ReleaseByteArrayElements(env, buf, bb, JNI_ABORT);
     if (rc != 0) {
@@ -431,7 +431,7 @@ ACR_NET_EXPORT(jint, SocketStream, write
     char     *bb = J2P(pa, char *);
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -448,9 +448,9 @@ ACR_NET_EXPORT(jint, SocketStream, write
         wr = r_write(sd, bb + po, len);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         wr = -1;
         ACR_THROW_NET_ERROR(rc);
@@ -469,7 +469,7 @@ ACR_NET_EXPORT(jint, SocketStream, write
     ssize_t wr = 0;
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -487,9 +487,9 @@ ACR_NET_EXPORT(jint, SocketStream, write
         wr = r_write(sd, bb + off, len);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (rc != 0) {
         wr = -1;
         ACR_THROW_NET_ERROR(rc);
@@ -512,7 +512,7 @@ ACR_NET_EXPORT(jlong, SocketStream, writ
     jbyteArray    bastack[ACR_IOVEC_ON_STACK];
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -563,9 +563,9 @@ ACR_NET_EXPORT(jlong, SocketStream, writ
         } while (wr == -1 && errno == EAGAIN);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();        
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (boa != 0) {
         for (i = 0; i < len; i++) {
             if (boa[i] != 0)
@@ -597,7 +597,7 @@ ACR_NET_EXPORT(jlong, SocketStream, writ
     struct iovec  onstack[ACR_IOVEC_ON_STACK];
     acr_ss_t *ss = J2P(sp, acr_ss_t *);
 
-    if ((sd = retain_sd(ss)) == -1) {
+    if ((sd = sdretain(ss)) == -1) {
         rc = ACR_EBADF;
         goto finally;
     }
@@ -623,7 +623,7 @@ ACR_NET_EXPORT(jlong, SocketStream, writ
         }
         iov[i].iov_len  = (size_t)(*env)->GetDirectBufferCapacity(env, bb);
         iov[i].iov_base = (*env)->GetDirectBufferAddress(env, bb);
-        
+
         (*env)->DeleteLocalRef(env, bb);
     }
     do {
@@ -640,14 +640,14 @@ ACR_NET_EXPORT(jlong, SocketStream, writ
         } while (wr == -1 && errno == EAGAIN);
     }
     if (wr == -1)
-        rc = ACR_GET_OS_ERROR();
+        rc = ACR_GET_NETOS_ERROR();
 finally:
-    release_sd(ss);
+    sdrelease(ss);
     if (iov != onstack)
         AcrFree(iov);
     if (rc != 0) {
         ACR_THROW_NET_ERROR(rc);
         return ACR_I64_C(-1);
     }
-    return (jint)wr;
+    return (jlong)wr;
 }

Added: commons/sandbox/runtime/trunk/src/main/native/os/win32/sockstream.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/sockstream.c?rev=1147198&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/sockstream.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/sockstream.c Fri Jul 
15 15:43:41 2011
@@ -0,0 +1,635 @@
+/* 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/error.h"
+#include "acr/iodefs.h"
+#include "acr/clazz.h"
+#include "acr/string.h"
+#include "acr/memory.h"
+#include "acr/iofd.h"
+#include "acr/netapi.h"
+#include "acr/unsafe.h"
+#include "acr/port.h"
+#include "acr/time.h"
+#include "arch_opts.h"
+#include "arch_sync.h"
+
+#define SOCKADDR_CAST(BA) \
+    (acr_sockaddr_t *)AcrGetArrayCritical(env, (BA))
+#define SOCKADDR_RELEASE(BA, SA) \
+    AcrReleaseArrayCritical(env, (BA), (SA))
+
+typedef struct acr_ss_t {
+    acr_sd_t    *fd;
+} acr_ss_t;
+
+ACR_INLINE(SOCKET) sdretain(acr_ss_t *ss)
+{
+    if (ss->fd != 0)
+        return AcrSdRetain(ss->fd);
+    else
+        return INVALID_SOCKET;
+}
+
+ACR_INLINE(int) sdrelease(acr_ss_t *ss)
+{
+    if (ss->fd == 0)
+        return 0;
+    if (AcrSdRelease(ss->fd) == 0) {
+        ss->fd = 0;
+        return 0;
+    }
+    else
+        return 1;
+}
+
+ACR_NET_EXPORT(jlong, SocketStream, alloc0)(JNI_STDARGS, jlong fp)
+{
+    acr_ss_t *ss;
+    acr_sd_t *fd = J2P(fp, acr_sd_t *);
+
+    if (fd == 0 || fd->s == INVALID_SOCKET) {
+        ACR_THROW_NET_ERROR(ACR_EBADF);
+        return 0;
+    }
+
+    if ((ss = ACR_TALLOC(acr_ss_t)) == 0)
+        return 0;
+    ss->fd = fd;
+    return P2J(ss);
+}
+
+ACR_NET_EXPORT(jint, SocketStream, close0)(JNI_STDARGS, jlong sp)
+{
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    AcrFree(ss);
+    return 0;
+}
+
+ACR_NET_EXPORT(jboolean, SocketStream, eof0)(JNI_STDARGS, jlong sp)
+{
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        return JNI_TRUE;
+    else
+        return JNI_FALSE;
+}
+
+ACR_NET_EXPORT(jboolean, SocketStream, eof1)(JNI_STDARGS, jlong sp)
+{
+    int rc = 0;
+    SOCKET sd;
+    jboolean rv = JNI_TRUE;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        goto finally;
+    rc = AcrWaitIO(sd, 0, POLLIN);
+    if (rc == 0) {
+        char dummy;
+        int rd = recv(sd, &dummy, 1, MSG_PEEK);
+        if (rd == SOCKET_ERROR)
+            rc = ACR_GET_NETOS_ERROR();
+        else if (rd != 0)
+            rv = JNI_FALSE;
+    }
+    else if (rc == ACR_TIMEUP) {
+        rv = JNI_FALSE;
+        rc = 0;
+    }
+    if (rv) {
+        ACR_SETFLAG(ss->fd, ACR_DT_HITEOF);
+    }
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return rv;
+}
+
+
+ACR_NET_EXPORT(jint, SocketStream, avail0)(JNI_STDARGS, jlong sp)
+{
+    u_long avail;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if (ioctlsocket(ss->fd->s, FIONREAD, &avail) == SOCKET_ERROR)
+        avail = -1;
+    return avail;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, read0)(JNI_STDARGS, jlong sp)
+{
+    int  sd;
+    int  rc = 0;
+    int  rv = -1;
+    int  rd;
+    unsigned char ch;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        goto finally;
+    rd = recv(sd, &ch, 1, 0);
+    if (rd == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
+        if (rc != 0)
+            goto finally;
+        rd = recv(sd, &ch, 1, 0);
+    }
+    if (rd == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+    else if (rd == 1)
+        rv = ch;
+    else
+        ss->fd->flags |= ACR_DT_HITEOF;
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        ACR_THROW_NET_ERROR(rc);
+        return -1;
+    }
+    return rv;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, read1)(JNI_STDARGS, jlong sp,
+                                          jbyteArray buf,
+                                          jint off,
+                                          jint len)
+{
+    int rc = 0;
+    int rd = 0;
+    SOCKET  sd;
+    jbyte  *bb = 0;
+    jbyte  *bc = 0;
+    jbyte   onstack[ACR_PBUFF_SIZ];
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        goto finally;
+    if (len > ACR_PBUFF_SIZ) {
+        if (len > ACR_MEGABYTE) {
+            if ((bc = (*env)->GetByteArrayElements(env, buf, 0)) != 0)
+                bb = bc + off;
+        }
+        else {
+            /* Allocate buffer */
+            bb = ACR_MALLOC(jbyte, len);
+        }
+    }
+    if (bb == 0) {
+        rc = ACR_ENOMEM;
+        goto finally;
+    }
+    rd = recv(sd, bb, len, 0);
+    if (rd == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
+        if (rc != 0)
+            goto finally;
+        rd = recv(sd, bb, len, 0);
+    }
+    if (rd == SOCKET_ERROR)
+        rc = ACR_GET_OS_ERROR();
+    else if (rd == 0)
+        ss->fd->flags |= ACR_DT_HITEOF;
+
+finally:
+    sdrelease(ss);
+    if (rc == 0) {
+        if (rd > 0) {
+            if (bc != 0) {
+                (*env)->ReleaseByteArrayElements(env, buf, bc, 0);
+                return (jint)rd;
+            }
+            else
+                (*env)->SetByteArrayRegion(env, buf, (jsize)off, (jsize)rd, 
bb);
+        }
+    }
+    if (bb != 0 && bb != onstack) {
+        if (bc != 0)
+            (*env)->ReleaseByteArrayElements(env, buf, bc, JNI_ABORT);
+        else
+            AcrFree(bb);
+    }
+    if (rc != 0) {
+        rd = 0;
+        /* Throw exception */
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return rd;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, read2)(JNI_STDARGS, jlong sp,
+                                          jlong pa,
+                                          jlong off,
+                                          jint len)
+{
+    int rc = 0;
+    int rd = 0;
+    SOCKET    sd;
+    ptrdiff_t po = (ptrdiff_t)off;
+    char     *bb = J2P(pa, char *);
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        goto finally;
+    if (bb == 0) {
+        rc = ACR_EINVAL;
+        goto finally;
+    }
+    rd = recv(sd, bb + po, len, 0);
+    if (rd == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
+        if (rc != 0)
+            goto finally;
+        rd = recv(sd, bb + po, len, 0);
+    }
+    if (rd == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+    else if (rd == 0)
+        ss->fd->flags |= ACR_DT_HITEOF;
+
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        rd = 0;
+        /* Throw exception */
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return rd;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, read3)(JNI_STDARGS, jlong sp,
+                                          jobject buf,
+                                          jint off,
+                                          jint len)
+{
+    int rc = 0;
+    int rd = 0;
+    SOCKET    sd;
+    char     *bb = 0;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (ACR_HASFLAG(ss->fd, ACR_DT_HITEOF))
+        goto finally;
+    bb = (char *)(*env)->GetDirectBufferAddress(env, buf);
+    if (bb == 0) {
+        rc = ACR_EINVAL;
+        goto finally;
+    }
+
+    rd = recv(sd, bb + off, len, 0);
+    if (rd == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLIN);
+        if (rc != 0)
+            goto finally;
+        rd = recv(sd, bb + off, len, 0);
+    }
+    if (rd == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+    else if (rd == 0)
+        ss->fd->flags |= ACR_DT_HITEOF;
+
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        rd = 0;
+        /* Throw exception */
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return rd;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write0)(JNI_STDARGS, jlong sp,
+                                           jint b)
+{
+    int rc = 0;
+    int wr = 0;
+    unsigned char ch = (unsigned char)(b & 0xFF);
+    SOCKET    sd;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    wr = send(sd, &ch, 1, 0);
+    if (wr == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        wr = send(sd, &ch, 1, 0);
+    }
+    if (wr == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        wr = -1;
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return wr;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write1)(JNI_STDARGS, jlong sp,
+                                           jbyteArray buf,
+                                           jint off,
+                                           jint len)
+{
+    int rc = 0;
+    int wr = 0;
+    jbyte    *bb = 0;
+    SOCKET    sd;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    bb = (*env)->GetByteArrayElements(env, buf, 0);
+    if (bb == 0) {
+        rc = ACR_EINVAL;
+        goto finally;
+    }
+    wr = send(sd, bb + off, len, 0);
+    if (wr == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        wr = send(sd, bb + off, len, 0);
+    }
+    if (wr == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+finally:
+    sdrelease(ss);
+    if (bb != 0)
+        (*env)->ReleaseByteArrayElements(env, buf, bb, JNI_ABORT);
+    if (rc != 0) {
+        wr = -1;
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return wr;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write2)(JNI_STDARGS, jlong sp,
+                                           jlong pa,
+                                           jlong off,
+                                           jint len)
+{
+    int rc = 0;
+    int wr = 0;
+    ptrdiff_t po = (ptrdiff_t)off;
+    SOCKET    sd;
+    char     *bb = J2P(pa, char *);
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    if (bb == 0) {
+        rc = ACR_EINVAL;
+        goto finally;
+    }
+    wr = send(sd, bb + po, len, 0);
+    if (wr == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        wr = send(sd, bb + po, len, 0);
+    }
+    if (wr == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        wr = -1;
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return wr;
+}
+
+ACR_NET_EXPORT(jint, SocketStream, write3)(JNI_STDARGS, jlong sp,
+                                           jobject buf,
+                                           jint off,
+                                           jint len)
+{
+    int rc = 0;
+    int wr = 0;
+    char     *bb = 0;
+    SOCKET    sd;
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+    bb = (char *)(*env)->GetDirectBufferAddress(env, buf);
+    if (bb == 0) {
+        rc = ACR_EINVAL;
+        goto finally;
+    }
+    wr = send(sd, bb + off, len, 0);
+    if (wr == SOCKET_ERROR && (WSAGetLastError() == WSAEWOULDBLOCK) &&
+        ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        wr = send(sd, bb + off, len, 0);
+    }
+    if (wr == SOCKET_ERROR)
+        rc = ACR_GET_NETOS_ERROR();
+finally:
+    sdrelease(ss);
+    if (rc != 0) {
+        wr = -1;
+        ACR_THROW_NET_ERROR(rc);
+    }
+    return wr;
+}
+
+#define ACR_IOVEC_ON_STACK 32
+ACR_NET_EXPORT(jlong, SocketStream, write4)(JNI_STDARGS, jlong sp,
+                                            jobjectArray vec,
+                                            jint off,
+                                            jint len)
+{
+    int  i;
+    DWORD   wr = 0;
+    int     rc = 0;
+    SOCKET  sd;
+    jbyteArray *boa = 0;
+    LPWSABUF    iov = 0;
+    WSABUF      onstack[ACR_IOVEC_ON_STACK];
+    jbyteArray  bastack[ACR_IOVEC_ON_STACK];
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        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(WSABUF, 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].len = (u_long)(*env)->GetArrayLength(env, boa[i]);
+        iov[i].buf = (char *)(*env)->GetByteArrayElements(env, boa[i], 0);
+    }
+    if (WSASend(sd, iov, len, &wr, 0, 0, 0) == SOCKET_ERROR)
+        rc = WSAGetLastError();
+    if (rc != 0 && rc == WSAEWOULDBLOCK && ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        if (WSASend(sd, iov, len, &wr, 0, 0, 0) == SOCKET_ERROR)
+            rc = WSAGetLastError();
+    }
+finally:
+    sdrelease(ss);
+    if (boa != 0) {
+        for (i = 0; i < len; i++) {
+            if (boa[i] != 0)
+                (*env)->ReleaseByteArrayElements(env, boa[i],
+                                                 (jbyte *)iov[i].buf,
+                                                 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,
+                                            jobjectArray vec,
+                                            jint off,
+                                            jint len)
+{
+    int  i;
+    DWORD     wr = 0;
+    int       rc = 0;
+    SOCKET    sd;
+    LPWSABUF  iov = 0;
+    WSABUF    onstack[ACR_IOVEC_ON_STACK];
+    acr_ss_t *ss = J2P(sp, acr_ss_t *);
+
+    if ((sd = sdretain(ss)) == INVALID_SOCKET) {
+        rc = ACR_EBADF;
+        goto finally;
+    }
+
+    if (len > ACR_IOVEC_ON_STACK) {
+        iov = ACR_CALLOC(WSABUF, 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].len = (u_long)(*env)->GetDirectBufferCapacity(env, bb);
+        iov[i].buf = (char *)(*env)->GetDirectBufferAddress(env, bb);
+
+        (*env)->DeleteLocalRef(env, bb);
+    }
+    if (WSASend(sd, iov, len, &wr, 0, 0, 0) == SOCKET_ERROR)
+        rc = WSAGetLastError();
+    if (rc != 0 && rc == WSAEWOULDBLOCK && ss->fd->timeout > 0) {
+        rc = AcrWaitIO(sd, ss->fd->timeout, POLLOUT);
+        if (rc != 0)
+            goto finally;
+        if (WSASend(sd, iov, len, &wr, 0, 0, 0) == SOCKET_ERROR)
+            rc = WSAGetLastError();
+    }
+finally:
+    sdrelease(ss);
+    if (iov != onstack)
+        AcrFree(iov);
+    if (rc != 0) {
+        ACR_THROW_NET_ERROR(rc);
+        return ACR_I64_C(-1);
+    }
+    return (jlong)wr;
+}

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


Reply via email to