From: <me...@us...> - 2005-08-11 14:44:26
|
Update of /cvsroot/sbcl/sbcl/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11137/tests Added Files: gc.impure.lisp Log Message: 0.9.3.41: gc trigger * implementation changes The *NEED-TO-COLLECT-GARBAGE* special is gone. A similar - but per-thread - special: *GC-PENDING* is here. It is set by both gencgc and cheneygc trigger. In threaded builds SIG_STOP_FOR_GC is no longer deferrable by the normal deferral mechanism and rules. It is only deferred in pseudo atomic sections and when *GC-INHIBIT*. There is another per-thread special for this purpose: *STOP-FOR-GC-PENDING*. Whenever *GC-INHI-BIT* is cleared (either by a GC-ON or when exiting a WITHOUT-GCING) the pending gc or the signal handler is run: (when (and (not *gc-inhibit*) (or #!+sb-thread *stop-for-gc-pending* *gc-pending*)) (sb!unix::receive-pending-interrupt)) On the receiving side interrupt_handle_pending is made clever enough not to run pending handlers whose time has not come (i.e. in a WITHOUT-INTERRUPTS it only does gc and leaves the pending handlers alone). * the bugs fixed ** WITHOUT-INTERRUPTS no longer blocks gc from the current or other threads. ** WITHOUT-GCING on the other hand correctly defers gc, be it automatically triggered or explicitly called, and SIG_STOP_FOR_GC. ** GC-{ON,OFF} now work within WITHOUT-GCING, too ** the gc trigger is more reliable as it does not share the interrupt deferral mechanism, most notably sb-sprof does not make triggering gc any harder --- NEW FILE: gc.impure.lisp --- ;;;; gc tests ;;;; This software is part of the SBCL system. See the README file for ;;;; more information. ;;;; ;;;; While most of SBCL is derived from the CMU CL system, the test ;;;; files (like this one) were written from scratch after the fork ;;;; from CMU CL. ;;; ;;;; This software is in the public domain and is provided with ;;;; absoluely no warranty. See the COPYING and CREDITS files for ;;;; more information. (in-package :cl-user) (defparameter *x* ()) (defun cons-madly () (loop repeat 10000 do (setq *x* (make-string 100000)))) ;; check that WITHOUT-INTERRUPTS doesn't block the gc trigger (sb-sys:without-interrupts (cons-madly)) ;; check that WITHOUT-INTERRUPTS doesn't block SIG_STOP_FOR_GC #+sb-thread (sb-sys:without-interrupts (let ((thread (sb-thread:make-thread (lambda () (sb-ext:gc))))) (loop while (sb-thread:thread-alive-p thread)))) (let ((gc-happend nil)) (push (lambda () (setq gc-happend t)) sb-ext:*after-gc-hooks*) ;; check GC-{ON,OFF} works and gc is deferred (gc-off) (gc) (assert (not gc-happend)) (gc-on) (assert gc-happend) ;; check that WITHOUT-GCING defers explicit gc (setq gc-happend nil) (sb-sys:without-gcing (gc) (assert (not gc-happend))) (assert gc-happend) ;; check that WITHOUT-GCING defers SIG_STOP_FOR_GC #+sb-thread (let ((in-without-gcing nil)) (setq gc-happend nil) (sb-thread:make-thread (lambda () (loop while (not in-without-gcing)) (sb-ext:gc))) (sb-sys:without-gcing (setq in-without-gcing t) (sleep 3) (assert (not gc-happend))) ;; give the hook time to run (sleep 1) (assert gc-happend)) ;; check GC-ON works even in a WITHOUT-GCING (setq gc-happend nil) (sb-sys:without-gcing (gc) (assert (not gc-happend)) (gc-on) (assert gc-happend) (setq gc-happend nil)) (assert (not gc-happend))) (sb-ext:quit :unix-status 104) |