This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

libgcj and incremental gc


The Boehm gc includes an incremental option, which we've never used.

I've tried to enable it as an experiment, but there are problems.  In
particular, we seem prematurely to reclaim trampolines that point to
interpreted method bodies.

I'm not going to pursue this any further, but I'm posting the patch
that enables incremental gc for reference.

Andrew.


Index: libjava/include/i386-signal.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/i386-signal.h,v
retrieving revision 1.19
diff -p -2 -c -r1.19 i386-signal.h
*** libjava/include/i386-signal.h	26 Sep 2004 20:38:48 -0000	1.19
--- libjava/include/i386-signal.h	23 Mar 2005 15:44:34 -0000
*************** details.  */
*** 21,38 ****
  
  #define SIGNAL_HANDLER(_name)	\
! static void _name (int _dummy __attribute__ ((__unused__)))
  
! #define MAKE_THROW_FRAME(_exception)					\
! do									\
! {									\
!   void **_p = (void **)&_dummy;						\
!   volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p;	\
! 									\
!   /* Advance the program counter so that it is after the start of the	\
!      instruction:  the x86 exception handler expects			\
!      the PC to point to the instruction after a call. */		\
!   _regs->eip += 2;							\
! 									\
! }									\
  while (0)
  
--- 21,52 ----
  
  #define SIGNAL_HANDLER(_name)	\
! static void _name (int _sig __attribute__ ((__unused__)))
  
! extern "C" int in_allocd_block (void *addr);
! 
! #define MAKE_THROW_FRAME(_exception)					   \
! do									   \
! {									   \
!   void **_p = (void **)&_sig;						   \
!   struct sigcontext_struct *						   \
!     _regs = (struct sigcontext_struct *)(_p+1);				   \
! 									   \
!   if (_sig == SIGSEGV)							   \
!     {									   \
!       void *addr = (void*)_regs->cr2;					   \
!       if (in_allocd_block (addr))					   \
! 	{								   \
! 	  typedef void (*sighandler_t)(int, struct sigcontext);		   \
! 	  sighandler_t handler = (sighandler_t)old_sigaction.k_sa_handler; \
! 	  (*handler)(_sig, *_regs);					   \
! 	  return;							   \
! 	}								   \
!     }									   \
!    /* Advance the program counter so that it is after the start of the	   \
!      instruction:  the x86 exception handler expects			   \
!      the PC to point to the instruction after a call. */		   \
!   ((volatile struct sigcontext_struct *)_regs)->eip += 2;		   \
! 									   \
! }									   \
  while (0)
  
*************** while (0)
*** 40,44 ****
  do									\
  {									\
!   void **_p = (void **)&_dummy;						\
    volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p;\
  									\
--- 54,58 ----
  do									\
  {									\
!   void **_p = (void **)&_sig;						\
    volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p;\
  									\
*************** struct old_i386_kernel_sigaction {
*** 109,112 ****
--- 123,128 ----
  };
  
+ static struct old_i386_kernel_sigaction old_sigaction;
+ 
  #define RESTORE(name, syscall) RESTORE2 (name, syscall)
  # define RESTORE2(name, syscall) \
*************** do							\
*** 133,137 ****
      kact.k_sa_flags = 0x4000000;			\
      kact.sa_restorer = restore;				\
!     syscall (SYS_sigaction, SIGSEGV, &kact, NULL);	\
    }							\
  while (0)  
--- 149,153 ----
      kact.k_sa_flags = 0x4000000;			\
      kact.sa_restorer = restore;				\
!     syscall (SYS_sigaction, SIGSEGV, &kact, &old_sigaction);	\
    }							\
  while (0)  
Index: boehm-gc/os_dep.c
===================================================================
RCS file: /cvs/gcc/gcc/boehm-gc/os_dep.c,v
retrieving revision 1.30
diff -p -2 -c -r1.30 os_dep.c
*** boehm-gc/os_dep.c	13 Aug 2004 23:05:30 -0000	1.30
--- boehm-gc/os_dep.c	23 Mar 2005 15:44:39 -0000
*************** SIG_PF GC_old_segv_handler;	/* Also old 
*** 2358,2361 ****
--- 2358,2367 ----
  #endif /* !THREADS */
  
+ int 
+ in_allocd_block (void *addr)
+ {
+   return (HDR(addr) != 0);
+ }
+ 
  /*ARGSUSED*/
  #if !defined(DARWIN)
Index: libjava/prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.105
diff -p -2 -c -r1.105 prims.cc
*** libjava/prims.cc	10 Mar 2005 19:02:16 -0000	1.105
--- libjava/prims.cc	23 Mar 2005 15:51:02 -0000
*************** unblock_signal (int signum __attribute__
*** 145,148 ****
--- 145,152 ----
  #endif
  
+ #ifdef FORWARD_SEGV
+ struct gcj_kernel_sigaction old_sigaction;
+ #endif
+ 
  #ifdef HANDLE_SEGV
  SIGNAL_HANDLER (catch_segv)
*************** parse_init_args (JvVMInitArgs* vm_args)
*** 1070,1073 ****
--- 1074,1100 ----
  }
  
+ extern "C"
+ {
+ #include <gc_config.h>
+ 
+ // Set GC_DEBUG before including gc.h!
+ #ifdef LIBGCJ_GC_DEBUG
+ # define GC_DEBUG
+ #endif
+ 
+ #include <gc_mark.h>
+ #include <gc_gcj.h>
+ #include <javaxfc.h>  // GC_finalize_all declaration.  
+ 
+ #ifdef THREAD_LOCAL_ALLOC
+ # define GC_REDIRECT_TO_LOCAL
+ # include <gc_local_alloc.h>
+ #endif
+ 
+   // From boehm's misc.c 
+   void GC_enable();
+   void GC_disable();
+ };
+ 
  jint
  _Jv_CreateJavaVM (JvVMInitArgs* vm_args)
*************** _Jv_CreateJavaVM (JvVMInitArgs* vm_args)
*** 1090,1093 ****
--- 1117,1121 ----
    _Jv_InitThreads ();
    _Jv_InitGC ();
+   GC_enable_incremental ();
    _Jv_InitializeSyncMutex ();
    


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]