Index: usb.sls ================================================================== --- usb.sls +++ usb.sls @@ -1,9 +1,8 @@ #!chezscheme -(library - (usb) +(library (usb) (export usb-device-descriptor usb-device usb-device-handle @@ -49,30 +48,43 @@ [product-index unsigned-8] [serial-number-index unsigned-8] [num-configurations unsigned-8] )) - (define-record-type usb-device + (define-record-type (usb-device make-usb-device% usb-device?) (fields (mutable ptr))) (define-record-type usb-device-handle (fields (mutable ptr))) + + (define usb-guardian (make-guardian)) + + (define (make-usb-device ptr) + (usb-guardian ptr) + (make-usb-device% ptr)) (define (usb-device-addr dev) (ftype-pointer-address (usb-device-ptr dev))) (define (usb-device-handle-addr dev) (ftype-pointer-address (usb-device-handle-ptr dev))) - (define usb-guardian (make-guardian)) (define (usb-free-garbage) (let loop ([p (usb-guardian)]) (when p (when (ftype-pointer? p) - ;(printf "freeing memory at ~x\n" p) - (foreign-free (ftype-pointer-address p))) + (printf "freeing memory at ~x\n" p) + (cond [(ftype-pointer? usb-device*-array p) + ; FIXME THIS HANGS IF ENABLED + #;((foreign-procedure "libusb_free_device_list" (void* int) void) + (ftype-pointer-address p) 0)] + [(ftype-pointer? usb-device* p) + ((foreign-procedure "libusb_unref_device" (void*) void) + (ftype-pointer-address p))] + [else + (foreign-free (ftype-pointer-address p))])) (loop (usb-guardian))))) (define (usb-get-device-list) (usb-free-garbage) (let* ([ptr (make-ftype-pointer usb-device*** (foreign-alloc (ftype-sizeof usb-device***)))] @@ -80,14 +92,18 @@ [%g (usb-guardian ptr)] [e (f 0 (ftype-pointer-address ptr))]) (if (< e 0) (error 'usb-get-device-list "error" e)) (let ((devices (ftype-&ref usb-device*** (*) ptr))) + (usb-guardian devices) (let loop ((i 0) (l '())) (if (>= i e) l (loop (fx+ i 1) - (cons (make-usb-device (make-ftype-pointer usb-device* (ftype-ref usb-device*-array (i) devices))) l))))))) + (cons (make-usb-device + (make-ftype-pointer + usb-device* + (ftype-ref usb-device*-array (i) devices))) l))))))) (define (usb-get-device-descriptor dev) (usb-free-garbage) (let* ([ptr (make-ftype-pointer usb-device-descriptor (foreign-alloc (ftype-sizeof usb-device-descriptor)))] @@ -114,13 +130,13 @@ (define usb-log-level-enum (make-enumeration '(none error warning info debug))) (define usb-log-level-index (enum-set-indexer usb-log-level-enum)) (define (usb-log-level-ref index) (list-ref (enum-set->list usb-log-level-enum) index)) - (define (usb-set-debug ctx level) + (define (usb-set-debug level) (let ([e ((foreign-procedure "libusb_set_debug" (void* int) int) - 0 + 0 ; FIXME: ctx NULL, allow multiple contexts? (usb-log-level-index level))]) (when (< e 0) (error 'usb-exit "error" e)) (void))) @@ -158,13 +174,13 @@ (error 'usb-open (usb-strerror e) e)) (make-usb-device-handle (ftype-&ref usb-device-handle** (*) ptr)))) (define-ftype int* (* int)) (define (alloc-int*) - (define ptr (make-ftype-pointer int* (foreign-alloc (ftype-sizeof int*)))) - (usb-guardian ptr) - ptr) + (let ([ptr (make-ftype-pointer int* (foreign-alloc (ftype-sizeof int*)))]) + (usb-guardian ptr) + ptr)) (define (usb-control-transfer handle type request value index data timeout) (assert (and 'usb-control-transfer (usb-device-handle? handle))) (assert (and 'usb-control-transfer (number? type))) (assert (and 'usb-control-transfer (number? request)))