X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fsession.c;h=dc8fd4fbeaffc2ce3c78cdeabcd5156f30c44363;hb=db560903d196c39bceeaa543317fa602a02b51ac;hp=d8a3b00b5efabe157ab546498bee39139b249853;hpb=155b680da482cea2381becb73c51cfb838bff31e;p=libsigrok.git diff --git a/src/session.c b/src/session.c index d8a3b00b..dc8fd4fb 100644 --- a/src/session.c +++ b/src/session.c @@ -61,10 +61,13 @@ struct datafeed_callback { /** * Create a new session. - * Currently, there can be only one session at a time within the same process. + * + * @param new_session This will contain a pointer to the newly created + * session if the return value is SR_OK, otherwise the value + * is undefined and should not be used. Must not be NULL. * * @retval SR_OK Success. - * @retval SR_ERR_BUG A session exists already. + * @retval SR_ERR_ARG Invalid argument. * * @since 0.4.0 */ @@ -72,6 +75,9 @@ SR_API int sr_session_new(struct sr_session **new_session) { struct sr_session *session; + if (!new_session) + return SR_ERR_ARG; + session = g_malloc0(sizeof(struct sr_session)); session->source_timeout = -1; @@ -88,6 +94,8 @@ SR_API int sr_session_new(struct sr_session **new_session) * Destroy a session. * This frees up all memory used by the session. * + * @param session The session to destroy. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -116,6 +124,8 @@ SR_API int sr_session_destroy(struct sr_session *session) * The session itself (i.e., the struct sr_session) is not free'd and still * exists after this function returns. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_BUG Invalid session passed. * @@ -145,6 +155,7 @@ SR_API int sr_session_dev_remove_all(struct sr_session *session) /** * Add a device instance to a session. * + * @param session The session to add to. Must not be NULL. * @param sdi The device instance to add to a session. Must not * be NULL. Also, sdi->driver and sdi->driver->dev_open must * not be NULL. @@ -178,8 +189,6 @@ SR_API int sr_session_dev_add(struct sr_session *session, /* If sdi->driver is NULL, this is a virtual device. */ if (!sdi->driver) { - sr_dbg("%s: sdi->driver was NULL, this seems to be " - "a virtual device; continuing", __func__); /* Just add the device, don't run dev_open(). */ session->devs = g_slist_append(session->devs, (gpointer)sdi); sdi->session = session; @@ -218,6 +227,7 @@ SR_API int sr_session_dev_add(struct sr_session *session, /** * List all device instances attached to a session. * + * @param session The session to use. Must not be NULL. * @param devlist A pointer where the device instance list will be * stored on return. If no devices are in the session, * this will be NULL. Each element in the list points @@ -246,6 +256,8 @@ SR_API int sr_session_dev_list(struct sr_session *session, GSList **devlist) /** * Remove all datafeed callbacks in a session. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -267,6 +279,7 @@ SR_API int sr_session_datafeed_callback_remove_all(struct sr_session *session) /** * Add a datafeed callback to a session. * + * @param session The session to use. Must not be NULL. * @param cb Function to call when a chunk of data is received. * Must not be NULL. * @param cb_data Opaque pointer passed in by the caller. @@ -322,6 +335,7 @@ SR_API int sr_session_trigger_set(struct sr_session *session, struct sr_trigger * but driven by another scheduler, this can be used to poll the devices * from within that scheduler. * + * @param session The session to use. Must not be NULL. * @param block If TRUE, this call will wait for any of the session's * sources to fire an event on the file descriptors, or * any of their timeouts to activate. In other words, this @@ -410,6 +424,8 @@ static int verify_trigger(struct sr_trigger *trigger) /** * Start a session. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -418,8 +434,9 @@ static int verify_trigger(struct sr_trigger *trigger) SR_API int sr_session_start(struct sr_session *session) { struct sr_dev_inst *sdi; - GSList *l; - int ret; + struct sr_channel *ch; + GSList *l, *c; + int enabled_channels, ret; if (!session) { sr_err("%s: session was NULL", __func__); @@ -440,6 +457,21 @@ SR_API int sr_session_start(struct sr_session *session) ret = SR_OK; for (l = session->devs; l; l = l->next) { sdi = l->data; + enabled_channels = 0; + for (c = sdi->channels; c; c = c->next) { + ch = c->data; + if (ch->enabled) { + enabled_channels++; + break; + } + } + if (enabled_channels == 0) { + ret = SR_ERR; + sr_err("%s instance %d has no enabled channels!", + sdi->driver->name, sdi->index); + break; + } + if ((ret = sr_config_commit(sdi)) != SR_OK) { sr_err("Failed to commit device settings before " "starting acquisition (%s)", sr_strerror(ret)); @@ -460,6 +492,8 @@ SR_API int sr_session_start(struct sr_session *session) /** * Run a session. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -505,6 +539,8 @@ SR_API int sr_session_run(struct sr_session *session) * This must be called from within the session thread, to prevent freeing * resources that the session thread will try to use. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -545,6 +581,8 @@ SR_PRIV int sr_session_stop_sync(struct sr_session *session) * to wait for the session thread to return before assuming that the session is * completely decommissioned. * + * @param session The session to use. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid session passed. * @@ -651,6 +689,7 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, /** * Add an event source for a file descriptor. * + * @param session The session to use. Must not be NULL. * @param pollfd The GPollFD. * @param[in] timeout Max time to wait before the callback is called, * ignored if 0. @@ -708,6 +747,7 @@ static int _sr_session_source_add(struct sr_session *session, GPollFD *pollfd, /** * Add an event source for a file descriptor. * + * @param session The session to use. Must not be NULL. * @param fd The file descriptor. * @param events Events to check for. * @param timeout Max time to wait before the callback is called, ignored if 0. @@ -725,8 +765,6 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd, { GPollFD p; - (void) session; - p.fd = fd; p.events = events; @@ -736,6 +774,7 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd, /** * Add an event source for a GPollFD. * + * @param session The session to use. Must not be NULL. * @param pollfd The GPollFD. * @param timeout Max time to wait before the callback is called, ignored if 0. * @param cb Callback function to add. Must not be NULL. @@ -751,8 +790,6 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session, GPollFD *pollfd, int timeout, sr_receive_data_callback cb, void *cb_data) { - (void) session; - return _sr_session_source_add(session, pollfd, timeout, cb, cb_data, (gintptr)pollfd); } @@ -760,6 +797,7 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session, /** * Add an event source for a GIOChannel. * + * @param session The session to use. Must not be NULL. * @param channel The GIOChannel. * @param events Events to poll on. * @param timeout Max time to wait before the callback is called, ignored if 0. @@ -778,8 +816,6 @@ SR_API int sr_session_source_add_channel(struct sr_session *session, { GPollFD p; - (void) session; - #ifdef _WIN32 g_io_channel_win32_make_pollfd(channel, events, &p); #else @@ -795,6 +831,7 @@ SR_API int sr_session_source_add_channel(struct sr_session *session, * * @todo Add more error checks and logging. * + * @param session The session to use. Must not be NULL. * @param poll_object The channel for which the source should be removed. * * @retval SR_OK Success @@ -852,6 +889,7 @@ static int _sr_session_source_remove(struct sr_session *session, gintptr poll_ob /** * Remove the source belonging to the specified file descriptor. * + * @param session The session to use. Must not be NULL. * @param fd The file descriptor for which the source should be removed. * * @retval SR_OK Success @@ -863,14 +901,13 @@ static int _sr_session_source_remove(struct sr_session *session, gintptr poll_ob */ SR_API int sr_session_source_remove(struct sr_session *session, int fd) { - (void) session; - return _sr_session_source_remove(session, (gintptr)fd); } /** * Remove the source belonging to the specified poll descriptor. * + * @param session The session to use. Must not be NULL. * @param pollfd The poll descriptor for which the source should be removed. * * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or @@ -882,14 +919,13 @@ SR_API int sr_session_source_remove(struct sr_session *session, int fd) SR_API int sr_session_source_remove_pollfd(struct sr_session *session, GPollFD *pollfd) { - (void) session; - return _sr_session_source_remove(session, (gintptr)pollfd); } /** * Remove the source belonging to the specified channel. * + * @param session The session to use. Must not be NULL. * @param channel The channel for which the source should be removed. * * @retval SR_OK Success. @@ -902,8 +938,6 @@ SR_API int sr_session_source_remove_pollfd(struct sr_session *session, SR_API int sr_session_source_remove_channel(struct sr_session *session, GIOChannel *channel) { - (void) session; - return _sr_session_source_remove(session, (gintptr)channel); }