void mcap_close_mcl(struct mcap_mcl *mcl, gboolean cache) { if (!mcl) return; if (mcl->ctrl & MCAP_CTRL_FREE) { mcap_mcl_release(mcl); return; } if (!cache) mcl->ctrl |= MCAP_CTRL_NOCACHE; if (mcl->cc) { g_io_channel_shutdown(mcl->cc, TRUE, NULL); g_io_channel_unref(mcl->cc); mcl->cc = NULL; mcl->state = MCL_IDLE; } else if ((mcl->ctrl & MCAP_CTRL_CACHED) && (mcl->ctrl & MCAP_CTRL_NOCACHE)) { mcl->ctrl &= ~MCAP_CTRL_CACHED; mcl->mi->cached = g_slist_remove(mcl->mi->cached, mcl); mcap_mcl_release(mcl); mcap_mcl_unref(mcl); } }
static void free_mdl(struct mcap_mdl *mdl) { if (!mdl) return; mcap_mcl_unref(mdl->mcl); g_free(mdl); }
static void unref_mcl(struct health_device *dev) { if (!dev || !dev->mcl) return; mcap_close_mcl(dev->mcl, FALSE); mcap_mcl_unref(dev->mcl); dev->mcl = NULL; }
static void mcap_cache_mcl(struct mcap_mcl *mcl) { GSList *l; struct mcap_mcl *last; int len; if (mcl->ctrl & MCAP_CTRL_CACHED) return; mcl->mi->mcls = g_slist_remove(mcl->mi->mcls, mcl); if (mcl->ctrl & MCAP_CTRL_NOCACHE) { mcl->mi->cached = g_slist_remove(mcl->mi->cached, mcl); mcap_mcl_release(mcl); mcap_mcl_unref(mcl); return; } DBG("Caching MCL"); len = g_slist_length(mcl->mi->cached); if (len == MAX_CACHED) { /* Remove the latest cached mcl */ l = g_slist_last(mcl->mi->cached); last = l->data; mcl->mi->cached = g_slist_remove(mcl->mi->cached, last); last->ctrl &= ~MCAP_CTRL_CACHED; if (last->ctrl & MCAP_CTRL_CONN) { /* We have to release this MCL if */ /* connection is not successful */ last->ctrl |= MCAP_CTRL_FREE; } else { mcap_mcl_release(last); last->mi->mcl_uncached_cb(last, last->mi->user_data); } mcap_mcl_unref(last); } mcl->mi->cached = g_slist_prepend(mcl->mi->cached, mcl); mcl->ctrl |= MCAP_CTRL_CACHED; mcap_mcl_shutdown(mcl); }
static void mcl_connected(struct mcap_mcl *mcap_mcl, gpointer data) { printf("%s\n", __func__); if (mcl) { mcap_sync_stop(mcl); mcap_mcl_unref(mcl); } mcl = mcap_mcl_ref(mcap_mcl); trigger_mdl_action(data_mode); }
static void create_mcl_cb(struct mcap_mcl *mcap_mcl, GError *err, gpointer data) { printf("%s\n", __func__); if (err) { printf("Could not connect MCL: %s\n", err->message); if (!no_close) g_main_loop_quit(mloop); return; } if (mcl) { mcap_sync_stop(mcl); mcap_mcl_unref(mcl); } mcl = mcap_mcl_ref(mcap_mcl); trigger_mdl_action(data_mode); }