+ if (!session) {
+ sr_err("session: %s: session was NULL; a session must be "
+ "created first, before starting it.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ if (!session->devs) {
+ /* TODO: Actually the case? */
+ sr_err("session: %s: session->devs was NULL; a session "
+ "cannot be started without devices.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ /* TODO: Check driver_index validity? */
+
+ sr_info("session: starting");
+
+ for (l = session->devs; l; l = l->next) {
+ dev = l->data;
+ /* TODO: Check for dev != NULL. */
+ if ((ret = dev->driver->dev_acquisition_start(
+ dev->driver_index, dev)) != SR_OK) {
+ sr_err("session: %s: could not start an acquisition "
+ "(%d)", __func__, ret);
+ break;
+ }
+ }
+
+ /* TODO: What if there are multiple devices? Which return code? */
+
+ return ret;
+}
+
+/**
+ * Run the session.
+ *
+ * TODO: Various error checks etc.
+ *
+ * @return SR_OK upon success, SR_ERR_BUG upon errors.
+ */
+SR_API int sr_session_run(void)
+{
+ if (!session) {
+ sr_err("session: %s: session was NULL; a session must be "
+ "created first, before running it.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ if (!session->devs) {
+ /* TODO: Actually the case? */
+ sr_err("session: %s: session->devs was NULL; a session "
+ "cannot be run without devices.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ sr_info("session: running");
+ session->running = TRUE;
+
+ /* Do we have real sources? */
+ if (num_sources == 1 && sources[0].fd == -1) {
+ /* Dummy source, freewheel over it. */
+ while (session->running)
+ sources[0].cb(-1, 0, sources[0].cb_data);
+ } else {
+ /* Real sources, use g_poll() main loop. */
+ sr_session_run_poll();
+ }
+
+ return SR_OK;
+}
+
+/**
+ * Halt the current session.
+ *
+ * This requests the current session be stopped as soon as possible, for
+ * example on receiving an SR_DF_END packet.
+ *
+ * @return SR_OK upon success, SR_ERR_BUG if no session exists.
+ */
+SR_API int sr_session_halt(void)
+{
+ if (!session) {
+ sr_err("session: %s: session was NULL", __func__);
+ return SR_ERR_BUG;
+ }
+
+ sr_info("session: halting");