[Openmcl-devel] An unfortunate interaction between CFFI and open-shared-library

Ron Garret ron at flownet.com
Sun Sep 19 14:22:04 PDT 2010

I suggest something like this:

(defun open-shared-library (name &optional (process #+darwin-target :initial
                                                    #-darwin-target :current))
  "If the library denoted by name can be loaded by the operating system,
return an object of type SHLIB that describes the library; if the library
is already open, increment a reference count. If the library can't be
loaded, signal a SIMPLE-ERROR which contains an often-cryptic message from
the operating system."
  (if (or (eq process :current)
          (eq process *current-process*)
          (and (eq process :initial)
               (eq *current-process* *initial-process*)))
    (open-shared-library-internal name)
    (multiple-value-bind (result error)
                         (call-in-process (lambda () (ignore-errors
                                                      (open-shared-library name)))
                                          (if (eq process :initial)
      (if error (error error) result))))

Or maybe:

(defmacro safely-call-in-process (fn process)
  `(multiple-value-bind (result error)
                        (call-in-process (lambda () (ignore-errors (funcall ,fn)))
     (if error (error error) result)))

(defun open-shared-library (name &optional (process #+darwin-target :initial
                                                    #-darwin-target :current))
  (if (and (eq process :initial) (not (eq *current-process* *initial-process*)))
    (safely-call-in-process (lambda () (open-shared-library-internal name))
    (open-shared-library-internal name)))


More information about the Openmcl-devel mailing list