]> sigrok.org Git - libsigrok.git/blobdiff - src/session.c
python: Wrap session stop callback
[libsigrok.git] / src / session.c
index 0035a7844f327f6ed0b8172222d9c5cf6b95241c..993d9bdf037430f819e7a1d565ea26095127e82d 100644 (file)
@@ -556,41 +556,38 @@ static int verify_trigger(struct sr_trigger *trigger)
  */
 static int set_main_context(struct sr_session *session)
 {
-       GMainContext *def_context;
+       GMainContext *main_context;
+
+       g_mutex_lock(&session->main_mutex);
 
        /* May happen if sr_session_start() is called a second time
         * while the session is still running.
         */
        if (session->main_context) {
                sr_err("Main context already set.");
+
+               g_mutex_unlock(&session->main_mutex);
                return SR_ERR;
        }
-
-       g_mutex_lock(&session->main_mutex);
-
-       def_context = g_main_context_get_thread_default();
-
-       if (!def_context)
-               def_context = g_main_context_default();
+       main_context = g_main_context_ref_thread_default();
        /*
         * Try to use an existing main context if possible, but only if we
         * can make it owned by the current thread. Otherwise, create our
         * own main context so that event source callbacks can execute in
         * the session thread.
         */
-       if (g_main_context_acquire(def_context)) {
-               g_main_context_release(def_context);
+       if (g_main_context_acquire(main_context)) {
+               g_main_context_release(main_context);
 
                sr_dbg("Using thread-default main context.");
-
-               session->main_context = def_context;
-               session->main_context_is_default = TRUE;
        } else {
-               sr_dbg("Creating our own main context.");
+               g_main_context_unref(main_context);
 
-               session->main_context = g_main_context_new();
-               session->main_context_is_default = FALSE;
+               sr_dbg("Creating our own main context.");
+               main_context = g_main_context_new();
        }
+       session->main_context = main_context;
+
        g_mutex_unlock(&session->main_mutex);
 
        return SR_OK;
@@ -611,9 +608,7 @@ static int unset_main_context(struct sr_session *session)
        g_mutex_lock(&session->main_mutex);
 
        if (session->main_context) {
-               if (!session->main_context_is_default)
-                       g_main_context_unref(session->main_context);
-
+               g_main_context_unref(session->main_context);
                session->main_context = NULL;
                ret = SR_OK;
        } else {
@@ -1137,10 +1132,13 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
  * @param session The session to use. Must not be NULL.
  * @param key The key which identifies the event source.
  * @param source An event source object. Must not be NULL.
+ *
  * @retval SR_OK Success.
  * @retval SR_ERR_ARG Invalid argument.
  * @retval SR_ERR_BUG Event source with @a key already installed.
  * @retval SR_ERR Other error.
+ *
+ * @private
  */
 SR_PRIV int sr_session_source_add_internal(struct sr_session *session,
                void *key, GSource *source)
@@ -1197,8 +1195,9 @@ SR_PRIV int sr_session_fd_source_add(struct sr_session *session,
  * @retval SR_ERR_ARG Invalid argument.
  *
  * @since 0.3.0
+ * @private
  */
-SR_API int sr_session_source_add(struct sr_session *session, int fd,
+SR_PRIV int sr_session_source_add(struct sr_session *session, int fd,
                int events, int timeout, sr_receive_data_callback cb, void *cb_data)
 {
        if (fd < 0 && timeout < 0) {
@@ -1223,8 +1222,9 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd,
  * @retval SR_ERR_ARG Invalid argument.
  *
  * @since 0.3.0
+ * @private
  */
-SR_API int sr_session_source_add_pollfd(struct sr_session *session,
+SR_PRIV int sr_session_source_add_pollfd(struct sr_session *session,
                GPollFD *pollfd, int timeout, sr_receive_data_callback cb,
                void *cb_data)
 {
@@ -1251,8 +1251,9 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session,
  * @retval SR_ERR_ARG Invalid argument.
  *
  * @since 0.3.0
+ * @private
  */
-SR_API int sr_session_source_add_channel(struct sr_session *session,
+SR_PRIV int sr_session_source_add_channel(struct sr_session *session,
                GIOChannel *channel, int events, int timeout,
                sr_receive_data_callback cb, void *cb_data)
 {
@@ -1283,6 +1284,8 @@ SR_API int sr_session_source_add_channel(struct sr_session *session,
  *
  * @retval SR_OK Success
  * @retval SR_ERR_BUG No event source for poll_object found.
+ *
+ * @private
  */
 SR_PRIV int sr_session_source_remove_internal(struct sr_session *session,
                void *key)
@@ -1314,8 +1317,9 @@ SR_PRIV int sr_session_source_remove_internal(struct sr_session *session,
  * @retval SR_ERR_BUG Internal error.
  *
  * @since 0.3.0
+ * @private
  */
-SR_API int sr_session_source_remove(struct sr_session *session, int fd)
+SR_PRIV int sr_session_source_remove(struct sr_session *session, int fd)
 {
        return sr_session_source_remove_internal(session, GINT_TO_POINTER(fd));
 }
@@ -1331,8 +1335,9 @@ SR_API int sr_session_source_remove(struct sr_session *session, int fd)
  *         internal errors.
  *
  * @since 0.2.0
+ * @private
  */
-SR_API int sr_session_source_remove_pollfd(struct sr_session *session,
+SR_PRIV int sr_session_source_remove_pollfd(struct sr_session *session,
                GPollFD *pollfd)
 {
        if (!pollfd) {
@@ -1353,8 +1358,9 @@ SR_API int sr_session_source_remove_pollfd(struct sr_session *session,
  * @return SR_ERR_BUG Internal error.
  *
  * @since 0.2.0
+ * @private
  */
-SR_API int sr_session_source_remove_channel(struct sr_session *session,
+SR_PRIV int sr_session_source_remove_channel(struct sr_session *session,
                GIOChannel *channel)
 {
        if (!channel) {
@@ -1375,6 +1381,8 @@ SR_API int sr_session_source_remove_channel(struct sr_session *session,
  * @retval SR_OK Success.
  * @retval SR_ERR_BUG Event source for @a key does not match @a source.
  * @retval SR_ERR Other error.
+ *
+ * @private
  */
 SR_PRIV int sr_session_source_destroyed(struct sr_session *session,
                void *key, GSource *source)