- collect (gvalue-get (sap+ param-values (* n +gvalue-size+))))))
- (let ((result (apply #'invoke-callback callback-id return-type args)))
- (when return-type
- (gvalue-set return-value result)))))
+ for offset from 0 by +gvalue-size+
+ collect (gvalue-peek (pointer+ param-values offset)))))
+ (unwind-protect
+ (multiple-value-bind (result aborted-p)
+ (apply restart-wrapper callback-id nil args)
+ (when (and return-type (not aborted-p))
+ (gvalue-set return-value result)))
+ ;; TODO: this should be made more general, by adding a type
+ ;; method to return invalidating functions.
+ (loop
+ for arg in args
+ when (typep arg 'struct)
+ do (invalidate-instance arg)))))
+
+(defun invoke-signal-handler (callback-id return-type &rest args)
+ (declare (ignore return-type))
+ (let* ((instance (first args))
+ (handler-id (signal-handler-find instance '(:data)
+ 0 0 nil nil callback-id)))
+ (signal-handler-block instance handler-id)
+ (unwind-protect
+ (restart-case (apply #'invoke-callback callback-id nil args)
+ (disconnect () :report "Disconnect and exit signal handler"
+ (when (signal-handler-is-connected-p instance handler-id)
+ (signal-handler-disconnect instance handler-id))
+ (values nil t))))
+ (when (signal-handler-is-connected-p instance handler-id)
+ (signal-handler-unblock instance handler-id))))