[Twisted-Python] libusb-1 file descriptors

Vincent Pelletier plr.vincent at gmail.com
Fri Mar 16 15:56:40 EDT 2012


Hi.

First, sorry for non-threaded reply. I found the thread on gmane while 
googling a bit.

I'll try to explain the design and intended use of python-libusb1 polling 
integration. I lack twisted knowledge to tell how it could be integrated, 
though.

As for the "poller" interface, it's python's select.poll interface.

Basically, libusb needs to be called into explicitly[1] whenever events 
needing some handling occur. It signals those events through a set of poll-
able file descriptors[2]. Alternatively (for OSes which cannot poll arbitrary 
file descriptors), LibUSBContext.getNextTimeout can be used to know for how 
long app can sleep (or do its own business) before next libusb event handling 
time... But that only works when libusb calls (transfer submission, 
synchronous or not) are all done in a single thread, otherwise they might last 
too long.

When several threads can simultaneously wait for events to occur (ex: a poller 
waiting on an asynchronous transfer with long timeout, then in a second thread 
a synchronous call expected to return quickly) a more complex scheme needs to 
be used. See libusb doc for the whole story.
In short, I decided to just write a stand-alone polling thread to support 
multi-thread access, as I couldn't figure a pythonic way of supporting several 
concurrent libusb-oriented pollers: C API relies on a mutable boolean-ish set 
by libusb code, and read by application code. As I try to never expose ctype 
instances to application code, and thought it should be enough to provide 
module user with a "start once, then forget" thread for handling this (much 
easier in python than in C), I went that way.
Besides the functions working with that boolean, I exposed all needed methods 
on LibUSBContext class, so different implementations can be done without 
hacking/working around, and hopefully without using libusb1 module directly 
(except for symbolic constants). I am opened to suggestions on how to expose 
the few missing functions in a pythonic way.

[1] LibUSBContext.handleEvents & co.
[2] LibUSBContext.getPollFDList, LibUSBContext.setPollFDNotifiers

Regards,
-- 
Vincent Pelletier



More information about the Twisted-Python mailing list