1 (defpackage "SHARED-LIBRARY" (:use
"XLISP") (:nicknames
"SHLIB"))
2 (in-package "SHARED-LIBRARY")
5 ;;;; Data Structure for Library
8 (defstruct (shared-library
9 (:constructor
(make-shared-library (name path handle subrs
)))
10 (:print-function print-shlib
))
11 name path handle subrs
)
13 (defun print-shlib (shlib stream depth
)
14 (format stream
"#<shared library ~s>" (shared-library-name shlib
)))
21 (export '(load-shared-library close-shared-library
22 shared-library-information
))
24 (defun load-shared-library (path &optional
25 (name (pathname-name path
))
28 (let ((*package
* *package
*)
29 (handle (shlib-open path
))
32 (let* ((init (shlib-symaddr handle
(format nil
"~a__init" name
)))
33 (ftab (call-by-address init
))
34 (subrs (shlib-init ftab version oldest
))
35 (shlib (make-shared-library name path handle subrs
)))
36 ;;(register-saver shlib #'close-shared-library)
39 (unless success
(shlib-close handle
)))))
41 (defun close-shared-library (shlib)
42 ;;(unregister-saver shlib)
43 (dolist (s (shared-library-subrs shlib
))
45 (shlib-close (shared-library-handle shlib
)))
47 (defun shared-library-information (path &optional
(name (pathname-name path
)))
48 (let ((*package
* *package
*)
49 (handle (shlib-open path
)))
51 (let* ((init (shlib-symaddr handle
(format nil
"~a__init" name
)))
52 (ftab (call-by-address init
)))
54 (shlib-close handle
))))