#include <unistd.h>
#include <string.h>
#include <glib.h>
-#include "sigrok.h"
-#include "sigrok-internal.h"
+#include "libsigrok.h"
+#include "libsigrok-internal.h"
/* demo.c. TODO: Should not be global! */
extern SR_PRIV GIOChannel channels[2];
/* Construct g_poll()'s array. */
if (!(fds = g_try_malloc(sizeof(GPollFD) * num_sources))) {
- sr_err("session: %s: fds malloc failed", __func__);
+ /* Not enough memory, or num_sources was 0. */
+ sr_err("session: %s: fds malloc failed "
+ "(num_sources was %d).", __func__, num_sources);
return SR_ERR_MALLOC;
}
for (i = 0; i < num_sources; i++) {
static void datafeed_dump(struct sr_datafeed_packet *packet)
{
struct sr_datafeed_logic *logic;
+ struct sr_datafeed_analog *analog;
switch (packet->type) {
case SR_DF_HEADER:
case SR_DF_TRIGGER:
sr_dbg("bus: received SR_DF_TRIGGER");
break;
+ case SR_DF_META_LOGIC:
+ sr_dbg("bus: received SR_DF_META_LOGIC");
+ break;
case SR_DF_LOGIC:
logic = packet->payload;
/* TODO: Check for logic != NULL. */
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");
+ break;
+ case SR_DF_ANALOG:
+ analog = packet->payload;
+ /* TODO: Check for analog != NULL. */
+ sr_dbg("bus: received SR_DF_ANALOG %d samples", analog->num_samples);
+ break;
case SR_DF_END:
sr_dbg("bus: received SR_DF_END");
break;
+ case SR_DF_FRAME_BEGIN:
+ sr_dbg("bus: received SR_DF_FRAME_BEGIN");
+ break;
+ case SR_DF_FRAME_END:
+ sr_dbg("bus: received SR_DF_FRAME_END");
+ break;
default:
sr_dbg("bus: received unknown packet type %d", packet->type);
break;
/* Note: cb_data can be NULL, that's not a bug. */
- new_sources = g_try_malloc0(sizeof(struct source) * (num_sources + 1));
+ new_sources = g_try_realloc(sources, sizeof(struct source) * (num_sources + 1));
if (!new_sources) {
sr_err("session: %s: new_sources malloc failed", __func__);
return SR_ERR_MALLOC;
}
- if (sources) {
- memcpy(new_sources, sources,
- sizeof(struct source) * num_sources);
- g_free(sources);
- }
-
s = &new_sources[num_sources++];
s->fd = fd;
s->events = events;
return SR_ERR_BUG;
}
- /* TODO: Check if 'fd' valid. */
-
- new_sources = g_try_malloc0(sizeof(struct source) * num_sources);
- if (!new_sources) {
- sr_err("session: %s: new_sources malloc failed", __func__);
- return SR_ERR_MALLOC;
+ for (old = 0; old < num_sources; old++) {
+ if (sources[old].fd == fd)
+ break;
}
- for (old = 0, new = 0; old < num_sources; old++) {
- if (sources[old].fd != fd)
- memcpy(&new_sources[new++], &sources[old],
- sizeof(struct source));
+ /* fd not found, nothing to do */
+ if (old == num_sources)
+ return SR_OK;
+
+ num_sources -= 1;
+
+ if (old != num_sources) {
+ memmove(&sources[old], &sources[old+1],
+ (num_sources - old) * sizeof(struct source));
}
- if (old != new) {
- g_free(sources);
- sources = new_sources;
- num_sources--;
- } else {
- /* Target fd was not found. */
- g_free(new_sources);
+ new_sources = g_try_realloc(sources, sizeof(struct source) * (num_sources - 1));
+ if (!new_sources && num_sources > 0) {
+ sr_err("session: %s: new_sources malloc failed", __func__);
+ return SR_ERR_MALLOC;
}
+ sources = new_sources;
+
return SR_OK;
}