Imported Classpath 0.18.

* sources.am, Makefile.in: Updated.
	* Makefile.am (nat_source_files): Removed natProxy.cc.
	* java/lang/reflect/natProxy.cc: Removed.
	* gnu/classpath/jdwp/VMFrame.java,
	gnu/classpath/jdwp/VMIdManager.java,
	gnu/classpath/jdwp/VMVirtualMachine.java,
	java/lang/reflect/VMProxy.java: New files.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* scripts/makemake.tcl (verbose): Add gnu/java/awt/peer/qt to BC
	list.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/net/DefaultContentHandlerFactory.java (getContent):
	Remove ClasspathToolkit references.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/awt/xlib/XCanvasPeer.java: Add new peer methods.
	* gnu/awt/xlib/XFramePeer.java: Likewise.
	* gnu/awt/xlib/XGraphicsConfiguration.java: Likewise.

2005-09-23  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* Makefile.am (libgcjawt_la_SOURCES): Remove jawt.c.  Add
	classpath/native/jawt/jawt.c.
	* Makefile.in: Regenerate.
	* jawt.c: Remove file.
	* include/Makefile.am (tool_include__HEADERS): Remove jawt.h and
	jawt_md.h.  Add ../classpath/include/jawt.h and
	../classpath/include/jawt_md.h.
	* include/Makefile.in: Regenerate.
	* include/jawt.h: Regenerate.
	* include/jawt_md.h: Regenerate.

