X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fforeign-load.lisp;h=185d95849f6f3220414124350dc7e74acf327620;hb=0338d1fc97a74b8ff332821ea275120b9de951c1;hp=dc39be2debb042fd9cce80172e77988653b95dbf;hpb=8eee0d3a30bf39d9f201acff28c92059fe6c3e4e;p=sbcl.git diff --git a/src/code/foreign-load.lisp b/src/code/foreign-load.lisp index dc39be2..185d958 100644 --- a/src/code/foreign-load.lisp +++ b/src/code/foreign-load.lisp @@ -25,9 +25,8 @@ "~S is unsupported as of SBCL 0.8.13. Please use LOAD-SHARED-OBJECT." (load-1-foreign)) -#!-win32 (progn - (define-alien-variable undefined-alien-address unsigned-long) + (define-alien-variable undefined-alien-address unsigned) (defvar *runtime-dlhandle*)) (defvar *shared-objects*) @@ -76,6 +75,14 @@ will be signalled when the core is saved -- this is orthogonal from DONT-SAVE." (setf (shared-object-dont-save obj) dont-save) ;; FIXME: Why doesn's dlopen-or-lose on already loaded stuff work on ;; Windows? + ;; + ;; Kovalenko 2010-11-24: It would work, but it does nothing + ;; useful on Windows: library reference count is increased + ;; after each LoadLibrary, making it harder to unload it, and + ;; that's all the effect. Also, equal pathnames on Windows + ;; always designate _exactly the same library image_; Unix + ;; tricks like deleting an open library and replacing it with + ;; another version just don't work here. #!-win32 (dlopen-or-lose obj) #!+win32 @@ -86,7 +93,13 @@ will be signalled when the core is saved -- this is orthogonal from DONT-SAVE." ;; FIXME: Why doesn't the linkage table work on Windows? (Or maybe it ;; does and this can be just #!+linkage-table?) Note: remember to change ;; FOREIGN-DEINIT as well then! - #!+(and linkage-table (not win32)) + ;; + ;; Kovalenko 2010-11-24: I think so. Alien _data_ references + ;; are the only thing on win32 that is even slightly + ;; problematic. Handle function references in the same way as + ;; other linkage-table platforms is easy. + ;; + #!+linkage-table (when (or old (undefined-foreign-symbols-p)) (update-linkage-table)))) pathname)) @@ -105,7 +118,7 @@ Experimental." (when old #!-hpux (dlclose-or-lose old) (setf *shared-objects* (remove old *shared-objects*)) - #!+(and linkage-table (not win32)) + #!+linkage-table (update-linkage-table)))))) (defun try-reopen-shared-object (obj) @@ -141,7 +154,6 @@ Experimental." ;;; initialization. (defun reopen-shared-objects () ;; Ensure that the runtime is open - #!-win32 (setf *runtime-dlhandle* (dlopen-or-lose)) ;; Reopen stuff. (setf *shared-objects* @@ -156,7 +168,7 @@ Experimental." (unless (shared-object-dont-save obj) (push obj saved))) (setf *shared-objects* saved)) - #!-(or win32 hpux) + #!-hpux (dlclose-or-lose)) (let ((symbols (make-hash-table :test #'equal)) @@ -169,10 +181,10 @@ error is immediately signalled if the symbol isn't found. The returned address is never in the linkage-table." (declare (ignorable datap)) (let ((addr (find-dynamic-foreign-symbol-address symbol))) - (cond #!-(and linkage-table (not win32)) + (cond #!-linkage-table ((not addr) (error 'undefined-alien-error :name symbol)) - #!+(and linkage-table (not win32)) + #!+linkage-table ((not addr) (style-warn 'sb!kernel:undefined-alien-style-warning :symbol symbol) @@ -191,5 +203,7 @@ is never in the linkage-table." (plusp (hash-table-count symbols))) (defun list-dynamic-foreign-symbols () (loop for symbol being each hash-key in symbols - collect symbol))) - + collect symbol)) + (defun list-undefined-foreign-symbols () + (loop for symbol being each hash-key in undefineds + collect symbol)))