summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2006-12-04 00:40:25 +0000
committerMark Wielaard <mark@klomp.org>2006-12-04 00:40:25 +0000
commit7429dc1ae5f7760e0ee39dc2de22930af79dcd45 (patch)
treeb9b0a1453c3b33ca0c59fd56305da15ba8e3402d
parent995879ef3b083996ec31c59c5f88958b65a1ce63 (diff)
downloadclasspath-7429dc1ae5f7760e0ee39dc2de22930af79dcd45.tar.gz
* vm/reference/gnu/java/nio/VMChannel.java (isThreadInterrupted):
Make static. * native/jni/java-nio/gnu_java_nio_VMChannel.c (JCL_thread_interrupted): Only take JNIEnv. (vm_channel_class): New static variable. (initID): Set vm_channel_class. Wrap all reads() and writes() in do-while blocks that check interrupted status.
-rw-r--r--ChangeLog11
-rw-r--r--native/jni/java-nio/gnu_java_nio_VMChannel.c74
-rw-r--r--vm/reference/gnu/java/nio/VMChannel.java2
3 files changed, 74 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index f54176c7e..62371c9ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-12-04 Mark Wielaard <mark@klomp.org>
+
+ * vm/reference/gnu/java/nio/VMChannel.java (isThreadInterrupted):
+ Make static.
+ * native/jni/java-nio/gnu_java_nio_VMChannel.c
+ (JCL_thread_interrupted): Only take JNIEnv.
+ (vm_channel_class): New static variable.
+ (initID): Set vm_channel_class.
+ Wrap all reads() and writes() in do-while blocks that check
+ interrupted status.
+
2006-12-04 Andrew John Hughes <gnu_andrew@member.fsf.org>
* gnu/javax/management/Server.java:
diff --git a/native/jni/java-nio/gnu_java_nio_VMChannel.c b/native/jni/java-nio/gnu_java_nio_VMChannel.c
index c49a3184f..7ab28f7bb 100644
--- a/native/jni/java-nio/gnu_java_nio_VMChannel.c
+++ b/native/jni/java-nio/gnu_java_nio_VMChannel.c
@@ -106,7 +106,7 @@ void JCL_print_buffer(JNIEnv *, struct JCL_buffer *);
int JCL_init_buffer(JNIEnv *, struct JCL_buffer *, jobject);
void JCL_release_buffer(JNIEnv *, struct JCL_buffer *, jobject, jint);
void JCL_cleanup_buffers(JNIEnv *, struct JCL_buffer *, jint, jobjectArray, jint, jlong);
-int JCL_thread_interrupted(JNIEnv *, jclass);
+int JCL_thread_interrupted(JNIEnv *);
static jfieldID address_fid;
static jmethodID get_position_mid;
@@ -117,6 +117,7 @@ static jmethodID has_array_mid;
static jmethodID array_mid;
static jmethodID array_offset_mid;
static jmethodID thread_interrupted_mid;
+static jclass vm_channel_class;
jmethodID
get_method_id(JNIEnv *env, jclass clazz, const char *name,
@@ -255,9 +256,10 @@ JCL_cleanup_buffers(JNIEnv *env,
int
-JCL_thread_interrupted(JNIEnv *env, jclass c)
+JCL_thread_interrupted(JNIEnv *env)
{
- return (int) (*env)->CallBooleanMethod(env, c, thread_interrupted_mid);
+ return (int) (*env)->CallBooleanMethod(env, vm_channel_class,
+ thread_interrupted_mid);
}
@@ -331,7 +333,10 @@ Java_gnu_java_nio_VMChannel_initIDs (JNIEnv *env,
array_mid = get_method_id(env, byteBufferClass, "array", "()[B");
array_offset_mid = get_method_id(env, byteBufferClass, "arrayOffset", "()I");
- thread_interrupted_mid = get_method_id(env, clazz, "isThreadInterrupted", "()Z");
+ vm_channel_class = clazz;
+ thread_interrupted_mid = (*env)->GetStaticMethodID(env, clazz,
+ "isThreadInterrupted",
+ "()Z");
}
JNIEXPORT void JNICALL
@@ -378,6 +383,7 @@ Java_gnu_java_nio_VMChannel_read__ILjava_nio_ByteBuffer_2 (JNIEnv *env,
jint len;
ssize_t result;
struct JCL_buffer buf;
+ int tmp_errno;
/* NIODBG("fd: %d; bbuf: %p", fd, bbuf); */
@@ -396,7 +402,13 @@ Java_gnu_java_nio_VMChannel_read__ILjava_nio_ByteBuffer_2 (JNIEnv *env,
return 0;
}
- result = cpnio_read (fd, &(buf.ptr[buf.position + buf.offset]), len);
+ do
+ {
+ result = cpnio_read (fd, &(buf.ptr[buf.position + buf.offset]), len);
+ tmp_errno = errno;
+ }
+ while (result == -1 && errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
if (result == 0)
{
@@ -452,6 +464,7 @@ Java_gnu_java_nio_VMChannel_write__ILjava_nio_ByteBuffer_2 (JNIEnv *env,
jint len;
ssize_t result;
struct JCL_buffer buf;
+ int tmp_errno;
/* NIODBG("fd: %d; bbuf: %p", fd, bbuf); */
@@ -470,7 +483,14 @@ Java_gnu_java_nio_VMChannel_write__ILjava_nio_ByteBuffer_2 (JNIEnv *env,
return 0;
}
- result = cpnio_write (fd, &(buf.ptr[buf.position + buf.offset]), len);
+ do
+ {
+ result = cpnio_write (fd, &(buf.ptr[buf.position + buf.offset]), len);
+ tmp_errno = errno;
+ }
+ while (result == -1 && errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
+
buf.count = result;
if (result == -1)
@@ -524,6 +544,7 @@ Java_gnu_java_nio_VMChannel_readScattering (JNIEnv *env,
ssize_t result;
jint vec_len = length < JCL_IOV_MAX ? length : JCL_IOV_MAX;
jlong bytes_read = 0;
+ int tmp_errno;
/* NIODBG("fd: %d; bbufs: %p; offset: %d; length: %d", */
/* fd, bbufs, offset, length); */
@@ -547,7 +568,13 @@ Java_gnu_java_nio_VMChannel_readScattering (JNIEnv *env,
}
/* Work the scattering magic */
- result = cpnio_readv (fd, buffers, vec_len);
+ do
+ {
+ result = cpnio_readv (fd, buffers, vec_len);
+ tmp_errno = errno;
+ }
+ while (result == -1 && errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
bytes_read = (jlong) result;
/* Handle the response */
@@ -606,6 +633,7 @@ Java_gnu_java_nio_VMChannel_writeGathering (JNIEnv *env,
ssize_t result;
jint vec_len = length < JCL_IOV_MAX ? length : JCL_IOV_MAX;
jlong bytes_written;
+ int tmp_errno;
/* NIODBG("fd: %d; bbufs: %p; offset: %d; length: %d", */
/* fd, bbufs, offset, length); */
@@ -629,7 +657,14 @@ Java_gnu_java_nio_VMChannel_writeGathering (JNIEnv *env,
}
/* Work the gathering magic */
- result = cpnio_writev (fd, buffers, vec_len);
+ do
+ {
+ result = cpnio_writev (fd, buffers, vec_len);
+ tmp_errno = errno;
+ }
+ while (result == -1 && tmp_errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
+
bytes_written = (jlong) result;
if (result < 0)
@@ -895,10 +930,18 @@ Java_gnu_java_nio_VMChannel_read__I (JNIEnv *env,
#ifdef HAVE_READ
char in;
int ret;
+ int tmp_errno;
/* NIODBG("fd: %d", fd); */
- ret = cpnio_read (fd, &in, 1);
+ do
+ {
+ ret = cpnio_read (fd, &in, 1);
+ tmp_errno = errno;
+ }
+ while (ret == -1 && errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
+
if (-1 == ret)
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
if (0 == ret)
@@ -925,10 +968,17 @@ Java_gnu_java_nio_VMChannel_write__II (JNIEnv *env,
#ifdef HAVE_WRITE
char out = (char) data;
int ret;
+ int tmp_errno;
/* NIODBG("fd: %d; data: %d", fd, data); */
- ret = cpnio_write (fd, &out, 1);
+ do
+ {
+ ret = cpnio_write (fd, &out, 1);
+ tmp_errno = errno;
+ }
+ while (ret == -1 && errno == EINTR && ! JCL_thread_interrupted(env));
+ errno = tmp_errno;
if (-1 == ret)
JCL_ThrowException(env, IO_EXCEPTION, strerror (errno));
@@ -1355,7 +1405,7 @@ Java_gnu_java_nio_VMChannel_getpeername (JNIEnv *env, jclass clazz __attribute__
*/
JNIEXPORT jint JNICALL
Java_gnu_java_nio_VMChannel_accept (JNIEnv *env,
- jclass clazz,
+ jclass c __attribute__((unused)),
jint fd)
{
#ifdef HAVE_ACCEPT
@@ -1383,7 +1433,7 @@ Java_gnu_java_nio_VMChannel_accept (JNIEnv *env,
* other unrelated signal interrupted the system function and
* we should start over again.
*/
- if (JCL_thread_interrupted(env, clazz))
+ if (JCL_thread_interrupted(env))
{
JCL_ThrowException (env, "java/net/SocketException", strerror (tmp_errno));
return -1;
diff --git a/vm/reference/gnu/java/nio/VMChannel.java b/vm/reference/gnu/java/nio/VMChannel.java
index 39ee4edb6..1f69877b6 100644
--- a/vm/reference/gnu/java/nio/VMChannel.java
+++ b/vm/reference/gnu/java/nio/VMChannel.java
@@ -634,7 +634,7 @@ public final class VMChannel
*
* @return
*/
- final boolean isThreadInterrupted()
+ static boolean isThreadInterrupted()
{
return Thread.currentThread().isInterrupted();
}