From 798ec63b4c12a022d0e96774a13e8a1114263117 Mon Sep 17 00:00:00 2001 From: dtc <dtc> Date: Wed, 19 Nov 1997 02:41:55 +0000 Subject: [PATCH] Add the function set_maybe_gc_pending for the x86 port; called by the GC when it reaches its trigger within pseudo atomic so that maybe_gc is called at the end of pseudo atomic. --- lisp/interrupt.c | 28 ++++++++++++++++++++++------ lisp/interrupt.h | 6 +++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lisp/interrupt.c b/lisp/interrupt.c index a5489e94a..e1fcb7e83 100644 --- a/lisp/interrupt.c +++ b/lisp/interrupt.c @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.9 1997/03/16 15:59:41 pw Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.10 1997/11/19 02:41:54 dtc Exp $ */ /* Interrupt handing magic. */ @@ -349,13 +349,9 @@ static boolean gc_trigger_hit(HANDLER_ARGS) } #endif - +#ifndef i386 boolean interrupt_maybe_gc(HANDLER_ARGS) { -#ifdef __linux__ - GET_CONTEXT -#endif - if (!foreign_function_call_active #ifndef INTERNAL_GC_TRIGGER && gc_trigger_hit(signal, code, context) @@ -388,6 +384,26 @@ boolean interrupt_maybe_gc(HANDLER_ARGS) }else return FALSE; } +#endif + +#ifdef i386 +void set_maybe_gc_pending(void) +{ + maybe_gc_pending = TRUE; + if (pending_signal == 0) { + /* Block all blockable signals */ +#ifdef POSIX_SIGS + sigset_t block; + sigemptyset(&block); + FILLBLOCKSET(&block); + sigprocmask(SIG_BLOCK, &block, &pending_mask); +#else + pending_mask = sigblock(BLOCKABLE); +#endif + } + SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1)); +} +#endif /****************************************************************\ * Noise to install handlers. * diff --git a/lisp/interrupt.h b/lisp/interrupt.h index cb06c86e5..36ed04a39 100644 --- a/lisp/interrupt.h +++ b/lisp/interrupt.h @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.h,v 1.4 1994/10/24 20:06:00 ram Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.h,v 1.5 1997/11/19 02:41:55 dtc Exp $ */ #if !defined(_INCLUDE_INTERRUPT_H_) #define _INCLUDE_INTERRUPT_H_ @@ -14,6 +14,10 @@ union interrupt_handler { void (*c)(HANDLER_ARGS); }; +#ifdef i386 +extern void set_maybe_gc_pending(void); +#endif + extern void interrupt_init(void); extern void fake_foreign_function_call(struct sigcontext *context); extern void undo_fake_foreign_function_call(struct sigcontext *context); -- GitLab