void tvhdhomerun_device_destroy( tvhdhomerun_device_t *hd ) { tvhdhomerun_frontend_t *lfe; lock_assert(&global_lock); gtimer_disarm(&hd->hd_destroy_timer); tvhlog(LOG_INFO, "tvhdhomerun", "Releaseing locks for devices"); while ((lfe = TAILQ_FIRST(&hd->hd_frontends)) != NULL) { tvhdhomerun_frontend_delete(lfe); } #define FREEM(x) free(hd->hd_info.x) FREEM(ip_address); FREEM(friendlyname); FREEM(uuid); FREEM(deviceModel); #undef FREEM tvh_hardware_delete((tvh_hardware_t*)hd); #define FREEM(x) free(hd->x) FREEM(hd_override_type); #undef FREEM free(hd); hdhomerun_debug_destroy(hdhomerun_debug_obj); }
void tvhdhomerun_done ( void ) { tvh_hardware_t *th, *n; tvhdhomerun_discovery_t *d, *nd; pthread_mutex_lock(&global_lock); for (th = LIST_FIRST(&tvh_hardware); th != NULL; th = n) { n = LIST_NEXT(th, th_link); if (idnode_is_instance(&th->th_id, &tvhdhomerun_device_class)) { tvhdhomerun_device_destroy((tvhdhomerun_device_t *)th); } } for (d = TAILQ_FIRST(&tvhdhomerun_discoveries); d != NULL; d = nd) { nd = TAILQ_NEXT(d, disc_link); tvhdhomerun_discovery_destroy(d, 1); } pthread_mutex_unlock(&global_lock); hdhomerun_debug_destroy(hdhomerun_debug_obj); }