Index: configure.in =================================================================== RCS file: /cvsroot/classpath/classpath/configure.in,v retrieving revision 1.110 diff -u -r1.110 configure.in --- configure.in 26 Nov 2002 22:45:56 -0000 1.110 +++ configure.in 2 Dec 2002 11:52:06 -0000 @@ -67,6 +67,26 @@ esac], [COMPILE_GTK_PEER=yes]) +AC_ARG_ENABLE(kissme-jni, +[ --enable-kissme-jni enable Kissme JNI extensions [default=no]], +[case "${enableval}" in + yes) + if test ${COMPILE_JNI} = no ; + then + AC_MSG_ERROR(--enable-kissme-jni requires --enable-jni) + fi + KISSME_JNI=yes + ;; + no) KISSME_JNI=no ;; + *) KISSME_JNI=yes ;; +esac], +[KISSME_JNI=no]) + +if test ${KISSME_JNI} = yes ; then + AC_DEFINE(KISSME_JNI_EXTENSIONS, 1, + [Define if your native libraries need the Kissme JNI extensions]) +fi + AM_CONDITIONAL(CREATE_JNI_HEADERS, test "x${COMPILE_JNI}" = xyes) AM_CONDITIONAL(CREATE_JNI_LIBRARIES, test "x${COMPILE_JNI}" = xyes) AM_CONDITIONAL(CREATE_CNI_LIBRARIES, test "x${COMPILE_CNI}" = xyes) Index: include/jni.h.in =================================================================== RCS file: /cvsroot/classpath/classpath/include/jni.h.in,v retrieving revision 1.2 diff -u -r1.2 jni.h.in --- include/jni.h.in 4 Feb 2002 14:56:24 -0000 1.2 +++ include/jni.h.in 2 Dec 2002 11:52:10 -0000 @@ -46,7 +46,9 @@ extern "C" { #endif /* __cplusplus */ - + +#include "config.h" + #include "jni_md.h" typedef jint jsize; @@ -91,8 +93,16 @@ typedef struct _Jv_JavaVM JavaVM; #else /* __cplusplus */ - + +#ifndef _JNI_VM_INTERNAL_TYPES_DEFINED typedef void *jobject; +typedef void *jfieldID; +typedef void *jmethodID; +#ifdef KISSME_JNI_EXTENSIONS +typedef void *jheap; +#endif +#endif + typedef jobject jclass; typedef jobject jstring; typedef jobject jarray; @@ -139,10 +149,6 @@ jobject l; } jvalue; -struct _jfieldID; /* FIXME: VM specific */ -struct _jmethodID; /* FIXME: VM specific */ -typedef struct _jfieldID *jfieldID; -typedef struct _jmethodID *jmethodID; /* Used for jboolean type */ #define JNI_TRUE 1 @@ -176,6 +182,8 @@ JNIEXPORT jint JNICALL JNI_CreateJavaVM (JavaVM **, void **, void *); JNIEXPORT jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); +#ifndef _JNINATIVEMETHOD +#define _JNINATIVEMETHOD /* This structure is used when registering native methods. */ typedef struct @@ -185,6 +193,8 @@ void *fnPtr; } JNINativeMethod; +#endif + struct JNINativeInterface { _Jv_func reserved0; /* 0 */ @@ -193,7 +203,7 @@ _Jv_func reserved3; /* 3 */ jint (JNICALL *GetVersion) (JNIEnv *); /* 4 */ - jclass (JNICALL *DefineClass) (JNIEnv *, const char *, jobject, const jbyte *, jsize); /* 5 */ + jclass (JNICALL *DefineClass) (JNIEnv *, jobject, const jbyte *, jsize); /* 5 */ jclass (JNICALL *FindClass) (JNIEnv *, const char *); /* 6 */ jmethodID (JNICALL *FromReflectedMethod) (JNIEnv *, jobject); /* 7 */ @@ -447,7 +457,28 @@ jweak (JNICALL *NewWeakGlobalRef) (JNIEnv *, jobject); /* 226 */ void (JNICALL *DeleteWeakGlobalRef) (JNIEnv *, jweak); /* 227 */ - jboolean (JNICALL *ExceptionCheck) (JNIEnv *); /* 228 */ + jboolean (JNICALL *ExceptionCheck) (JNIEnv *); /* 228 */ + +#ifdef KISSME_JNI_EXTENSIONS + //-------------------------------------------------- + //kissme-specific methods + //-------------------------------------------------- + + /* JNI hooks for getting the heap for the current process: TEASME */ + jheap (JNICALL *GetHeap) (JNIEnv *); /* 229 */ + + /* JNI hooks for KISSME persistence (not currently used) */ + jobject (*SwizzleObjectField) (JNIEnv *, jobject, jfieldID); /* 230 */ + jobject (*SwizzleArrayElement) (JNIEnv *, jobjectArray, jint); /* 231 */ + void (*MarkUpdated) (JNIEnv *, jobject); /* 232 */ + void (*MarkRefsUpdated) (JNIEnv *, jobject); /* 233 */ + + /* JNI hooks for KISSME GC points / GC regions */ + void (*EnterGCPoint) (JNIEnv *); /* 234 */ + void (*EnterGCRegion) (JNIEnv *); /* 235 */ + void (*ExitGCRegion) (JNIEnv *); /* 236 */ + +#endif }; #ifdef __cplusplus Index: native/jni/java-io/java_io_File.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/java-io/java_io_File.c,v retrieving revision 1.5 diff -u -r1.5 java_io_File.c --- native/jni/java-io/java_io_File.c 25 Oct 2002 12:43:24 -0000 1.5 +++ native/jni/java-io/java_io_File.c 2 Dec 2002 11:52:15 -0000 @@ -73,6 +73,9 @@ if (!fname) return(0); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif fd = open(fname, O_CREAT|O_EXCL|O_RDWR, 0777); if (fd == -1) { @@ -82,6 +85,9 @@ } close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif return(1); } @@ -109,6 +115,9 @@ /* The lazy man's way out. We actually do open the file for reading briefly to verify it can be done */ +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif fd = open(fname, O_RDONLY); (*env)->ReleaseStringUTFChars(env, name, fname); @@ -116,6 +125,9 @@ return(0); close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif return(1); } @@ -143,6 +155,9 @@ /* The lazy man's way out. We actually do open the file for writing briefly to verify it can be done */ +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif fd = open(fname, O_RDWR); (*env)->ReleaseStringUTFChars(env, name, fname); @@ -150,6 +165,9 @@ return(0); close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif return(1); } Index: native/jni/java-io/java_nio.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/java-io/java_nio.c,v retrieving revision 1.3 diff -u -r1.3 java_nio.c --- native/jni/java-io/java_nio.c 7 May 2002 13:19:14 -0000 1.3 +++ native/jni/java-io/java_nio.c 2 Dec 2002 11:52:16 -0000 @@ -416,7 +416,13 @@ server.sin_port = htons(port); do { +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif result = connect(fd, (struct sockaddr *) &server, sizeof(server)); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif } while (result == -1 && errno == EINTR); if (result >= 0) { @@ -461,26 +467,37 @@ { int res; +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif res = listen(fd, backlog); - +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif return res; } int Java_gnu_java_nio_SocketChannelImpl_SocketAvailable(JNIEnv *env,jclass c,int fd) { - unsigned long curr = lseek(fd, 0, SEEK_CUR); - struct stat stat_buf; - - if (fstat(fd, &stat_buf) < 0) { - return 0; - } - return stat_buf.st_size - curr; + unsigned long curr = lseek(fd, 0, SEEK_CUR); + struct stat stat_buf; + + if (fstat(fd, &stat_buf) < 0) { + return 0; + } + return stat_buf.st_size - curr; } int Java_gnu_java_nio_SocketChannelImpl_SocketClose(JNIEnv *env,jclass c,int fd) { if (fd >= 0) { - return close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif + return close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif } return 0; @@ -492,8 +509,14 @@ jbyte *p; p = (*env)->GetByteArrayElements(env, buf, 0); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif result = read(fd, p + off, len); - +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + (*env)->ReleaseByteArrayElements(env, buf, p, 0); // fprintf(stderr, "p=%s\n", p+off); @@ -507,8 +530,14 @@ jbyte *p; p = (*env)->GetByteArrayElements(env, buf, 0); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif result = write(fd, p + off, len); - +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + (*env)->ReleaseByteArrayElements(env, buf, p, 0); return result; Index: native/jni/java-io/javaio.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/java-io/javaio.c,v retrieving revision 1.7 diff -u -r1.7 javaio.c --- native/jni/java-io/javaio.c 29 Nov 2002 18:41:04 -0000 1.7 +++ native/jni/java-io/javaio.c 2 Dec 2002 11:52:16 -0000 @@ -65,7 +65,13 @@ if (!str_name) return(-1); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif fd = open(str_name, flags, 0777); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif (*env)->ReleaseStringUTFChars(env, name, str_name); if (fd == -1) { @@ -93,6 +99,13 @@ if (fd != -1) rc = close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif + rc = close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif if (rc == -1) JCL_ThrowException(env, "java/io/IOException", strerror(errno)); } @@ -164,7 +177,14 @@ return(-1); } +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif rc = read(fd, (bufptr + offset), len); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + if (rc == -1) JCL_ThrowException(env, "java/io/IOException", strerror(errno)); @@ -199,7 +219,14 @@ return(-1); } +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif rc = write(fd, (bufptr + offset), len); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + if (rc == -1) JCL_ThrowException(env, "java/io/IOException", strerror(errno)); Index: native/jni/java-net/javanet.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/java-net/javanet.c,v retrieving revision 1.5 diff -u -r1.5 javanet.c --- native/jni/java-net/javanet.c 2 Dec 2002 00:28:09 -0000 1.5 +++ native/jni/java-net/javanet.c 2 Dec 2002 11:52:18 -0000 @@ -415,8 +415,14 @@ fd = _javanet_get_int_field(env, this, "native_fd"); if (fd == -1) return; - + +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif close(fd); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif if (stream) _javanet_set_int_field(env, this, "java/net/PlainSocketImpl", @@ -464,7 +470,14 @@ si.sin_addr.s_addr = netaddr; si.sin_port = htons(((short)port)); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif rc = connect(fd, (struct sockaddr *) &si, sizeof(struct sockaddr_in)); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + if (rc == -1) { JCL_ThrowException(env, IO_EXCEPTION, strerror(errno)); return; } DBG("_javanet_connect(): Connected successfully\n"); @@ -629,7 +642,13 @@ } /* Start listening */ +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif rc = listen(fd, queuelen); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif if (rc == -1) { JCL_ThrowException(env, IO_EXCEPTION, strerror(errno)); return; } @@ -661,8 +680,15 @@ addrlen = sizeof(struct sockaddr_in); memset(&si, 0, addrlen); - /******* Do we need to look for EINTR? */ +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif newfd = accept(fd, (struct sockaddr *) &si, &addrlen); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + + /******* Do we need to look for EINTR? */ if (newfd == -1) { JCL_ThrowException(env, IO_EXCEPTION, "Internal error: _javanet_accept(): "); return; } @@ -767,6 +793,10 @@ DBG("_javanet_recvfrom(): Got buffer\n"); +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif + /* Read the data */ for (;;) { @@ -785,6 +815,10 @@ break; } +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif + (*env)->ReleaseByteArrayElements(env, buf, p, 0); if (rc == -1) @@ -834,6 +868,10 @@ if (p == NULL) return; +#ifdef KISSME_JNI_EXTENSIONS + (*env)->EnterGCRegion(env); +#endif + /* Send the data */ if (addr == 0) { @@ -848,8 +886,13 @@ si.sin_port = (unsigned short)port; DBG("_javanet_sendto(): Sending....\n"); - rc = sendto(fd, p + offset, len, 0, (struct sockaddr *) &si, sizeof(struct sockaddr_in)); + rc = sendto(fd, p + offset, len, 0, (struct sockaddr *) &si, + sizeof(struct sockaddr_in)); } + +#ifdef KISSME_JNI_EXTENSIONS + (*env)->ExitGCRegion(env); +#endif (*env)->ReleaseByteArrayElements(env, buf, p, 0);