26 #include "sigrok-internal.h"
42 static int num_sources = 0;
44 static struct source *sources = NULL;
45 static int source_timeout = -1;
57 if (!(session = g_try_malloc0(
sizeof(
struct sr_session)))) {
58 sr_err(
"session: %s: session malloc failed", __func__);
75 sr_err(
"session: %s: session was NULL", __func__);
79 g_slist_free(session->
devs);
103 sr_err(
"session: %s: session was NULL", __func__);
107 g_slist_free(session->
devs);
108 session->
devs = NULL;
126 sr_err(
"session: %s: dev was NULL", __func__);
131 sr_err(
"session: %s: session was NULL", __func__);
137 sr_dbg(
"session: %s: dev->driver was NULL, this seems to be "
138 "a virtual device; continuing", __func__);
140 session->
devs = g_slist_append(session->
devs, dev);
146 sr_err(
"session: %s: dev->driver->dev_open was NULL",
152 sr_err(
"session: %s: dev_open failed (%d)", __func__, ret);
156 session->
devs = g_slist_append(session->
devs, dev);
169 sr_err(
"session: %s: session was NULL", __func__);
190 sr_err(
"session: %s: session was NULL", __func__);
195 sr_err(
"session: %s: cb was NULL", __func__);
208 static int sr_session_run_poll(
void)
210 GPollFD *fds, my_gpollfd;
219 if (!(fds = g_try_malloc(
sizeof(GPollFD) * num_sources))) {
220 sr_err(
"session: %s: fds malloc failed", __func__);
223 for (i = 0; i < num_sources; i++) {
225 g_io_channel_win32_make_pollfd(&
channels[0],
226 sources[i].events, &my_gpollfd);
228 my_gpollfd.fd = sources[i].
fd;
229 my_gpollfd.events = sources[i].
events;
234 ret = g_poll(fds, num_sources, source_timeout);
236 for (i = 0; i < num_sources; i++) {
237 if (fds[i].revents > 0 || (ret == 0
238 && source_timeout == sources[i].timeout)) {
244 if (!sources[i].cb(fds[i].fd, fds[i].revents,
269 sr_err(
"session: %s: session was NULL; a session must be "
270 "created first, before starting it.", __func__);
274 if (!session->
devs) {
276 sr_err(
"session: %s: session->devs was NULL; a session "
277 "cannot be started without devices.", __func__);
285 for (l = session->
devs; l; l = l->next) {
290 sr_err(
"session: %s: could not start an acquisition "
291 "(%d)", __func__, ret);
311 sr_err(
"session: %s: session was NULL; a session must be "
312 "created first, before running it.", __func__);
316 if (!session->
devs) {
318 sr_err(
"session: %s: session->devs was NULL; a session "
319 "cannot be run without devices.", __func__);
327 if (num_sources == 1 && sources[0].fd == -1) {
330 sources[0].
cb(-1, 0, sources[0].cb_data);
333 sr_session_run_poll();
350 sr_err(
"session: %s: session was NULL", __func__);
374 sr_err(
"session: %s: session was NULL", __func__);
381 for (l = session->
devs; l; l = l->next) {
404 switch (packet->
type) {
406 sr_dbg(
"bus: received SR_DF_HEADER");
409 sr_dbg(
"bus: received SR_DF_TRIGGER");
414 sr_dbg(
"bus: received SR_DF_LOGIC %" PRIu64
" bytes", logic->
length);
417 sr_dbg(
"bus: received SR_DF_END");
420 sr_dbg(
"bus: received unknown packet type %d", packet->
type);
442 sr_err(
"session: %s: dev was NULL", __func__);
447 sr_err(
"session: %s: packet was NULL", __func__);
453 datafeed_dump(packet);
479 struct source *new_sources, *s;
482 sr_err(
"session: %s: cb was NULL", __func__);
488 new_sources = g_try_malloc0(
sizeof(
struct source) * (num_sources + 1));
490 sr_err(
"session: %s: new_sources malloc failed", __func__);
495 memcpy(new_sources, sources,
496 sizeof(
struct source) * num_sources);
500 s = &new_sources[num_sources++];
506 sources = new_sources;
508 if (timeout != source_timeout && timeout > 0
509 && (source_timeout == -1 || timeout < source_timeout))
528 struct source *new_sources;
532 sr_err(
"session: %s: sources was NULL", __func__);
538 new_sources = g_try_malloc0(
sizeof(
struct source) * num_sources);
540 sr_err(
"session: %s: new_sources malloc failed", __func__);
544 for (old = 0,
new = 0; old < num_sources; old++) {
545 if (sources[old].fd != fd)
546 memcpy(&new_sources[
new++], &sources[old],
552 sources = new_sources;