/** * Close the node and free memory. * * @param node */ void aura_close(struct aura_node *node) { struct aura_eventloop *loop = aura_eventloop_get_data(node); if (node->tr->close) node->tr->close(node); if (loop) { if (loop->autocreated) aura_eventloop_destroy(loop); else aura_eventloop_del(node); } /* After transport shutdown we need to clean up remaining buffers */ cleanup_buffer_queue(&node->inbound_buffers); cleanup_buffer_queue(&node->outbound_buffers); aura_transport_release(node->tr); /* Check if we have an export table registered and nuke it */ if (node->tbl) aura_etable_destroy(node->tbl); /* Free file descriptors */ if (node->fds) free(node->fds); free(node); slog(6, SLOG_LIVE, "Transport closed"); }
static void susb_close(struct aura_node *node) { struct usb_dev_info *inf = aura_get_transportdata(node); slog(3, SLOG_INFO, "Closing susb transport"); while (inf->cbusy) libusb_handle_events(inf->ctx); if (inf->dev_descr.vendor) free(inf->dev_descr.vendor); if (inf->dev_descr.product) free(inf->dev_descr.product); if (inf->dev_descr.serial) free(inf->dev_descr.serial); libusb_free_transfer(inf->ctransfer); if (inf->handle) libusb_close(inf->handle); /* If we've created etable but have NOT yet activated it * we have to take care and free it ourselves */ if (inf->etbl && node->tbl != inf->etbl) aura_etable_destroy(inf->etbl); libusb_exit(inf->ctx); free(inf); }