usb_shm: correct refcounting
This commit is contained in:
parent
c55b600d9e
commit
a4b6335e57
|
@ -41,10 +41,6 @@ int eismultiplexer_connect(struct eismultiplexer* muliplexer, uint16_t serial)
|
||||||
if(!muliplexer->priv)
|
if(!muliplexer->priv)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = usbshm_init(muliplexer->priv);
|
|
||||||
if(ret)
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
unsigned char serialStr[5];
|
unsigned char serialStr[5];
|
||||||
snprintf((char*)serialStr, sizeof(serialStr), "%04hu", serial);
|
snprintf((char*)serialStr, sizeof(serialStr), "%04hu", serial);
|
||||||
|
|
||||||
|
@ -112,7 +108,7 @@ uint16_t eismultiplexer_read_eeprom(struct eismultiplexer* muliplexer, uint16_t
|
||||||
|
|
||||||
void eismultiplexer_disconnect(struct eismultiplexer* muliplexer)
|
void eismultiplexer_disconnect(struct eismultiplexer* muliplexer)
|
||||||
{
|
{
|
||||||
usbshm_distroy(muliplexer->priv);
|
usbshm_close(muliplexer->priv);
|
||||||
free(muliplexer->priv);
|
free(muliplexer->priv);
|
||||||
muliplexer->priv = NULL;
|
muliplexer->priv = NULL;
|
||||||
}
|
}
|
||||||
|
|
45
usbshm.c
45
usbshm.c
|
@ -44,20 +44,7 @@
|
||||||
static int object_counter = 0;
|
static int object_counter = 0;
|
||||||
static struct libusb_context* context = NULL;
|
static struct libusb_context* context = NULL;
|
||||||
|
|
||||||
void usbshm_distroy(struct usbshm* instance)
|
static int usbshm_init(struct usbshm* instance)
|
||||||
{
|
|
||||||
pthread_mutex_lock(instance->mutex);
|
|
||||||
libusb_close(instance->handle);
|
|
||||||
if(instance->serial)
|
|
||||||
free(instance->serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool usbshm_is_open(struct usbshm* instance)
|
|
||||||
{
|
|
||||||
return instance->handle != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int usbshm_init(struct usbshm* instance)
|
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(object_counter == 0)
|
if(object_counter == 0)
|
||||||
|
@ -76,12 +63,38 @@ int usbshm_init(struct usbshm* instance)
|
||||||
return ret < 0 ? USBSHM_ERROR_ERR : 0;
|
return ret < 0 ? USBSHM_ERROR_ERR : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void usbshm_exit(void)
|
||||||
|
{
|
||||||
|
if(--object_counter == 0)
|
||||||
|
{
|
||||||
|
libusb_exit(context);
|
||||||
|
context = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void usbshm_close(struct usbshm* instance)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(instance->mutex);
|
||||||
|
libusb_close(instance->handle);
|
||||||
|
if(instance->serial)
|
||||||
|
free(instance->serial);
|
||||||
|
usbshm_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool usbshm_is_open(struct usbshm* instance)
|
||||||
|
{
|
||||||
|
return instance->handle != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial)
|
int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial)
|
||||||
{
|
{
|
||||||
if(instance->handle)
|
if(instance->handle)
|
||||||
return USBSHM_ERROR_ALLREADY_CONNECTED;
|
return USBSHM_ERROR_ALLREADY_CONNECTED;
|
||||||
if(!context)
|
|
||||||
return USBSHM_ERROR_NOT_CONNECTED;
|
int ret = usbshm_init(instance);
|
||||||
|
if(ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
pthread_mutex_lock(instance->mutex);
|
pthread_mutex_lock(instance->mutex);
|
||||||
libusb_device** list;
|
libusb_device** list;
|
||||||
int count = libusb_get_device_list(context, &list);
|
int count = libusb_get_device_list(context, &list);
|
||||||
|
|
6
usbshm.h
6
usbshm.h
|
@ -48,12 +48,10 @@ struct usbshm {
|
||||||
pthread_mutex_t* mutex;
|
pthread_mutex_t* mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
void usbshm_distroy(struct usbshm* instance);
|
|
||||||
|
|
||||||
int usbshm_init(struct usbshm* instance);
|
|
||||||
|
|
||||||
int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial);
|
int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsigned char* serial);
|
||||||
|
|
||||||
|
void usbshm_close(struct usbshm* instance);
|
||||||
|
|
||||||
bool usbshm_is_open(struct usbshm* instance);
|
bool usbshm_is_open(struct usbshm* instance);
|
||||||
|
|
||||||
void usbshm_reset(struct usbshm* instance);
|
void usbshm_reset(struct usbshm* instance);
|
||||||
|
|
Loading…
Reference in a new issue