usb_shm: correct refcounting
This commit is contained in:
parent
c55b600d9e
commit
a4b6335e57
|
@ -40,10 +40,6 @@ int eismultiplexer_connect(struct eismultiplexer* muliplexer, uint16_t serial)
|
|||
muliplexer->priv = malloc(sizeof(*muliplexer->priv));
|
||||
if(!muliplexer->priv)
|
||||
return -1;
|
||||
|
||||
ret = usbshm_init(muliplexer->priv);
|
||||
if(ret)
|
||||
return -2;
|
||||
|
||||
unsigned char serialStr[5];
|
||||
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)
|
||||
{
|
||||
usbshm_distroy(muliplexer->priv);
|
||||
usbshm_close(muliplexer->priv);
|
||||
free(muliplexer->priv);
|
||||
muliplexer->priv = NULL;
|
||||
}
|
||||
|
|
45
usbshm.c
45
usbshm.c
|
@ -44,20 +44,7 @@
|
|||
static int object_counter = 0;
|
||||
static struct libusb_context* context = NULL;
|
||||
|
||||
void usbshm_distroy(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)
|
||||
static int usbshm_init(struct usbshm* instance)
|
||||
{
|
||||
int ret = 0;
|
||||
if(object_counter == 0)
|
||||
|
@ -76,12 +63,38 @@ int usbshm_init(struct usbshm* instance)
|
|||
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)
|
||||
{
|
||||
if(instance->handle)
|
||||
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);
|
||||
libusb_device** 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;
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
void usbshm_close(struct usbshm* instance);
|
||||
|
||||
bool usbshm_is_open(struct usbshm* instance);
|
||||
|
||||
void usbshm_reset(struct usbshm* instance);
|
||||
|
|
Loading…
Reference in a new issue