diff options
author | Chris Dickens <christopher.a.dickens@gmail.com> | 2015-01-21 00:18:44 -0800 |
---|---|---|
committer | Chris Dickens <christopher.a.dickens@gmail.com> | 2015-01-26 18:57:47 -0800 |
commit | cbbed3c2211406237274d8daf740fa7e6a1c2669 (patch) | |
tree | ceb79a33145ffe49410e6145ba1735294566825b | |
parent | 89f0316d38ec08836027bc88f30caab3768cedc5 (diff) | |
download | libusb-cbbed3c2211406237274d8daf740fa7e6a1c2669.tar.gz |
haiku: Transition to use new transfer completion API
Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
-rw-r--r-- | libusb/os/haiku/haiku_usb.h | 2 | ||||
-rw-r--r-- | libusb/os/haiku/haiku_usb_backend.cpp | 16 | ||||
-rw-r--r-- | libusb/os/haiku/haiku_usb_raw.cpp | 57 | ||||
-rw-r--r-- | libusb/version_nano.h | 2 |
4 files changed, 25 insertions, 52 deletions
diff --git a/libusb/os/haiku/haiku_usb.h b/libusb/os/haiku/haiku_usb.h index 0188191..a053835 100644 --- a/libusb/os/haiku/haiku_usb.h +++ b/libusb/os/haiku/haiku_usb.h @@ -65,7 +65,6 @@ class USBDeviceHandle { public: USBDeviceHandle(USBDevice* dev); virtual ~USBDeviceHandle(); - int EventPipe(int) const; int ClaimInterface(int); int ReleaseInterface(int); int SetConfiguration(int); @@ -79,7 +78,6 @@ private: void TransfersWorker(); USBDevice* fUSBDevice; unsigned int fClaimedInterfaces; - int fEventPipes[2]; BList fTransfers; BLocker fTransfersLock; sem_id fTransfersSem; diff --git a/libusb/os/haiku/haiku_usb_backend.cpp b/libusb/os/haiku/haiku_usb_backend.cpp index 471bda9..3e092fb 100644 --- a/libusb/os/haiku/haiku_usb_backend.cpp +++ b/libusb/os/haiku/haiku_usb_backend.cpp @@ -207,7 +207,7 @@ USBDeviceHandle::TransfersWorker() USBTransfer* fPendingTransfer= (USBTransfer*) fTransfers.RemoveItem((int32)0); fTransfersLock.Unlock(); fPendingTransfer->Do(fRawFD); - write(fEventPipes[1],&fPendingTransfer,sizeof(fPendingTransfer)); + usbi_signal_transfer_completion(fPendingTransfer->UsbiTransfer()); } } @@ -231,7 +231,7 @@ USBDeviceHandle::CancelTransfer(USBTransfer* transfer) fTransfersLock.Unlock(); if(removed) { - write(fEventPipes[1],&transfer,sizeof(transfer)); + usbi_signal_transfer_completion(transfer->UsbiTransfer()); } return LIBUSB_SUCCESS; } @@ -249,8 +249,6 @@ USBDeviceHandle::USBDeviceHandle(USBDevice* dev) usbi_err(NULL,"failed to open device"); return; } - pipe(fEventPipes); - fcntl(fEventPipes[1], F_SETFD, O_NONBLOCK); fTransfersSem = create_sem(0, "Transfers Queue Sem"); fTransfersThread = spawn_thread(TransfersThread,"Transfer Worker",B_NORMAL_PRIORITY, this); resume_thread(fTransfersThread); @@ -266,22 +264,12 @@ USBDeviceHandle::~USBDeviceHandle() if(fClaimedInterfaces&(1<<i)) ReleaseInterface(i); } - if(fEventPipes[1]>0) - close(fEventPipes[1]); - if(fEventPipes[0]>0) - close(fEventPipes[0]); delete_sem(fTransfersSem); if(fTransfersThread>0) wait_for_thread(fTransfersThread, NULL); } int -USBDeviceHandle::EventPipe(int index) const -{ - return fEventPipes[index]; -} - -int USBDeviceHandle::ClaimInterface(int inumber) { int status=fUSBDevice->ClaimInterface(inumber); diff --git a/libusb/os/haiku/haiku_usb_raw.cpp b/libusb/os/haiku/haiku_usb_raw.cpp index eedcacb..a376596 100644 --- a/libusb/os/haiku/haiku_usb_raw.cpp +++ b/libusb/os/haiku/haiku_usb_raw.cpp @@ -59,7 +59,7 @@ haiku_open(struct libusb_device_handle *dev_handle) return LIBUSB_ERROR_NO_DEVICE; } *((USBDeviceHandle**)dev_handle->os_priv)=handle; - return usbi_add_pollfd(HANDLE_CTX(dev_handle),handle->EventPipe(0), POLLIN); + return LIBUSB_SUCCESS; } static void @@ -68,7 +68,6 @@ haiku_close(struct libusb_device_handle *dev_handle) USBDeviceHandle * handle=*((USBDeviceHandle**)dev_handle->os_priv); if(handle==NULL) return; - usbi_remove_pollfd(HANDLE_CTX(dev_handle),handle->EventPipe(0)); delete handle; *((USBDeviceHandle**)dev_handle->os_priv)=NULL; } @@ -167,45 +166,33 @@ haiku_clear_transfer_priv(struct usbi_transfer * itransfer) } static int -haiku_handle_events(struct libusb_context* ctx, struct pollfd* fds, nfds_t nfds, int num_ready) +haiku_handle_transfer_completion(struct usbi_transfer * itransfer) { - USBTransfer *transfer; - for(int i=0;i<nfds && num_ready>0;i++) + USBTransfer* transfer=*((USBTransfer**)usbi_transfer_get_os_priv(itransfer)); + + usbi_mutex_lock(&itransfer->lock); + if(transfer->IsCancelled()) { - struct pollfd *pollfd = &fds[i]; - if(!pollfd->revents) - continue; - - num_ready--; - read(pollfd->fd, &transfer, sizeof(transfer)); - struct usbi_transfer* itransfer=transfer->UsbiTransfer(); - usbi_mutex_lock(&itransfer->lock); - if(transfer->IsCancelled()) - { - delete transfer; - *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL; - usbi_mutex_unlock(&itransfer->lock); - if (itransfer->transferred < 0) - itransfer->transferred = 0; - usbi_handle_transfer_cancellation(transfer->UsbiTransfer()); - continue; - } - libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; - if(itransfer->transferred < 0) - { - usbi_err(ITRANSFER_CTX(itransfer),"error in transfer"); - status = LIBUSB_TRANSFER_ERROR; - itransfer->transferred=0; - } delete transfer; *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL; usbi_mutex_unlock(&itransfer->lock); - usbi_handle_transfer_completion(itransfer,status); + if (itransfer->transferred < 0) + itransfer->transferred = 0; + return usbi_handle_transfer_cancellation(itransfer); } - return LIBUSB_SUCCESS; + libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; + if(itransfer->transferred < 0) + { + usbi_err(ITRANSFER_CTX(itransfer), "error in transfer"); + status = LIBUSB_TRANSFER_ERROR; + itransfer->transferred=0; + } + delete transfer; + *((USBTransfer**)usbi_transfer_get_os_priv(itransfer))=NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); } - static int haiku_clock_gettime(int clkid, struct timespec *tp) { @@ -253,8 +240,8 @@ const struct usbi_os_backend haiku_usb_raw_backend = { /*.cancel_transfer =*/ haiku_cancel_transfer, /*.clear_transfer_priv =*/ haiku_clear_transfer_priv, - /*.handle_events =*/ haiku_handle_events, - /*.handle_transfer_completion =*/ NULL, + /*.handle_events =*/ NULL, + /*.handle_transfer_completion =*/ haiku_handle_transfer_completion, /*.clock_gettime =*/ haiku_clock_gettime, diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 7a69b84..7ffa1dd 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 10957 +#define LIBUSB_NANO 10958 |