X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Flinkage-table.lisp;h=61e21b502b9de06a28d3fe9e8070a809d8718c85;hb=71bc8b09fc75083ea4bb2aee954abca1f1e1f214;hp=8380d6d33f3626f1868ea9a5622c8ffb4d5a7c26;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 8380d6d..61e21b5 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -19,8 +19,6 @@ (in-package "SB!IMPL") -(defvar *foreign-lock*) ; initialized in foreign-load.lisp - (define-alien-routine arch-write-linkage-table-jmp void (table-address system-area-pointer) (real-address system-area-pointer)) @@ -29,7 +27,7 @@ (table-address system-area-pointer) (real-address system-area-pointer)) -(defvar *linkage-info* (make-hash-table :test 'equal)) +(defvar *linkage-info* (make-hash-table :test 'equal :synchronized t)) (defstruct linkage-info datap address) @@ -62,7 +60,7 @@ ;;; in the linkage table. (defun ensure-foreign-symbol-linkage (name datap) (/show0 "ensure-foreign-symbol-linkage") - (sb!thread:with-mutex (*foreign-lock*) + (with-locked-system-table (*linkage-info*) (let ((info (or (gethash (cons name datap) *linkage-info*) (link-foreign-symbol name datap)))) (linkage-info-address info)))) @@ -70,16 +68,17 @@ ;;; Update the linkage-table. Called during initialization after all ;;; shared libraries have been reopened, and after a previously loaded ;;; shared object is reloaded. +;;; +;;; FIXME: Should figure out how to write only those entries that need +;;; updating. (defun update-linkage-table () - ;; Doesn't take care of its own locking -- callers are responsible - (maphash (lambda (name-and-datap info) - (let* ((name (car name-and-datap)) - (datap (cdr name-and-datap)) - (table-address (linkage-info-address info)) - (real-address - (ensure-dynamic-foreign-symbol-address name datap))) - (aver (and table-address real-address)) - (write-linkage-table-entry table-address - real-address - datap))) - *linkage-info*)) + (dohash ((name-and-datap info) *linkage-info* :locked t) + (let* ((name (car name-and-datap)) + (datap (cdr name-and-datap)) + (table-address (linkage-info-address info)) + (real-address + (ensure-dynamic-foreign-symbol-address name datap))) + (aver (and table-address real-address)) + (write-linkage-table-entry table-address + real-address + datap))))