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