2011-05-02 4 views
1

J'écris une application pilotée par les événements en utilisant libevent, et j'ai besoin de faire un transfert USB en utilisant libusb-1.0.Comment utiliser libusb avec libevent?

Je voulais utiliser libusb_get_pollfds pour obtenir une liste de descripteurs de fichiers (en fds) et les ajouter à Libevent comme ceci:

const struct libusb_pollfd **fds = libusb_get_pollfds(device->context); 

const struct libusb_pollfd *it = *fds; 
for(;it != NULL; ++it) { 
    cout << "Adding fd: " << it->fd << ", " << it->events << endl; 
    struct event * ev = event_new(base_, 
     it->fd, it->events | EV_PERSIST, 
     callbacks::libusb_cb, this); 
    event_add(ev, 0); 
    libusb_fds_events.insert(std::make_pair(it->fd, ev)); 
} 

free(fds); 

// (...) 

// And the callback function: 
void callbacks::libusb_cb(evutil_socket_t fd, short what, void *arg) { 
    Server *s = reinterpret_cast<Server*>(arg); 
    libusb_handle_events_timeout(s->device_->context, 0); 
} 

Aussi, j'utiliser libusb_set_pollfd_notifiers pour ajouter/supprimer fds de libusb_fds_events.

Le problème est que j'obtiens beaucoup de fds étranges dans la liste retournée par libusb (par exemple, je reçois plusieurs fois stdin (!) Avec un événement égal à 0).

Est-ce que je l'utilise correctement?

Répondre

3

J'ai trouvé une erreur dans le code. Il aurait dû être:

const struct libusb_pollfd **it = fds; 
for(;*it != NULL; ++it) { 
    cout << "Adding fd: " << (*it)->fd << ", " << (*it)->events << endl; 
    struct event * ev = event_new(base_, 
     (*it)->fd, (*it)->events | EV_PERSIST, 
     callbacks::libusb_cb, this); 
    event_add(ev, 0); 
    libusb_fds_events.insert(std::make_pair((*it)->fd, ev)); 
}