summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Dickens <christopher.a.dickens@gmail.com>2015-01-21 00:18:44 -0800
committerChris Dickens <christopher.a.dickens@gmail.com>2015-01-26 18:57:47 -0800
commitcbbed3c2211406237274d8daf740fa7e6a1c2669 (patch)
treeceb79a33145ffe49410e6145ba1735294566825b
parent89f0316d38ec08836027bc88f30caab3768cedc5 (diff)
downloadlibusb-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.h2
-rw-r--r--libusb/os/haiku/haiku_usb_backend.cpp16
-rw-r--r--libusb/os/haiku/haiku_usb_raw.cpp57
-rw-r--r--libusb/version_nano.h2
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