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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user