File: shlib.lsp

package info (click to toggle)
xlispstat 3.52.14-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 7,560 kB
  • ctags: 12,676
  • sloc: ansic: 91,357; lisp: 21,759; sh: 1,525; makefile: 521; csh: 1
file content (54 lines) | stat: -rw-r--r-- 1,771 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(defpackage "SHARED-LIBRARY" (:use "XLISP") (:nicknames "SHLIB"))
(in-package "SHARED-LIBRARY")

;;;;
;;;; Data Structure for Library 
;;;;

(defstruct (shared-library
            (:constructor (make-shared-library (name path handle subrs)))
            (:print-function print-shlib))
  name path handle subrs)

(defun print-shlib (shlib stream depth)
  (format stream "#<shared library ~s>" (shared-library-name shlib)))


;;;;
;;;; Public Functions
;;;;

(export '(load-shared-library close-shared-library
          shared-library-information))

(defun load-shared-library (path &optional
                                 (name (pathname-name path))
                                 (version -1)
                                 (oldest version))
  (let ((*package* *package*)
        (handle (shlib-open path))
        (success nil))
    (unwind-protect
        (let* ((init (shlib-symaddr handle (format nil "~a__init" name)))
               (ftab (call-by-address init))
               (subrs (shlib-init ftab version oldest))
               (shlib (make-shared-library name path handle subrs)))
          ;;(register-saver shlib #'close-shared-library)
          (setf success t)
          shlib)
      (unless success (shlib-close handle)))))

(defun close-shared-library (shlib)
  ;;(unregister-saver shlib)
  (dolist (s (shared-library-subrs shlib))
    (clear-subr s))
  (shlib-close (shared-library-handle shlib)))

(defun shared-library-information (path &optional (name (pathname-name path)))
  (let ((*package* *package*)
        (handle (shlib-open path)))
    (unwind-protect
        (let* ((init (shlib-symaddr handle (format nil "~a__init" name)))
               (ftab (call-by-address init)))
          (shlib-info ftab))
      (shlib-close handle))))