From-SVN: r104586
This commit is contained in:
Tom Tromey
2005-09-23 21:31:04 +00:00
parent 9b044d1951
commit 1ea63ef8be
544 changed files with 34724 additions and 14512 deletions
@@ -1,8 +1,8 @@
# Makefile.in generated by automake 1.9.5 from Makefile.am.
# Makefile.in generated by automake 1.9.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# 2003, 2004 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -119,8 +119,14 @@ CREATE_JNI_HEADERS_FALSE = @CREATE_JNI_HEADERS_FALSE@
CREATE_JNI_HEADERS_TRUE = @CREATE_JNI_HEADERS_TRUE@
CREATE_JNI_LIBRARIES_FALSE = @CREATE_JNI_LIBRARIES_FALSE@
CREATE_JNI_LIBRARIES_TRUE = @CREATE_JNI_LIBRARIES_TRUE@
CREATE_QT_PEER_LIBRARIES_FALSE = @CREATE_QT_PEER_LIBRARIES_FALSE@
CREATE_QT_PEER_LIBRARIES_TRUE = @CREATE_QT_PEER_LIBRARIES_TRUE@
CREATE_XMLJ_LIBRARY_FALSE = @CREATE_XMLJ_LIBRARY_FALSE@
CREATE_XMLJ_LIBRARY_TRUE = @CREATE_XMLJ_LIBRARY_TRUE@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DATE = @DATE@
DEFS = @DEFS@
@@ -182,6 +188,7 @@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKDIR = @MKDIR@
MOC = @MOC@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -193,12 +200,13 @@ PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
PANGOFT2_LIBS = @PANGOFT2_LIBS@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
QT_CFLAGS = @QT_CFLAGS@
QT_LIBS = @QT_LIBS@
RANLIB = @RANLIB@
REGEN_PARSERS_FALSE = @REGEN_PARSERS_FALSE@
REGEN_PARSERS_TRUE = @REGEN_PARSERS_TRUE@
REMOVE = @REMOVE@
SET_MAKE = @SET_MAKE@
SH = @SH@
SHELL = @SHELL@
STRICT_WARNING_CFLAGS = @STRICT_WARNING_CFLAGS@
STRIP = @STRIP@
@@ -220,10 +228,13 @@ X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
ZIP = @ZIP@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
@@ -56,6 +56,10 @@ exception statement from your version. */
#include <fcntl.h>
#endif /* HAVE_FCNTL_H */
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif /* HAVE_SYS_MMAN_H */
/* These values must be kept in sync with FileChannelImpl.java. */
#define FILECHANNELIMPL_READ 1
#define FILECHANNELIMPL_WRITE 2
@@ -91,6 +95,10 @@ exception statement from your version. */
#define CONVERT_SSIZE_T_TO_JINT(x) ((jint)(x & 0xFFFFFFFF))
#define CONVERT_JINT_TO_SSIZE_T(x) (x)
/* Align a value up or down to a multiple of the pagesize. */
#define ALIGN_DOWN(p,s) ((p) - ((p) % (s)))
#define ALIGN_UP(p,s) ((p) + ((s) - ((p) % (s))))
/* cached fieldID of gnu.java.nio.channels.FileChannelImpl.fd */
static jfieldID native_fd_fieldID;
@@ -105,12 +113,12 @@ get_native_fd (JNIEnv * env, jobject obj)
* static initialization.
*/
JNIEXPORT void JNICALL
Java_gnu_java_nio_channels_FileChannelImpl_init (JNIEnv * env, jclass clazz)
Java_gnu_java_nio_channels_FileChannelImpl_init (JNIEnv * env,
jclass clazz
__attribute__ ((__unused__)))
{
jclass clazz_fc;
jfieldID field;
jmethodID constructor;
jobject obj;
/* Initialize native_fd_fieldID so we only compute it once! */
clazz_fc = (*env)->FindClass (env, "gnu/java/nio/channels/FileChannelImpl");
@@ -128,28 +136,6 @@ Java_gnu_java_nio_channels_FileChannelImpl_init (JNIEnv * env, jclass clazz)
}
native_fd_fieldID = field;
constructor = (*env)->GetMethodID (env, clazz, "<init>", "(II)V");
if (!constructor)
return;
#define INIT_FIELD(FIELDNAME, FDVALUE, MODE) \
field = (*env)->GetStaticFieldID (env, clazz, FIELDNAME, \
"Lgnu/java/nio/channels/FileChannelImpl;"); \
if (! field) \
return; \
obj = (*env)->NewObject (env, clazz, constructor, FDVALUE, MODE); \
if (! obj) \
return; \
(*env)->SetStaticObjectField (env, clazz, field, obj); \
if ((*env)->ExceptionOccurred (env)) \
return;
INIT_FIELD ("in", 0, FILECHANNELIMPL_READ);
INIT_FIELD ("out", 1, FILECHANNELIMPL_WRITE);
INIT_FIELD ("err", 2, FILECHANNELIMPL_WRITE);
#undef INIT_FIELD
}
/*
@@ -218,17 +204,22 @@ Java_gnu_java_nio_channels_FileChannelImpl_open (JNIEnv * env,
#endif
TARGET_NATIVE_FILE_OPEN (filename, native_fd, flags, permissions, result);
JCL_free_cstring (env, name, filename);
if (result != TARGET_NATIVE_OK)
{
/* We can only throw FileNotFoundException. */
char message[256]; /* Fixed size we don't need to malloc. */
char *error_string = TARGET_NATIVE_LAST_ERROR_STRING ();
snprintf(message, 256, "%s: %s", error_string, filename);
/* We are only allowed to throw FileNotFoundException. */
JCL_ThrowException (env,
"java/io/FileNotFoundException",
TARGET_NATIVE_LAST_ERROR_STRING ());
message);
JCL_free_cstring (env, name, filename);
return TARGET_NATIVE_MATH_INT_INT64_CONST_MINUS_1;
}
JCL_free_cstring (env, name, filename);
return native_fd;
}
@@ -245,12 +236,19 @@ Java_gnu_java_nio_channels_FileChannelImpl_implCloseChannel (JNIEnv * env,
native_fd = get_native_fd (env, obj);
TARGET_NATIVE_FILE_CLOSE (native_fd, result);
if (result != TARGET_NATIVE_OK)
do
{
JCL_ThrowException (env, IO_EXCEPTION,
TARGET_NATIVE_LAST_ERROR_STRING ());
TARGET_NATIVE_FILE_CLOSE (native_fd, result);
if (result != TARGET_NATIVE_OK
&& (TARGET_NATIVE_LAST_ERROR ()
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
{
JCL_ThrowException (env, IO_EXCEPTION,
TARGET_NATIVE_LAST_ERROR_STRING ());
return;
}
}
while (result != TARGET_NATIVE_OK);
}
/*
@@ -267,13 +265,19 @@ Java_gnu_java_nio_channels_FileChannelImpl_available (JNIEnv * env,
native_fd = get_native_fd (env, obj);
TARGET_NATIVE_FILE_AVAILABLE (native_fd, bytes_available, result);
if (result != TARGET_NATIVE_OK)
do
{
JCL_ThrowException (env, IO_EXCEPTION,
TARGET_NATIVE_LAST_ERROR_STRING ());
return 0;
TARGET_NATIVE_FILE_AVAILABLE (native_fd, bytes_available, result);
if (result != TARGET_NATIVE_OK
&& (TARGET_NATIVE_LAST_ERROR ()
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
{
JCL_ThrowException (env, IO_EXCEPTION,
TARGET_NATIVE_LAST_ERROR_STRING ());
return 0;
}
}
while (result != TARGET_NATIVE_OK);
/* FIXME NYI ??? why only jint and not jlong? */
return TARGET_NATIVE_MATH_INT_INT64_TO_INT32 (bytes_available);
@@ -503,13 +507,91 @@ Java_gnu_java_nio_channels_FileChannelImpl_implTruncate (JNIEnv * env,
}
JNIEXPORT jobject JNICALL
Java_gnu_java_nio_channels_FileChannelImpl_mapImpl (JNIEnv * env,
jobject obj
__attribute__ ((__unused__)), jchar mode __attribute__ ((__unused__)), jlong position __attribute__ ((__unused__)), jint size __attribute__ ((__unused__)))
Java_gnu_java_nio_channels_FileChannelImpl_mapImpl (JNIEnv *env, jobject obj,
jchar mode, jlong position, jint size)
{
#ifdef HAVE_MMAP
jclass MappedByteBufferImpl_class;
jmethodID MappedByteBufferImpl_init = NULL;
jobject Pointer_instance;
volatile jobject buffer;
long pagesize;
int prot, flags;
int fd;
void *p;
void *address;
/* FIXME: should we just assume we're on an OS modern enough to
have 'sysconf'? And not check for 'getpagesize'? */
#if defined(HAVE_GETPAGESIZE)
pagesize = getpagesize ();
#elif defined(HAVE_SYSCONF)
pagesize = sysconf (_SC_PAGESIZE);
#else
JCL_ThrowException (env, IO_EXCEPTION,
"java.nio.FileChannelImpl.nio_mmap_file(): not implemented");
"can't determine memory page size");
return NULL;
#endif /* HAVE_GETPAGESIZE/HAVE_SYSCONF */
if ((*env)->ExceptionOccurred (env))
{
return NULL;
}
prot = PROT_READ;
if (mode == '+')
prot |= PROT_WRITE;
flags = (mode == 'c' ? MAP_PRIVATE : MAP_SHARED);
fd = get_native_fd (env, obj);
p = mmap (NULL, (size_t) ALIGN_UP (size, pagesize), prot, flags,
fd, ALIGN_DOWN (position, pagesize));
if (p == MAP_FAILED)
{
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
return NULL;
}
/* Unalign the mapped value back up, since we aligned offset
down to a multiple of the page size. */
address = (void *) ((char *) p + (position % pagesize));
Pointer_instance = JCL_NewRawDataObject(env, address);
MappedByteBufferImpl_class = (*env)->FindClass (env,
"java/nio/MappedByteBufferImpl");
if (MappedByteBufferImpl_class != NULL)
{
MappedByteBufferImpl_init =
(*env)->GetMethodID (env, MappedByteBufferImpl_class,
"<init>", "(Lgnu/classpath/Pointer;IZ)V");
}
if ((*env)->ExceptionOccurred (env))
{
munmap (p, ALIGN_UP (size, pagesize));
return NULL;
}
if (MappedByteBufferImpl_init == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"could not get MappedByteBufferImpl constructor");
munmap (p, ALIGN_UP (size, pagesize));
return NULL;
}
buffer = (*env)->NewObject (env, MappedByteBufferImpl_class,
MappedByteBufferImpl_init, Pointer_instance,
(jint) size, mode == 'r');
return buffer;
#else
(void) obj;
(void) mode;
(void) position;
(void) size;
JCL_ThrowException (env, IO_EXCEPTION,
"memory-mapped files not implemented");
return 0;
#endif /* HAVE_MMAP */
}
/*
@@ -735,17 +817,23 @@ Java_gnu_java_nio_channels_FileChannelImpl_lock (JNIEnv *env, jobject obj,
flock.l_type = shared ? F_RDLCK : F_WRLCK;
flock.l_whence = SEEK_SET;
flock.l_start = (off_t) position;
flock.l_len = (off_t) size;
/* Long.MAX_VALUE means lock everything possible starting at pos. */
if (size == 9223372036854775807LL)
flock.l_len = 0;
else
flock.l_len = (off_t) size;
ret = fcntl (fd, cmd, &flock);
/* fprintf(stderr, "fd %d, wait %d, shared %d, ret %d, position %lld, size %lld, l_start %ld, l_len %ld\n", fd, wait, shared,ret, position, size, (long) flock.l_start, (long) flock.l_len); */
if (ret)
{
/* Linux man pages for fcntl state that errno might be either
EACCES or EAGAIN if we try F_SETLK, and another process has
an overlapping lock. */
an overlapping lock. We should not get an unexpected errno. */
if (errno != EACCES && errno != EAGAIN)
{
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
JCL_ThrowException (env, "java/lang/InternalError",
strerror (errno));
}
return JNI_FALSE;
}
@@ -776,12 +864,17 @@ Java_gnu_java_nio_channels_FileChannelImpl_unlock (JNIEnv *env,
flock.l_type = F_UNLCK;
flock.l_whence = SEEK_SET;
flock.l_start = (off_t) position;
flock.l_len = (off_t) length;
/* Long.MAX_VALUE means unlock everything possible starting at pos. */
if (length == 9223372036854775807LL)
flock.l_len = 0;
else
flock.l_len = (off_t) length;
ret = fcntl (fd, F_SETLK, &flock);
if (ret)
{
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
JCL_ThrowException (env, "java/lang/InternalError",
strerror (errno));
}
#else
(void) obj;
@@ -173,23 +173,14 @@ static void
createRawData (JNIEnv * env, jobject obj, void *ptr)
{
jclass cls;
jmethodID method;
jobject data;
jfieldID data_fid;
cls = (*env)->GetObjectClass (env, obj);
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/RawData;");
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/Pointer;");
assert (data_fid != 0);
#ifdef POINTERS_ARE_64BIT
cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
method = (*env)->GetMethodID (env, cls, "<init>", "(J)V");
data = (*env)->NewObject (env, cls, method, (jlong) ptr);
#else
cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
method = (*env)->GetMethodID (env, cls, "<init>", "(I)V");
data = (*env)->NewObject (env, cls, method, (jint) ptr);
#endif
data = JCL_NewRawDataObject(env, ptr);
(*env)->SetObjectField (env, obj, data_fid, data);
}
@@ -198,22 +189,13 @@ static void *
getData (JNIEnv * env, jobject obj)
{
jclass cls;
jfieldID field;
jfieldID data_fid;
jobject data;
cls = (*env)->GetObjectClass (env, obj);
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/RawData;");
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/Pointer;");
assert (data_fid != 0);
data = (*env)->GetObjectField (env, obj, data_fid);
#if SIZEOF_VOID_P == 8
cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
field = (*env)->GetFieldID (env, cls, "data", "J");
return (void *) (*env)->GetLongField (env, data, field);
#else
cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
field = (*env)->GetFieldID (env, cls, "data", "I");
return (void *) (*env)->GetIntField (env, data, field);
#endif
return JCL_GetRawData(env, data);
}
@@ -173,23 +173,14 @@ static void
createRawData (JNIEnv * env, jobject obj, void *ptr)
{
jclass cls;
jmethodID method;
jobject data;
jfieldID data_fid;
cls = (*env)->GetObjectClass (env, obj);
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/RawData;");
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/Pointer;");
assert (data_fid != 0);
#ifdef POINTERS_ARE_64BIT
cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
method = (*env)->GetMethodID (env, cls, "<init>", "(J)V");
data = (*env)->NewObject (env, cls, method, (jlong) ptr);
#else
cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
method = (*env)->GetMethodID (env, cls, "<init>", "(I)V");
data = (*env)->NewObject (env, cls, method, (jint) ptr);
#endif
data = JCL_NewRawDataObject (env, ptr);
(*env)->SetObjectField (env, obj, data_fid, data);
}
@@ -198,22 +189,13 @@ static void *
getData (JNIEnv * env, jobject obj)
{
jclass cls;
jfieldID field;
jfieldID data_fid;
jobject data;
cls = (*env)->GetObjectClass (env, obj);
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/RawData;");
data_fid = (*env)->GetFieldID (env, cls, "data", "Lgnu/classpath/Pointer;");
assert (data_fid != 0);
data = (*env)->GetObjectField (env, obj, data_fid);
#if SIZEOF_VOID_P == 8
cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
field = (*env)->GetFieldID (env, cls, "data", "J");
return (void *) (*env)->GetLongField (env, data, field);
#else
cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
field = (*env)->GetFieldID (env, cls, "data", "I");
return (void *) (*env)->GetIntField (env, data, field);
#endif
return JCL_GetRawData(env, data);
}
@@ -1,5 +1,5 @@
/* java_nio_MappedByteBufferImpl.c - Native methods for MappedByteBufferImpl
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,41 +43,200 @@ exception statement from your version. */
#include "java_nio_MappedByteBufferImpl.h"
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif /* HAVE_SYS_MMAN_H */
#define IO_EXCEPTION "java/io/IOException"
JNIEXPORT void JNICALL
Java_java_nio_MappedByteBufferImpl_unmapImpl (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
/* FIXME these are defined in gnu_java_nio_channels_FileChannelImpl
too; should be someplace common. */
#define ALIGN_DOWN(p,s) ((jpointer)(p) - ((jpointer)(p) % (s)))
#define ALIGN_UP(p,s) ((jpointer)(p) + ((s) - ((jpointer)(p) % (s))))
/**
* Returns the memory page size of this platform.
*
* \return The page size.
*/
static long
get_pagesize (void)
{
/* FIXME can we just try HAVE_SYSCONF? */
#if defined(HAVE_GETPAGESIZE)
return getpagesize ();
#elif defined (HAVE_SYSCONF)
return sysconf (_SC_PAGESIZE);
#endif /* HAVE_GETPAGESIZE / HAVE_SYSCONF */
}
/**
* Retrieve the 'address' and 'cap' (the mapped size) fields of this
* buffer.
*
* This function will align the address down to the nearest page
* boundary, and the size up to the nearest page boundary. Thus, it is
* safe to use these values in 'mman' functions.
*
* \param env The JNI environment pointer.
* \param this The MappedByteBufferImpl instance.
* \param address A pointer to where the actual pointer should be
* stored.
* \param size A pointer to where the mapped region's size should be
* stored
*/
static void
get_raw_values (JNIEnv *env, jobject this, void **address, size_t *size)
{
const long pagesize = get_pagesize ();
jfieldID MappedByteBufferImpl_address;
jfieldID MappedByteBufferImpl_size;
jobject MappedByteBufferImpl_address_value = NULL;
*address = NULL;
/* 'address' is declared in java.nio.Buffer */
MappedByteBufferImpl_address
= (*env)->GetFieldID (env, (*env)->GetObjectClass (env, this),
"address", "Lgnu/classpath/Pointer;");
/* 'cap' -- likewise, the capacity */
MappedByteBufferImpl_size
= (*env)->GetFieldID (env, (*env)->GetObjectClass (env, this),
"cap", "I");
if (MappedByteBufferImpl_address != NULL)
{
MappedByteBufferImpl_address_value =
(*env)->GetObjectField (env, this, MappedByteBufferImpl_address);
}
if ((*env)->ExceptionOccurred (env))
return;
if (MappedByteBufferImpl_address_value == NULL)
{
JCL_ThrowException (env, "java/lang/NullPointerException",
"mapped address is NULL");
return;
}
*address = (void *)
ALIGN_DOWN (JCL_GetRawData (env, MappedByteBufferImpl_address_value), pagesize);
*size = (size_t)
ALIGN_UP ((*env)->GetIntField (env, this, MappedByteBufferImpl_size),
pagesize);
}
JNIEXPORT void JNICALL
Java_java_nio_MappedByteBufferImpl_unmapImpl (JNIEnv *env, jobject this)
{
#ifdef HAVE_MUNMAP
void *address;
size_t size;
get_raw_values (env, this, &address, &size);
if (address == NULL)
return;
if (munmap (address, size) != 0)
{
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
return;
}
#else
JCL_ThrowException (env, IO_EXCEPTION,
"java.nio.MappedByteBufferImpl.unmapImpl(): not implemented");
"unmapping files not implemented");
#endif /* HAVE_MUNMAP */
}
JNIEXPORT jboolean JNICALL
Java_java_nio_MappedByteBufferImpl_isLoadedImpl (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
Java_java_nio_MappedByteBufferImpl_isLoadedImpl (JNIEnv * env, jobject this)
{
JCL_ThrowException (env, IO_EXCEPTION,
"java.nio.MappedByteBufferImpl.isLoadedImpl(): not implemented");
return 0;
#ifdef HAVE_MINCORE
void *address;
size_t size;
char *vec;
size_t count, i;
const long pagesize = get_pagesize ();
/*
* FIXME on Darwin this does not work if the mapped region is
* exactly one page long; i.e., 'mincore' tells us it isn't loaded.
*/
get_raw_values (env, this, &address, &size);
if (address == NULL)
return JNI_FALSE;
count = (size_t) ((size + pagesize - 1) / pagesize);
vec = (char *) malloc (count * sizeof (unsigned char));
/*
* Darwin (and BSD?) define argument 3 of 'mincore' to be 'char *',
* while GNU libc defines it to be 'unsigned char *'. Casting the
* argument to 'void *' fixes this, but not with C++. So you might
* be SOL if you compile this with g++ (!) on GNU with -Werror.
*/
#ifdef __cplusplus
if (mincore (address, size, vec) != 0)
#else
if (mincore (address, size, (void *) vec) != 0)
#endif /* __cplusplus */
{
free (vec);
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
return JNI_FALSE;
}
for (i = 0; i < count; i++)
{
if ((vec[i] & 1) == 0)
return JNI_FALSE;
}
return JNI_TRUE;
#else
return JNI_FALSE;
#endif
}
JNIEXPORT void JNICALL
Java_java_nio_MappedByteBufferImpl_loadImpl (JNIEnv * env,
jclass clazz
__attribute__ ((__unused__)))
Java_java_nio_MappedByteBufferImpl_loadImpl (JNIEnv *env, jobject this)
{
#ifdef HAVE_MADVISE
void *address;
size_t size;
get_raw_values (env, this, &address, &size);
if (address == NULL)
return;
madvise (address, size, MADV_WILLNEED);
#else
JCL_ThrowException (env, IO_EXCEPTION,
"java.nio.MappedByteBufferImpl.loadImpl(): not implemented");
"forcing mapped files into core not implemented");
#endif /* HAVE_MADVISE */
}
JNIEXPORT void JNICALL
Java_java_nio_MappedByteBufferImpl_forceImpl (JNIEnv * env,
jclass class
__attribute__ ((__unused__)))
Java_java_nio_MappedByteBufferImpl_forceImpl (JNIEnv *env, jobject this)
{
#ifdef HAVE_MSYNC
void *address;
size_t size;
get_raw_values (env, this, &address, &size);
if (address == NULL)
return;
/* FIXME: is using MS_SYNC ok? Should we use MS_INVALIDATE? */
if (msync (address, size, MS_SYNC) != 0)
{
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
}
#else
JCL_ThrowException (env, IO_EXCEPTION,
"java.nio.MappedByteBufferImpl.forceImpl(): not implemented");
"forcing mapped files to disk not implemented");
#endif /* HAVE_MSYNC */
}
@@ -45,106 +45,6 @@ exception statement from your version. */
#include "java_nio_VMDirectByteBuffer.h"
static jclass classRawData;
static jmethodID methodRawDataInit;
static jfieldID fieldNativePointer;
static void *NIOGetPointer (JNIEnv *, jobject);
static jobject NIOGetRawData (JNIEnv *, void *pointer);
static void *
NIOGetPointer (JNIEnv * env, jobject rawdata)
{
#if SIZEOF_VOID_P == 4
return (void *) (*env)->GetIntField (env, rawdata, fieldNativePointer);
#elif SIZEOF_VOID_P == 8
return (void *) (*env)->GetLongField (env, rawdata, fieldNativePointer);
#else
#error unsupported pointer size
#endif
}
static jobject
NIOGetRawData (JNIEnv * env, void *pointer)
{
#if SIZEOF_VOID_P == 4
return (*env)->NewObject (env, classRawData, methodRawDataInit,
(jint) pointer);
#elif SIZEOF_VOID_P == 8
return (*env)->NewObject (env, classRawData, methodRawDataInit,
(jlong) pointer);
#else
#error unsupported pointer size
#endif
}
JNIEXPORT void JNICALL
Java_java_nio_VMDirectByteBuffer_init
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)))
{
#if SIZEOF_VOID_P == 4
classRawData = (*env)->FindClass (env, "gnu/classpath/RawData32");
if (classRawData == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal class");
return;
}
methodRawDataInit = (*env)->GetMethodID (env, classRawData,
"<init>", "(I)V");
if (methodRawDataInit == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal constructor");
return;
}
fieldNativePointer = (*env)->GetFieldID (env, classRawData, "data", "I");
if (fieldNativePointer == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal field");
return;
}
#elif SIZEOF_VOID_P == 8
classRawData = (*env)->FindClass (env, "gnu/classpath/RawData64");
if (classRawData == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal class");
return;
}
methodRawDataInit = (*env)->GetMethodID (env, classRawData,
"<init>", "(J)V");
if (methodRawDataInit == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal constructor");
return;
}
fieldNativePointer = (*env)->GetFieldID (env, classRawData, "data", "J");
if (fieldNativePointer == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"unable to find internal field");
return;
}
#else
#error unsupported pointer size
#endif
/* We need to wrap the jclass in global reference to make it persistent */
if ((classRawData = (*env)->NewGlobalRef (env, classRawData)) == NULL)
{
JCL_ThrowException (env, "java/lang/InternalError",
"failed to create global reference");
return;
}
}
JNIEXPORT jobject JNICALL
Java_java_nio_VMDirectByteBuffer_allocate
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)), jint capacity)
@@ -160,41 +60,53 @@ Java_java_nio_VMDirectByteBuffer_allocate
return 0;
}
return NIOGetRawData (env, buffer);
return JCL_NewRawDataObject (env, buffer);
}
JNIEXPORT void JNICALL
Java_java_nio_VMDirectByteBuffer_free
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)), jobject address)
{
free (NIOGetPointer (env, address));
free (JCL_GetRawData (env, address));
}
JNIEXPORT jbyte JNICALL
Java_java_nio_VMDirectByteBuffer_get__Lgnu_classpath_RawData_2I
Java_java_nio_VMDirectByteBuffer_get__Lgnu_classpath_Pointer_2I
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint index)
{
return ((jbyte *) NIOGetPointer (env, address))[index];
return ((jbyte *) JCL_GetRawData (env, address))[index];
}
JNIEXPORT void JNICALL
Java_java_nio_VMDirectByteBuffer_put
Java_java_nio_VMDirectByteBuffer_put__Lgnu_classpath_Pointer_2IB
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint index, jbyte value)
{
jbyte *pointer = (jbyte *) NIOGetPointer (env, address) + index;
jbyte *pointer = (jbyte *) JCL_GetRawData (env, address) + index;
*pointer = value;
}
JNIEXPORT void JNICALL
Java_java_nio_VMDirectByteBuffer_get__Lgnu_classpath_RawData_2I_3BII
Java_java_nio_VMDirectByteBuffer_get__Lgnu_classpath_Pointer_2I_3BII
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint index, jbyteArray dst, jint dst_offset, jint dst_len)
{
jbyte *src = (jbyte *) NIOGetPointer (env, address) + index;
memcpy ((*env)->GetByteArrayElements (env, dst, NULL) + dst_offset, src,
dst_len);
jbyte *src = (jbyte *) JCL_GetRawData (env, address) + index;
jbyte *_dst = (*env)->GetByteArrayElements (env, dst, NULL) + dst_offset;
memcpy (_dst, src, dst_len);
(*env)->ReleaseByteArrayElements (env, dst, _dst, 0);
}
JNIEXPORT void JNICALL
Java_java_nio_VMDirectByteBuffer_put__Lgnu_classpath_Pointer_2I_3BII
(JNIEnv *env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint index, jbyteArray src, jint src_offset, jint src_len)
{
jbyte *_src = (*env)->GetByteArrayElements (env, src, NULL) + src_offset;
jbyte *dst = (jbyte *)JCL_GetRawData (env, address) + index;
(*env)->ReleaseByteArrayElements (env, src, _src, 0);
memcpy (dst, _src, src_len);
}
JNIEXPORT void JNICALL
@@ -202,8 +114,8 @@ Java_java_nio_VMDirectByteBuffer_shiftDown
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint dst_offset, jint src_offset, jint count)
{
jbyte *dst = (jbyte *) NIOGetPointer (env, address) + dst_offset;
jbyte *src = (jbyte *) NIOGetPointer (env, address) + src_offset;
jbyte *dst = (jbyte *) JCL_GetRawData (env, address) + dst_offset;
jbyte *src = (jbyte *) JCL_GetRawData (env, address) + src_offset;
memmove (dst, src, count);
}
@@ -212,5 +124,5 @@ Java_java_nio_VMDirectByteBuffer_adjustAddress
(JNIEnv * env, jclass clazz __attribute__ ((__unused__)),
jobject address, jint offset)
{
return NIOGetRawData (env, (jbyte *) NIOGetPointer (env, address) + offset);
return JCL_NewRawDataObject (env, (jbyte *) JCL_GetRawData (env, address) + offset);
}