-(define-callback source-callback-marshal nil ((callback-id unsigned-int))
- (callback-trampoline #'invoke-callback callback-id 0 nil))
+(define-callback source-callback-marshal boolean ((callback-id unsigned-int))
+ (invoke-source-callback callback-id))
+
+(defun invoke-source-callback (callback-id &rest args)
+ (restart-case (apply (find-user-data callback-id) args)
+ (remove () :report "Exit and remove source callback"
+ nil)
+ (continue () :report "Return from source callback"
+ t)
+ (re-invoke nil :report "Re-invoke source callback"
+ (apply #'invoke-source-callback callback-id args))))
+