Correct errors in hub class destructor logic

This commit is contained in:
Gregory Nutt 2015-04-23 10:07:53 -06:00
parent ab17603ceb
commit adb50640c0

View File

@ -125,10 +125,6 @@ struct usbhost_hubclass_s
* Private Function Prototypes
****************************************************************************/
/* Memory allocation services */
static inline void usbhost_class_free(FAR struct usbhost_class_s *devclass);
/* Worker thread actions */
static void usbhost_destroy(FAR void *arg);
@ -205,7 +201,7 @@ static struct usbhost_registry_s g_hub =
*
****************************************************************************/
static inline void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
static void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
{
uvdbg("Deactivating: %d\n", hport->port);
@ -269,41 +265,6 @@ static int usbhost_hport_activate(FAR struct usbhost_hubport_s *hport)
return ret;
}
/****************************************************************************
* Name: usbhost_class_free
*
* Description:
* Free a class instance previously allocated by usbhost_create().
*
* Input Parameters:
* devclass - A reference to the class instance to be freed.
*
* Returned Values:
* None
*
****************************************************************************/
static inline void usbhost_class_free(FAR struct usbhost_class_s *devclass)
{
FAR struct usbhost_hubport_s *hport;
DEBUGASSERT(devclass != NULL);
uvdbg("Freeing: %p\n", devclass);
DEBUGASSERT(devclass != NULL && devclass->hport != NULL);
hport = devclass->hport;
/* Detach the class from the hub port */
usbhost_devaddr_destroy(hport);
hport->funcaddr = 0;
/* Free the class instance */
DEBUGASSERT(hport->devclass == devclass);
kmm_free(devclass);
hport->devclass = NULL;
}
/****************************************************************************
* Name: usbhost_destroy
*
@ -325,6 +286,7 @@ static void usbhost_destroy(FAR void *arg)
FAR struct usbhost_class_s *hubclass = (FAR struct usbhost_class_s *)arg;
FAR struct usbhost_hubpriv_s *priv;
FAR struct usbhost_hubport_s *hport;
FAR struct usbhost_hubport_s *child;
int port;
DEBUGASSERT(hubclass != NULL && hubclass->hport != NULL);
@ -347,24 +309,29 @@ static void usbhost_destroy(FAR void *arg)
{
/* Free any devices classes connect on this hub port */
hport = &priv->hport[port];
if (hport->devclass != NULL)
child = &priv->hport[port];
if (child->devclass != NULL)
{
CLASS_DISCONNECTED(hport->devclass);
CLASS_DISCONNECTED(child->devclass);
}
/* Free any resource use by the hub port */
/* Free any resources used by the hub port */
usbhost_hport_deactivate(hport);
usbhost_hport_deactivate(child);
}
/* Destroy the semaphores */
sem_destroy(&priv->exclsem);
/* Free the hub class structure */
/* Deactivate the parent hub port (unless it is the root hub port) */
usbhost_class_free(hubclass);
usbhost_hport_deactivate(hport);
/* Free the class instance */
kmm_free(hubclass);
hport->devclass = NULL;
}
/****************************************************************************