Hi Peter,
I don't really see the problem.
Ether kernel had the driver loaded, or there is other app. If there is kernel I detach the kernel driver and the device is claimed. If other app is using the device then I will only try to claim. (Which will fail)
I can only see the "racy" when 2 applications are concurrently trying to claim the device, in which case not even your solution is perfect :-)
Could you please be more specific with the problem?
Md
On Mon, Apr 23, 2012 at 7:11 PM, Peter Stuge peter@stuge.se wrote:
Michal Demin wrote:
Subject: [PATCH 1/2] Detach the device kernel driver when kernel driver loaded.
..
@@ -689,6 +690,15 @@ int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index)
libusb_free_device_list(list, 0);
- if (libusb_kernel_driver_active(dev->devh, 0)) {
- // reattach later
- dev->reattach = 1;
- if (libusb_detach_kernel_driver(dev->devh, 0)) {
- fprintf(stderr, "Error detaching kernel driver \n");
- goto err;
- }
- }
r = libusb_claim_interface(dev->devh, 0); if (r < 0) { fprintf(stderr, "usb_claim_interface error %d\n", r);
This is racy. It's better to call libusb_detach_kernel_driver() when libusb_claim_interface() returns an error.
//Peter