(define %poll-sockets (foreign-safe-lambda* int ((scheme-object poll_item_ref) (unsigned-int length) (long timeout)) "zmq_pollitem_t items[length]; zmq_pollitem_t *item_ptrs[length]; int i; for (i = 0; i < length; i++) { C_save(C_fix(i)); item_ptrs[i] = (zmq_pollitem_t *)C_pointer_address(C_callback(poll_item_ref, 1)); } for (i = 0; i < length; i++) { items[i] = *item_ptrs[i]; } int rc = zmq_poll(items, length, timeout); if (rc != -1) { for (i = 0; i < length; i++) { (*item_ptrs[i]).revents = items[i].revents; } } C_return(rc);")) (define (poll poll-items timeout/block) (if (null? poll-items) (error 'poll "null list passed for poll-items") (let ((result (%poll-sockets (lambda (i) (poll-item-pointer (list-ref poll-items i))) ;; <---- HERE it is (length poll-items) (case timeout/block ((#f) 0) ((#t) -1) (else timeout/block))))) (if (= result -1) (zmq-error 'poll) result))))