Skip to content
Snippets Groups Projects
Commit 7d824214 authored by Carl Philipp Klemm's avatar Carl Philipp Klemm
Browse files

make usbshm more amenable to threading

parent 33126675
Branches
No related tags found
No related merge requests found
......@@ -104,7 +104,8 @@ int usbshm_init(struct usbshm* instance, void (*dataCallback)(uint8_t request, u
pthread_mutex_init(libusbDataMutex, NULL);
pthread_create(&libusbThread, NULL, &usbshm_libusbPoll, NULL);
}
if(ret == 0) objectCounter++;
if(ret == 0)
objectCounter++;
return ret;
}
......@@ -179,12 +180,17 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsi
bool usbshm_usbshm_isOpen(struct usbshm* instance)
{
return instance->priv->handle != NULL;
pthread_mutex_lock(libusbDataMutex);
bool ret = instance->priv->handle != NULL;
pthread_mutex_unlock(libusbDataMutex);
return ret;
}
void usbshm_reset(struct usbshm* instance)
{
pthread_mutex_lock(libusbDataMutex);
libusb_reset_device(instance->priv->handle);
pthread_mutex_unlock(libusbDataMutex);
}
void usbshm_reopen(struct usbshm* instance)
......@@ -215,7 +221,6 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer,
&usbshm_transferCallBack, instance, 100);
int ret = libusb_submit_transfer(instance->priv->transfer);
pthread_mutex_unlock(libusbDataMutex);
if(ret < 0)
{
free(buffer);
......@@ -223,6 +228,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
instance->priv->transfer = NULL;
if(ret == LIBUSB_ERROR_NO_DEVICE)
usbshm_reopen(instance);
pthread_mutex_unlock(libusbDataMutex);
}
return ret < 0 ? USBSHM_ERROR_ERR : 0;
}
......@@ -245,7 +251,6 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
libusb_fill_control_transfer(instance->priv->transfer, instance->priv->handle, instance->priv->buffer,
&usbshm_transferCallBack, instance, 100);
int ret = libusb_submit_transfer(instance->priv->transfer);
pthread_mutex_unlock(libusbDataMutex);
if(ret < 0)
{
free(instance->priv->buffer);
......@@ -253,6 +258,7 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
instance->priv->transfer = NULL;
if(ret == LIBUSB_ERROR_NO_DEVICE)
usbshm_reopen(instance);
pthread_mutex_unlock(libusbDataMutex);
}
return ret < 0 ? USBSHM_ERROR_ERR : 0;
}
......@@ -274,10 +280,14 @@ static void usbshm_transferCallBack(struct libusb_transfer *transfer)
free(context->priv->buffer);
libusb_free_transfer(context->priv->transfer);
context->priv->transfer = NULL;
pthread_mutex_unlock(libusbDataMutex);
}
int usbshm_readControlTransferSync(struct usbshm* instance, const uint8_t request, const uint16_t wValue, const uint16_t wIndex, uint8_t* buffer, const uint16_t length)
{
return libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
pthread_mutex_lock(libusbDataMutex);
int ret = libusb_control_transfer(instance->priv->handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
request, wValue, wIndex, buffer, length, 2000);
pthread_mutex_unlock(libusbDataMutex);
return ret;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment