X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fload.lisp;h=1b552ae0dba8b6d917aafbc8f0450bae2e24b286;hb=c10e4afc31e25003cc2500803ceb7589232e7f6b;hp=c04b5f9d3452f1adc17888ff18739802617565cb;hpb=08671cc8f003e0b1f9879635fa950c78f7bf40fe;p=sbcl.git diff --git a/src/code/load.lisp b/src/code/load.lisp index c04b5f9..1b552ae 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -16,6 +16,12 @@ (in-package "SB!FASL") +;;;; There looks to be an exciting amount of state being modified +;;;; here: certainly enough that I (dan, 2003.1.22) don't want to mess +;;;; around deciding how to thread-safetify it. So we use a Big Lock. +;;;; Because this code is mutually recursive with the compiler, we use +;;;; the *big-compiler-lock* + ;;;; miscellaneous load utilities ;;; Output the current number of semicolons after a fresh-line. @@ -327,25 +333,21 @@ (when (zerop (file-length stream)) (error "attempt to load an empty FASL file:~% ~S" (namestring stream))) (maybe-announce-load stream verbose) - (let* ((*fasl-input-stream* stream) - (*current-fop-table* (or (pop *free-fop-tables*) (make-array 1000))) - (*current-fop-table-size* (length *current-fop-table*)) - (*fop-stack-pointer-on-entry* *fop-stack-pointer*)) - (unwind-protect - ;; FIXME: This should probably become - ;; (LOOP WHILE (LOAD-FASL-GROUP-STREAM)) - ;; but as a LOOP newbie I don't want to do that until I can - ;; test it. - (do ((loaded-group (load-fasl-group stream) (load-fasl-group stream))) - ((not loaded-group))) - (setq *fop-stack-pointer* *fop-stack-pointer-on-entry*) - (push *current-fop-table* *free-fop-tables*) - ;; NIL out the stack and table, so that we don't hold onto garbage. - ;; - ;; FIXME: Couldn't we just get rid of the free fop table pool so - ;; that some of this NILing out would go away? - (fill *fop-stack* nil :end *fop-stack-pointer-on-entry*) - (fill *current-fop-table* nil))) + (sb!thread:with-recursive-lock (sb!c::*big-compiler-lock*) + (let* ((*fasl-input-stream* stream) + (*current-fop-table* (or (pop *free-fop-tables*) (make-array 1000))) + (*current-fop-table-size* (length *current-fop-table*)) + (*fop-stack-pointer-on-entry* *fop-stack-pointer*)) + (unwind-protect + (loop while (load-fasl-group stream)) + (setq *fop-stack-pointer* *fop-stack-pointer-on-entry*) + (push *current-fop-table* *free-fop-tables*) + ;; NIL out the stack and table, so that we don't hold onto garbage. + ;; + ;; FIXME: Couldn't we just get rid of the free fop table pool so + ;; that some of this NILing out would go away? + (fill *fop-stack* nil :end *fop-stack-pointer-on-entry*) + (fill *current-fop-table* nil)))) t) ;;; This is used in in target-load and also genesis, using @@ -353,15 +355,14 @@ ;;; code for foreign symbol lookup should be here. (defun find-foreign-symbol-in-table (name table) (let ((prefixes - #!+(or linux freebsd) #("" "ldso_stub__") - #!+openbsd #("" "_"))) + #!+(or osf1 sunos linux freebsd) #("" "ldso_stub__") + #!+openbsd #(""))) (declare (notinline some)) ; to suppress bug 117 bogowarning (some (lambda (prefix) (gethash (concatenate 'string prefix name) table nil)) prefixes))) - ;;;; stuff for debugging/tuning by collecting statistics on FOPs (?)