demo: Use simple timer source instead of pipe

Get rid of the Unix pipe and the GIOChannel wrapping it. Instead,
install a simple timer event source with the appropriate timeout.
This commit is contained in:
Daniel Elstner 2015-08-31 03:55:41 +02:00
parent b5887bd0c3
commit 027bf07796
1 changed files with 2 additions and 39 deletions

View File

@ -22,14 +22,8 @@
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#ifdef _WIN32
#include <io.h>
#include <fcntl.h>
#define pipe(fds) _pipe(fds, 4096, _O_BINARY)
#endif
#include <libsigrok/libsigrok.h> #include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h" #include "libsigrok-internal.h"
@ -110,8 +104,6 @@ struct analog_gen {
/* Private, per-device-instance driver context. */ /* Private, per-device-instance driver context. */
struct dev_context { struct dev_context {
int pipe_fds[2];
GIOChannel *channel;
uint64_t cur_samplerate; uint64_t cur_samplerate;
gboolean continuous; gboolean continuous;
uint64_t limit_samples; uint64_t limit_samples;
@ -850,33 +842,11 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
devc->continuous = !devc->limit_samples; devc->continuous = !devc->limit_samples;
devc->logic_counter = devc->analog_counter = 0; devc->logic_counter = devc->analog_counter = 0;
/*
* Setting two channels connected by a pipe is a remnant from when the
* demo driver generated data in a thread, and collected and sent the
* data in the main program loop.
* They are kept here because it provides a convenient way of setting
* up a timeout-based polling mechanism.
*/
if (pipe(devc->pipe_fds)) {
sr_err("%s: pipe() failed", __func__);
return SR_ERR;
}
g_hash_table_iter_init(&iter, devc->ch_ag); g_hash_table_iter_init(&iter, devc->ch_ag);
while (g_hash_table_iter_next(&iter, NULL, &value)) while (g_hash_table_iter_next(&iter, NULL, &value))
generate_analog_pattern(value, devc->cur_samplerate); generate_analog_pattern(value, devc->cur_samplerate);
devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]); sr_session_source_add(sdi->session, -1, 0, 40, prepare_data, (void *)sdi);
g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
/* Set channel encoding to binary (default is UTF-8). */
g_io_channel_set_encoding(devc->channel, NULL, NULL);
/* Make channels unbuffered. */
g_io_channel_set_buffered(devc->channel, FALSE);
sr_session_source_add_channel(sdi->session, devc->channel,
G_IO_IN | G_IO_ERR, 40, prepare_data, (void *)sdi);
/* Send header packet to the session bus. */ /* Send header packet to the session bus. */
std_session_send_df_header(sdi, LOG_PREFIX); std_session_send_df_header(sdi, LOG_PREFIX);
@ -889,20 +859,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
{ {
struct dev_context *devc;
struct sr_datafeed_packet packet; struct sr_datafeed_packet packet;
(void)cb_data; (void)cb_data;
devc = sdi->priv;
sr_dbg("Stopping acquisition."); sr_dbg("Stopping acquisition.");
sr_session_source_remove_channel(sdi->session, devc->channel); sr_session_source_remove(sdi->session, -1);
g_io_channel_shutdown(devc->channel, FALSE, NULL);
g_io_channel_unref(devc->channel);
devc->channel = NULL;
close(devc->pipe_fds[0]);
close(devc->pipe_fds[1]);
/* Send last packet. */ /* Send last packet. */
packet.type = SR_DF_END; packet.type = SR_DF_END;