X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Flinkage-table.lisp;h=3ccfb4c1d6fdcd15871416edd4971cb1c1f0bf5b;hb=8d490a4d6b9d7f156cf503826b3e3195e6f3ad39;hp=49bf3ba82e3be7c9f3a70e9cbbf8804140c20068;hpb=75b52379bdc2269961af6a1308eca63610f38ac3;p=sbcl.git diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 49bf3ba..3ccfb4c 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -19,10 +19,7 @@ (in-package "SB!IMPL") -;;; Used to serialize modifications to *linkage-info* and the linkage-table -;;; proper. Calls thru linkage-table are unaffected. -(defvar *linkage-table-lock* - (sb!thread:make-mutex :name "linkage-table lock")) +(defvar *foreign-lock*) ; initialized in foreign-load.lisp (define-alien-routine arch-write-linkage-table-jmp void (table-address system-area-pointer) @@ -51,45 +48,38 @@ (let ((table-address (+ (* (hash-table-count *linkage-info*) sb!vm:linkage-table-entry-size) sb!vm:linkage-table-space-start)) - (real-address (get-dynamic-foreign-symbol-address name))) - (when real-address - (unless (< table-address sb!vm:linkage-table-space-end) - (error "Linkage-table full (~D entries): cannot link ~S." - (hash-table-count *linkage-info*) - name)) - (write-linkage-table-entry table-address real-address datap) - (setf (gethash name *linkage-info*) - (make-linkage-info :address table-address :datap datap))))) + (real-address (get-dynamic-foreign-symbol-address name datap))) + (aver real-address) + (unless (< table-address sb!vm:linkage-table-space-end) + (error "Linkage-table full (~D entries): cannot link ~S." + (hash-table-count *linkage-info*) + name)) + (write-linkage-table-entry table-address real-address datap) + (setf (gethash name *linkage-info*) + (make-linkage-info :address table-address :datap datap)))) ;;; Add a foreign linkage entry if none exists, return the address ;;; in the linkage table. (defun ensure-foreign-symbol-linkage (name datap) (/show0 "ensure-foreign-symbol-linkage") - (sb!thread:with-mutex (*linkage-table-lock*) + (sb!thread:with-mutex (*foreign-lock*) (let ((info (or (gethash name *linkage-info*) (link-foreign-symbol name datap)))) (when info (linkage-info-address info))))) -;;; Initialize the linkage-table. Called during initialization after -;;; all shared libraries have been reopened. -(defun linkage-table-reinit () - (/show0 "linkage-table-reinit") - ;; No locking here, as this should be done just once per image initialization, - ;; before any threads user are spawned. +;;; Update the linkage-table. Called during initialization after all +;;; shared libraries have been reopened, and after a previously loaded +;;; shared object is reloaded. +(defun update-linkage-table () + ;; Doesn't take care of it's own locking -- callers are responsible (maphash (lambda (name info) - (let ((datap (linkage-info-datap info)) - (table-address (linkage-info-address info)) - (real-address (get-dynamic-foreign-symbol-address name))) - (cond (real-address - (write-linkage-table-entry table-address - real-address - datap)) - (t - (/show0 "oops") - (cerror "Ignore. Attempts to access this foreign symbol ~ - will lead to badness characterized by ~ - segfaults, and potential corruption." - "Could not resolve foreign function ~S for ~ - linkage-table." name))))) - *linkage-info*)) + (let* ((datap (linkage-info-datap info)) + (table-address (linkage-info-address info)) + (real-address + (get-dynamic-foreign-symbol-address name datap))) + (aver (and table-address real-address)) + (write-linkage-table-entry table-address + real-address + datap))) + *linkage-info*))