]> sigrok.org Git - libsigrok.git/blobdiff - session.c
Move most contrib/ stuff to libsigrok.
[libsigrok.git] / session.c
index bbcf5bc923172328f5b7be322f7172c3304861aa..caa794a142377ca75953ba032ee53dd08984ba3c 100644 (file)
--- a/session.c
+++ b/session.c
@@ -23,8 +23,8 @@
 #include <unistd.h>
 #include <string.h>
 #include <glib.h>
-#include <sigrok.h>
-#include <sigrok-internal.h>
+#include "sigrok.h"
+#include "sigrok-internal.h"
 
 /* demo.c */
 extern GIOChannel channels[2];
@@ -38,12 +38,12 @@ struct source {
 };
 
 /* There can only be one session at a time. */
+/* 'session' is not static, it's used elsewhere (via 'extern'). */
 struct sr_session *session;
-int num_sources = 0;
-
-struct source *sources = NULL;
-int source_timeout = -1;
+static int num_sources = 0;
 
+static struct source *sources = NULL;
+static int source_timeout = -1;
 
 struct sr_session *sr_session_new(void)
 {
@@ -54,7 +54,6 @@ struct sr_session *sr_session_new(void)
 
 void sr_session_destroy(void)
 {
-
        g_slist_free(session->devices);
 
        /* TODO: Loop over protocol decoders and free them. */
@@ -145,13 +144,13 @@ static void sr_session_run_poll()
                                 * or if the poll timeout out and this source
                                 * asked for that timeout.
                                 */
-                               sources[i].cb(fds[i].fd, fds[i].revents,
-                                                 sources[i].user_data);
+                               if (!sources[i].cb(fds[i].fd, fds[i].revents,
+                                                 sources[i].user_data))
+                                       sr_session_source_remove(sources[i].fd);
                        }
                }
        }
        free(fds);
-
 }
 
 int sr_session_start(void)
@@ -173,7 +172,6 @@ int sr_session_start(void)
 
 void sr_session_run(void)
 {
-
        sr_info("session: running");
        session->running = TRUE;
 
@@ -185,15 +183,12 @@ void sr_session_run(void)
        else
                /* real sources, use g_poll() main loop */
                sr_session_run_poll();
-
 }
 
 void sr_session_halt(void)
 {
-
        sr_info("session: halting");
        session->running = FALSE;
-
 }
 
 void sr_session_stop(void)
@@ -208,7 +203,6 @@ void sr_session_stop(void)
                if (device->plugin && device->plugin->stop_acquisition)
                        device->plugin->stop_acquisition(device->plugin_index, device);
        }
-
 }
 
 static void datafeed_dump(struct sr_datafeed_packet *packet)
@@ -235,7 +229,6 @@ static void datafeed_dump(struct sr_datafeed_packet *packet)
        default:
                sr_dbg("bus: received unknown packet type %d", packet->type);
        }
-
 }
 
 void sr_session_bus(struct sr_device *device, struct sr_datafeed_packet *packet)
@@ -289,7 +282,7 @@ void sr_session_source_remove(int fd)
                return;
 
        new_sources = calloc(1, sizeof(struct source) * num_sources);
-       for (old = 0; old < num_sources; old++)
+       for (old = 0, new = 0; old < num_sources; old++)
                if (sources[old].fd != fd)
                        memcpy(&new_sources[new++], &sources[old],
                               sizeof(struct source));
@@ -303,4 +296,3 @@ void sr_session_source_remove(int fd)
                free(new_sources);
        }
 }
-