X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=5723610ff8da923c3c4f2e5a1cbcca6e2c7cdb40;hb=7b870c38e3040fec1165a623ae3986e4fb342218;hp=23e4e49559739d74740ab2b1aacdd74998f1b6d5;hpb=e8d3d6c84378481b5c0b53236e2fb09288e211b1;p=libsigrok.git diff --git a/session.c b/session.c index 23e4e495..5723610f 100644 --- a/session.c +++ b/session.c @@ -25,6 +25,14 @@ #include "libsigrok.h" #include "libsigrok-internal.h" +/** + * @defgroup grp_session Session handling + * + * Creating, using, or destroying libsigrok sessions. + * + * @{ + */ + struct source { int timeout; sr_receive_data_callback_t cb; @@ -205,27 +213,25 @@ SR_API int sr_session_datafeed_callback_add(sr_datafeed_callback_t cb) return SR_OK; } -/** - * TODO. - */ static int sr_session_run_poll(void) { unsigned int i; int ret; - while (session->running) { - ret = g_poll(session->pollfds, session->num_sources, session->source_timeout); - + while (session->num_sources > 0) { + ret = g_poll(session->pollfds, session->num_sources, + session->source_timeout); for (i = 0; i < session->num_sources; i++) { if (session->pollfds[i].revents > 0 || (ret == 0 && session->source_timeout == session->sources[i].timeout)) { /* * Invoke the source's callback on an event, - * or if the poll timeout out and this source + * or if the poll timed out and this source * asked for that timeout. */ - if (!session->sources[i].cb(session->pollfds[i].fd, session->pollfds[i].revents, - session->sources[i].cb_data)) + if (!session->sources[i].cb(session->pollfds[i].fd, + session->pollfds[i].revents, + session->sources[i].cb_data)) sr_session_source_remove(session->sources[i].poll_object); } } @@ -298,12 +304,11 @@ SR_API int sr_session_run(void) } sr_info("session: running"); - session->running = TRUE; /* Do we have real sources? */ if (session->num_sources == 1 && session->pollfds[0].fd == -1) { /* Dummy source, freewheel over it. */ - while (session->running) + while (session->num_sources) session->sources[0].cb(-1, 0, session->sources[0].cb_data); } else { /* Real sources, use g_poll() main loop. */ @@ -346,7 +351,6 @@ SR_API int sr_session_stop(void) } sr_info("session: stopping"); - session->running = FALSE; for (l = session->devs; l; l = l->next) { sdi = l->data; @@ -385,7 +389,7 @@ static void datafeed_dump(struct sr_datafeed_packet *packet) sr_dbg("bus: received SR_DF_LOGIC %" PRIu64 " bytes", logic->length); break; case SR_DF_META_ANALOG: - sr_dbg("bus: received SR_DF_META_LOGIC"); + sr_dbg("bus: received SR_DF_META_ANALOG"); break; case SR_DF_ANALOG: analog = packet->payload; @@ -416,6 +420,8 @@ static void datafeed_dump(struct sr_datafeed_packet *packet) * @param packet The datafeed packet to send to the session bus. * * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments. + * + * @private */ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, struct sr_datafeed_packet *packet) @@ -654,3 +660,5 @@ SR_API int sr_session_source_remove_channel(GIOChannel *channel) { return _sr_session_source_remove((gintptr)channel); } + +/** @} */