/** * Destroy the current session. * * This frees up all memory used by the session. * * @return SR_OK upon success, SR_ERR_BUG if no session exists. */ SR_API int sr_session_destroy(void) { if (!session) { sr_err("%s: session was NULL", __func__); return SR_ERR_BUG; } sr_session_dev_remove_all(); sr_session_datafeed_callback_remove_all(); if (session->sources) { g_free(session->sources); session->sources = NULL; } if (session->pollfds) { g_free(session->pollfds); session->pollfds = NULL; } /* TODO: Error checks needed? */ // g_mutex_clear(&session->stop_mutex); g_free(session); session = NULL; return SR_OK; }
/** * Destroy the current session. * * This frees up all memory used by the session. * * @return SR_OK upon success, SR_ERR_BUG if no session exists. */ SR_API int sr_session_destroy(void) { if (!session) { sr_err("%s: session was NULL", __func__); return SR_ERR_BUG; } sr_session_dev_remove_all(); /* TODO: Error checks needed? */ g_free(session); session = NULL; return SR_OK; }
/** * Destroy the current session. * * This frees up all memory used by the session. * * @return SR_OK upon success, SR_ERR_BUG if no session exists. */ SR_API int sr_session_destroy(void) { if (!session) { sr_err("session: %s: session was NULL", __func__); return SR_ERR_BUG; } sr_session_dev_remove_all(); /* TODO: Error checks needed? */ /* TODO: Loop over protocol decoders and free them. */ g_free(session); session = NULL; return SR_OK; }
/** * Destroy a session. * This frees up all memory used by the session. * * @param session The session to destroy. Must not be NULL. * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * * @since 0.4.0 */ SR_API int sr_session_destroy(struct sr_session *session) { if (!session) { sr_err("%s: session was NULL", __func__); return SR_ERR_ARG; } sr_session_dev_remove_all(session); g_slist_free_full(session->owned_devs, (GDestroyNotify)sr_dev_inst_free); g_hash_table_unref(session->event_sources); g_mutex_clear(&session->main_mutex); g_free(session); return SR_OK; }
static void dev_selected(GtkComboBox *devbox, GObject *parent) { GtkTreeModel *devlist = gtk_combo_box_get_model(devbox); GtkEntry *timesamples = g_object_get_data(parent, "timesamples"); GtkComboBox *timeunit = g_object_get_data(parent, "timeunit"); GtkTreeIter iter; const gchar *name; GtkCheckMenuItem *menuitem; struct sr_dev *dev; if (!gtk_combo_box_get_active_iter(devbox, &iter)) { g_object_set_data(parent, "dev", NULL); return; } gtk_tree_model_get(devlist, &iter, 0, &name, 1, &dev, 2, &menuitem, -1); gtk_check_menu_item_set_active(menuitem, TRUE); sr_session_dev_remove_all(); if (sr_session_dev_add(dev) != SR_OK) { g_critical("Failed to use device."); sr_session_destroy(); dev = NULL; } g_object_set_data(parent, "dev", dev); /* * Grey out the time unless the device is valid, * and it supports sample limiting */ const gboolean limit_samples = dev && sr_driver_hwcap_exists(dev->driver, SR_HWCAP_LIMIT_SAMPLES); gtk_widget_set_sensitive((GtkWidget*)timesamples, limit_samples); gtk_widget_set_sensitive((GtkWidget*)timeunit, limit_samples); }