X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=session.c;h=b1e3ebbbe8b1debde4f86a220b96c4e72f91c5da;hb=8c0152f29b7892bb3f131e92c55ecd60a29ece5a;hp=9818ee25eef965f6647bd48219d659602a120377;hpb=de4d3f99d9e76c5a51916d3bcfef89423055d43f;p=libsigrok.git diff --git a/session.c b/session.c index 9818ee25..b1e3ebbb 100644 --- a/session.c +++ b/session.c @@ -88,7 +88,7 @@ SR_API int sr_session_destroy(void) static void sr_dev_close(struct sr_dev_inst *sdi) { - if (sdi->driver->dev_close) + if (sdi->driver && sdi->driver->dev_close) sdi->driver->dev_close(sdi); } @@ -205,27 +205,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 +296,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 +343,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; @@ -456,14 +452,15 @@ static int _sr_session_source_add(GPollFD *pollfd, int timeout, /* Note: cb_data can be NULL, that's not a bug. */ - new_pollfds = g_try_realloc(session->pollfds, sizeof(GPollFD) * (session->num_sources + 1)); + new_pollfds = g_try_realloc(session->pollfds, + sizeof(GPollFD) * (session->num_sources + 1)); if (!new_pollfds) { sr_err("session: %s: new_pollfds malloc failed", __func__); return SR_ERR_MALLOC; } new_sources = g_try_realloc(session->sources, sizeof(struct source) * - (session->num_sources + 1)); + (session->num_sources + 1)); if (!new_sources) { sr_err("session: %s: new_sources malloc failed", __func__); return SR_ERR_MALLOC;