summaryrefslogtreecommitdiff
path: root/libjava/boehm.cc
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-24 05:40:37 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-24 05:40:37 +0000
commitf414d9a71062e37063de088da3de2a9041d9125c (patch)
treeee7c6e621432b96c0092733f35d1cc29967a2b97 /libjava/boehm.cc
parent7683d74127f6ac1c6e927851bdb566aebc46c7cd (diff)
downloadgcc-f414d9a71062e37063de088da3de2a9041d9125c.tar.gz
2001-05-23 Tom Tromey <tromey@redhat.com>
* posix-threads.cc (_Jv_self_cache): Renamed from self_cache. * gcj/Makefile.in: Rebuilt. * gcj/Makefile.am (gcj_HEADERS): Added libgcj-config.h. * gcj/javaprims.h: Include gcj/libgcj-config.h. * gcj/libgcj-config.h.in: New file. * libgcj.spec.in (*jc1): Added @HASH_SYNC_SPEC@. * configure: Rebuilt. * configure.in: Enable hash synchronization by default on some platforms. (HASH_SYNC_SPEC): New subst. (AC_CONFIG_HEADER): Added gcj/libgcj-config.h. Correctly use `test -z' instead of `test -n' in a couple places. (JV_HASH_SYNCHRONIZATION): Use AC_DEFINE; don't add to LIBGCJ_CXXFLAGS. * configure.host (enable_java_net_default): Initialize. (enable_hash_synchronization_default): New variable. 2001-05-23 Hans Boehm <Hans_Boehm@hp.com> * boehm.cc (_Jv_MarkObj): Don't mark sync_info when hash synchronization in use. (_Jv_MarkArray): Likewise. (_Jv_AllocBytes): Don't check return result. (handle_out_of_memory): New function. (_Jv_InitGC): Set GC_oom_fn. (trace_one_vtable): New global. (_Jv_AllocTraceOne): New function. * configure.in: Added --enable-hash-synchronization. * defineclass.cc, prims.cc, resolve.cc, java/lang/natString.cc, java/net/natInetAddress.cc: Remove _Jv_AllocBytesChecked. * nogc.cc (_Jv_AllocObj): Throw out-of-memory. (_Jv_AllocArray): Likewise. (_Jv_AllocBytes): Likewise. (_Jv_AllocPtrFreeObject): New function. (_Jv_AllocTraceOne): Likewise. * posix-threads.cc (_Jv_ThreadRegister): Handle slow pthread_self(). (self_cache): New global. (_Jv_ThreadSelf_out_of_line): New function. * prims.cc (_Jv_AllocBytesChecked): Removed. (_Jv_ThrowNoMemory): New function. (_Jv_AllocObject): Don't check for null return from allocator. (_Jv_NewObjectArray): Likewise. (_Jv_AllocPtrFreeObject): New function. (_Jv_NewPrimArray): Allocate pointer-free object if possible. * include/javaprims.h (_Jv_AllocPtrFreeObject): Declare. (_Jv_MonitorEnter, _Jv_MonitorExit): Don't return value. * include/boehm-gc.h (_Jv_AllocObj): Define. (_Jv_AllocPtrFreeObj): Define. * include/jvm.h (_Jv_AllocPtrFreeObj): Declare. (_Jv_ThrowNoMemory): Declare. (_Jv_AllocTraceOne): Declare. (_Jv_AllocBytesChecked): Removed. * include/posix-threads.h (_Jv_MutexInit, _Jv_MutexLock, _Jv_MutexUnlock): Handle LOCK_DEBUG. (_Jv_ThreadSelf): Handle case where system pthread_self() is slow. * java/lang/Class.h (Class): Declare _Jv_AllocPtrFreeObj as friend. * java/lang/Object.h (sync_info): Conditional upon presence of hash synchronization. * java/lang/natObject.cc: Much new code to handle thin locks and hash synchronization. * java/lang/natString.cc (_Jv_AllocString): Allocate pointer-free object if possible. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42519 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/boehm.cc')
-rw-r--r--libjava/boehm.cc79
1 files changed, 54 insertions, 25 deletions
diff --git a/libjava/boehm.cc b/libjava/boehm.cc
index bec0b6fc91f..dcf99507b80 100644
--- a/libjava/boehm.cc
+++ b/libjava/boehm.cc
@@ -1,6 +1,6 @@
// boehm.cc - interface between libjava and Boehm GC.
-/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
This file is part of libgcj.
@@ -97,10 +97,13 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */)
if (__builtin_expect (! dt || !(dt -> get_finalizer()), false))
return mark_stack_ptr;
jclass klass = dt->clas;
+ ptr_t p;
- // Every object has a sync_info pointer.
- ptr_t p = (ptr_t) obj->sync_info;
- MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o1label);
+# ifndef JV_HASH_SYNCHRONIZATION
+ // Every object has a sync_info pointer.
+ p = (ptr_t) obj->sync_info;
+ MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o1label);
+# endif
// Mark the object's class.
p = (ptr_t) klass;
MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o2label);
@@ -300,10 +303,13 @@ _Jv_MarkArray (void *addr, void *msp, void *msl, void * /*env*/)
if (__builtin_expect (! dt || !(dt -> get_finalizer()), false))
return mark_stack_ptr;
jclass klass = dt->clas;
+ ptr_t p;
- // Every object has a sync_info pointer.
- ptr_t p = (ptr_t) array->sync_info;
- MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, array, e1label);
+# ifndef JV_HASH_SYNCHRONIZATION
+ // Every object has a sync_info pointer.
+ p = (ptr_t) array->sync_info;
+ MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, array, e1label);
+# endif
// Mark the object's class.
p = (ptr_t) klass;
MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o2label);
@@ -326,18 +332,24 @@ _Jv_MarkArray (void *addr, void *msp, void *msl, void * /*env*/)
// knows this, so in that case everything else will break, too.
#define GCJ_DEFAULT_DESCR GC_MAKE_PROC(GC_GCJ_RESERVED_MARK_PROC_INDEX,0)
void *
-_Jv_BuildGCDescr(jclass klass)
+_Jv_BuildGCDescr(jclass)
{
/* FIXME: We should really look at the class and build the descriptor. */
return (void *)(GCJ_DEFAULT_DESCR);
}
#endif
-// Allocate space for a new Java object.
+// Allocate some space that is known to be pointer-free.
void *
-_Jv_AllocObj (jsize size, jclass klass)
+_Jv_AllocBytes (jsize size)
{
- return GC_GCJ_MALLOC (size, klass->vtable);
+ void *r = GC_MALLOC_ATOMIC (size);
+ // We have to explicitly zero memory here, as the GC doesn't
+ // guarantee that PTRFREE allocations are zeroed. Note that we
+ // don't have to do this for other allocation types because we set
+ // the `ok_init' flag in the type descriptor.
+ memset (r, 0, size);
+ return r;
}
// Allocate space for a new Java array.
@@ -368,20 +380,6 @@ _Jv_AllocArray (jsize size, jclass klass)
return obj;
}
-// Allocate some space that is known to be pointer-free.
-void *
-_Jv_AllocBytes (jsize size)
-{
- void *r = GC_MALLOC_ATOMIC (size);
- // We have to explicitly zero memory here, as the GC doesn't
- // guarantee that PTRFREE allocations are zeroed. Note that we
- // don't have to do this for other allocation types because we set
- // the `ok_init' flag in the type descriptor.
- if (__builtin_expect (r != NULL, !NULL))
- memset (r, 0, size);
- return r;
-}
-
static void
call_finalizer (GC_PTR obj, GC_PTR client_data)
{
@@ -462,6 +460,11 @@ _Jv_EnableGC (void)
_Jv_MutexUnlock (&disable_gc_mutex);
}
+static void * handle_out_of_memory(size_t)
+{
+ _Jv_ThrowNoMemory();
+}
+
void
_Jv_InitGC (void)
{
@@ -484,6 +487,10 @@ _Jv_InitGC (void)
// stash in the class vtable.
GC_init_gcj_malloc (0, (void *) _Jv_MarkObj);
+ // Cause an out of memory error to be thrown from the allocators,
+ // instead of returning 0. This is cheaper than checking on allocation.
+ GC_oom_fn = handle_out_of_memory;
+
LOCK ();
GC_java_finalization = 1;
@@ -511,6 +518,28 @@ _Jv_InitGC (void)
ENABLE_SIGNALS ();
}
+#ifdef JV_HASH_SYNCHRONIZATION
+// Allocate an object with a fake vtable pointer, which causes only
+// the first field (beyond the fake vtable pointer) to be traced.
+// Eventually this should probably be generalized.
+
+static _Jv_VTable trace_one_vtable = {
+ 0, // class pointer
+ (void *)(2 * sizeof(void *)),
+ // descriptor; scan 2 words incl. vtable ptr.
+ // Least significant bits must be zero to
+ // identify this as a lenght descriptor
+ {0} // First method
+};
+
+void *
+_Jv_AllocTraceOne (jsize size /* includes vtable slot */)
+{
+ return GC_GCJ_MALLOC (size, &trace_one_vtable);
+}
+
+#endif /* JV_HASH_SYNCHRONIZATION */
+
#if 0
void
_Jv_InitGC (void)