/* -*-C-*-
-$Id: bchmmg.c,v 9.78 1993/08/03 08:29:35 gjr Exp $
+$Id: bchmmg.c,v 9.79 1993/08/22 22:38:59 gjr Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
termination_gc_out_of_space ();
ENTER_CRITICAL_SECTION ("garbage collector");
+ run_pre_gc_hooks ();
gc_counter += 1;
GC_Reserve = new_gc_reserve;
GC (0);
+ run_post_gc_hooks ();
POP_PRIMITIVE_FRAME (1);
GC_Daemon_Proc = (Get_Fixed_Obj_Slot (GC_Daemon));
/* -*-C-*-
-$Id: bchpur.c,v 9.59 1993/06/24 07:06:59 gjr Exp $
+$Id: bchpur.c,v 9.60 1993/08/22 22:39:01 gjr Exp $
Copyright (c) 1987-1992 Massachusetts Institute of Technology
and if so we need a new bufferfull. */
Scan += (OBJECT_DATUM (Temp));
if (Scan < scan_buffer_top)
- {
break;
- }
else
{
unsigned long overflow;
GC_Reserve = (arg_nonnegative_integer (3));
ENTER_CRITICAL_SECTION ("purify");
+ run_pre_gc_hooks ();
{
SCHEME_OBJECT purify_result;
SCHEME_OBJECT words_free;
(*Free++) = purify_result;
(*Free++) = words_free;
}
+ run_post_gc_hooks ();
POP_PRIMITIVE_FRAME (3);
daemon = (Get_Fixed_Obj_Slot (GC_Daemon));
if (daemon == SHARP_F)
/* -*-C-*-
-$Id: gccode.h,v 9.49 1993/08/21 02:25:29 gjr Exp $
+$Id: gccode.h,v 9.50 1993/08/22 22:39:02 gjr Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
#ifdef ENABLE_GC_DEBUGGING_TOOLS
+extern void EXFUN (check_transport_vector_lossage,
+ (SCHEME_OBJECT *, SCHEME_OBJECT *, SCHEME_OBJECT *));
+
#define CHECK_TRANSPORT_VECTOR_TERMINATION() \
{ \
if (! ((To <= Scan) \
&& (((Constant_Space <= To) && (To < Constant_Top)) \
? ((Constant_Space <= Scan) && (Scan < Constant_Top)) \
: ((Heap_Bottom <= Scan) && (Scan < Heap_Top))))) \
- { \
- outf_fatal ("\nBad transport_vector limit:\n"); \
- outf_fatal (" limit = 0x%lx\n", ((long) Scan)); \
- outf_fatal (" Scan = 0x%lx\n", ((long) Saved_Scan)); \
- outf_fatal (" To = 0x%lx\n", ((long) To)); \
- outf_flush_fatal (); \
- abort (); \
- } \
+ check_transport_vector_lossage (Scan, Saved_Scan, To); \
if ((OBJECT_DATUM (*Old)) > 65536) \
{ \
outf_error ("\nWarning: copying large vector: %d\n", \
/* Compiled Code Relocation Utilities */
#include "cmpgc.h"
+\f
+typedef struct gc_hook_list_s
+{
+ void EXFUN ((* hook), (void));
+ struct gc_hook_list_s * next;
+} * gc_hook_list;
+
+extern int EXFUN (add_pre_gc_hook, (void (*) (void)));
+extern int EXFUN (add_post_gc_hook, (void (*) (void)));
+extern void EXFUN (run_pre_gc_hooks, (void));
+extern void EXFUN (run_post_gc_hooks, (void));
/* -*-C-*-
-$Id: memmag.c,v 9.53 1993/08/03 22:15:14 gjr Exp $
+$Id: memmag.c,v 9.54 1993/08/22 22:39:03 gjr Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
}
ENTER_CRITICAL_SECTION ("garbage collector");
+ run_pre_gc_hooks ();
gc_counter += 1;
GC_Reserve = new_gc_reserve;
GCFlip ();
GC ();
+ run_post_gc_hooks ();
POP_PRIMITIVE_FRAME (1);
GC_Daemon_Proc = (Get_Fixed_Obj_Slot (GC_Daemon));
}
PRIMITIVE_RETURN (UNSPECIFIC);
}
+
+void
+DEFUN (check_transport_vector_lossage, (Scan, Saved_Scan, To),
+ SCHEME_OBJECT * Scan
+ AND SCHEME_OBJECT * Saved_Scan
+ AND SCHEME_OBJECT * To)
+{
+ outf_fatal ("\nBad transport_vector limit:\n");
+ outf_fatal (" limit = 0x%lx\n", ((long) Scan));
+ outf_fatal (" Scan = 0x%lx\n", ((long) Saved_Scan));
+ outf_fatal (" To = 0x%lx\n", ((long) To));
+ outf_flush_fatal ();
+ abort ();
+}
/* -*-C-*-
-$Id: purify.c,v 9.50 1993/08/21 04:01:15 gjr Exp $
+$Id: purify.c,v 9.51 1993/08/22 22:39:04 gjr Exp $
Copyright (c) 1988-1993 Massachusetts Institute of Technology
/* Pass 1 -- Copy object to new heap, then GC into that heap */
+ run_pre_gc_hooks ();
GCFlip ();
Heap_Start = Free;
*Free++ = Object;
Free[Purify_Really_Pure] = Purify_Object;
Answer = MAKE_POINTER_OBJECT (TC_VECTOR, Free);
Free += (Purify_N_Slots + 1);
+ run_post_gc_hooks ();
return (Answer);
}
\f
SCHEME_OBJECT *New_Object, Relocated_Object, *Result;
long Pure_Length, Recomputed_Length;
+ run_pre_gc_hooks ();
STACK_SANITY_CHECK ("PURIFY");
Length = (OBJECT_DATUM (FAST_MEMORY_REF (Info, Purify_Length)));
if (FAST_MEMORY_REF (Info, Purify_Really_Pure) == SHARP_F)
- {
Purify_Object = false;
- }
else
- {
Purify_Object = true;
- }
Relocated_Object = *Heap_Bottom;
if (!(TEST_CONSTANT_TOP (Free_Constant + Length + 6)))
- {
return (SHARP_F);
- }
New_Object = Free_Constant;
GCFlip ();
*Free_Constant++ = SHARP_F; /* Will hold pure space header */
Pure_Length = ((Free_Constant - New_Object) + 1);
}
else
- {
Pure_Length = 3;
- }
*Free_Constant++ = (MAKE_OBJECT (TC_MANIFEST_SPECIAL_NM_VECTOR, 1));
*Free_Constant++ = (MAKE_OBJECT (CONSTANT_PART, Pure_Length));
if (Purify_Object)
*New_Object = (MAKE_OBJECT (PURE_PART, (Recomputed_Length + 5)));
SET_CONSTANT_TOP ();
GC ();
+ run_post_gc_hooks ();
return (SHARP_T);
}
\f
/* -*-C-*-
-$Id: purutl.c,v 9.44 1993/06/24 06:20:03 gjr Exp $
+$Id: purutl.c,v 9.45 1993/08/22 22:39:05 gjr Exp $
Copyright (c) 1987-1993 Massachusetts Institute of Technology
#endif
where -= (1 + OBJECT_DATUM (*where));
if (where < obj_address)
- {
return (where + 1);
- }
}
return ((SCHEME_OBJECT *) NULL);
}
block = (find_constant_space_block (obj_address));
if (block == ((SCHEME_OBJECT *) NULL))
- {
return (false);
- }
return
((Boolean) (obj_address <= (block + (OBJECT_DATUM (*block)))));
}
PRIMITIVE_HEADER (1);
{
fast SCHEME_OBJECT object = (ARG_REF (1));
- if ((GC_Type_Non_Pointer (object)) ||
- (GC_Type_Special (object)))
+ if ((GC_Type_Non_Pointer (object)) || (GC_Type_Special (object)))
PRIMITIVE_RETURN (SHARP_T);
TOUCH_IN_PRIMITIVE (object, object);
PRIMITIVE_RETURN
*dest++ = (MAKE_OBJECT (CONSTANT_PART, 3));
result = dest;
for (i = nobjects; --i >= 0; )
- {
*dest++ = *source++;
- }
*dest++ = (MAKE_OBJECT (TC_MANIFEST_SPECIAL_NM_VECTOR, 1));
*dest++ = (MAKE_OBJECT (END_OF_BLOCK, nobjects + 5));
Free_Constant = dest;
SET_CONSTANT_TOP ();
- return result;
+ return (result);
+}
+\f
+gc_hook_list pre_gc_hooks = ((gc_hook_list) NULL);
+gc_hook_list post_gc_hooks = ((gc_hook_list) NULL);
+
+static int
+DEFUN (add_gc_hook, (cell, hook),
+ gc_hook_list * cell AND void EXFUN ((* hook), (void)))
+{
+ gc_hook_list new = ((gc_hook_list)
+ (malloc (sizeof (struct gc_hook_list_s))));
+ if (new == ((gc_hook_list) NULL))
+ return (-1);
+
+ new->hook = hook;
+ new->next = ((gc_hook_list) NULL);
+
+ while ((* cell) != ((gc_hook_list) NULL))
+ cell = (& ((* cell)->next));
+
+ * cell = new;
+ return (0);
+}
+
+static void
+DEFUN (run_gc_hooks, (gc_hooks), gc_hook_list gc_hooks)
+{
+ while (gc_hooks != ((gc_hook_list) NULL))
+ {
+ (* (gc_hooks->hook)) ();
+ gc_hooks = gc_hooks->next;
+ }
+ return;
+}
+
+int
+DEFUN (add_pre_gc_hook, (hook),
+ void EXFUN ((* hook), (void)))
+{
+ return (add_gc_hook ((& pre_gc_hooks), hook));
+}
+
+int
+DEFUN (add_post_gc_hook, (hook),
+ void EXFUN ((* hook), (void)))
+{
+ return (add_gc_hook ((& post_gc_hooks), hook));
+}
+
+void
+DEFUN_VOID (run_pre_gc_hooks)
+{
+ run_gc_hooks (pre_gc_hooks);
+ return;
+}
+
+void
+DEFUN_VOID (run_post_gc_hooks)
+{
+ run_gc_hooks (post_gc_hooks);
+ return;
}
/* -*-C-*-
-$Id: version.h,v 11.137 1993/08/22 20:25:39 gjr Exp $
+$Id: version.h,v 11.138 1993/08/22 22:39:06 gjr Exp $
Copyright (c) 1988-1993 Massachusetts Institute of Technology
#define VERSION 11
#endif
#ifndef SUBVERSION
-#define SUBVERSION 137
+#define SUBVERSION 138
#endif
/* -*-C-*-
-$Id: version.h,v 11.137 1993/08/22 20:25:39 gjr Exp $
+$Id: version.h,v 11.138 1993/08/22 22:39:06 gjr Exp $
Copyright (c) 1988-1993 Massachusetts Institute of Technology
#define VERSION 11
#endif
#ifndef SUBVERSION
-#define SUBVERSION 137
+#define SUBVERSION 138
#endif