aboutsummaryrefslogtreecommitdiff
path: root/src/mm-port-scheduler-rr.h
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2025-02-08 10:08:26 -0600
committerDan Williams <dan@ioncontrol.co>2025-05-23 18:46:53 -0500
commita769bbed6d0d9dcbc5bb6f0f66dcbdfb8fa1ab0c (patch)
tree289b86fd8dc62124ad162e60f3efea35524bdf65 /src/mm-port-scheduler-rr.h
parentb24615d8018c7cd78a744db0372c09c07543b763 (diff)
port-serial: add serial port command scheduler
Add an interface and implementation for a port scheduler that round- robins between ports the scheduler is attached to, serializing command execution among one or more MMPortSerial instances. Theory of operation: Sources (e.g. MMPort subclasses) register themselves with the scheduler. Each source notifies the scheduler whenever its command queue depth changes, for example when new commands are submitted, when commands are completed, or when commands are canceled. The scheduler will round-robin between all sources with pending commands, sleeping when there are no pending commands from any source. For each source with a pending command the scheduler will emit the 'send-command' signal with that source's ID. The given source should send the next command in its queue to the modem. When that command is finished (either successfully or with an error/timeout) the source must call mm_port_scheduler_notify_command_done() to notify the scheduler that it may advance to the next source with a pending command, if any. If the 'send-command' signal and the notify_command_done() call are not balanced the scheduler may stall. Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-port-scheduler-rr.h')
-rw-r--r--src/mm-port-scheduler-rr.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/mm-port-scheduler-rr.h b/src/mm-port-scheduler-rr.h
new file mode 100644
index 00000000..6e750872
--- /dev/null
+++ b/src/mm-port-scheduler-rr.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details:
+ *
+ * Copyright (C) 2025 Dan Williams <dan@ioncontrol.co>
+ */
+
+#ifndef _MM_PORT_SCHEDULER_RR_H_
+#define _MM_PORT_SCHEDULER_RR_H_
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include "mm-port-scheduler.h"
+
+#define MM_TYPE_PORT_SCHEDULER_RR (mm_port_scheduler_rr_get_type ())
+#define MM_PORT_SCHEDULER_RR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_PORT_SCHEDULER_RR, MMPortSchedulerRR))
+#define MM_PORT_SCHEDULER_RR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MM_TYPE_PORT_SCHEDULER_RR, MMPortSchedulerRRClass))
+#define MM_IS_PORT_SCHEDULER_RR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_PORT_SCHEDULER_RR))
+#define MM_IS_PORT_SCHEDULER_RR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_PORT_SCHEDULER_RR))
+#define MM_PORT_SCHEDULER_RR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_PORT_SCHEDULER_RR, MMPortSchedulerRRClass))
+
+#define MM_PORT_SCHEDULER_RR_INTER_PORT_DELAY "inter-port-delay"
+
+typedef struct _MMPortSchedulerRR MMPortSchedulerRR;
+typedef struct _MMPortSchedulerRRClass MMPortSchedulerRRClass;
+typedef struct _MMPortSchedulerRRPrivate MMPortSchedulerRRPrivate;
+
+struct _MMPortSchedulerRR {
+ /*< private >*/
+ GObject parent;
+ MMPortSchedulerRRPrivate *priv;
+};
+
+struct _MMPortSchedulerRRClass {
+ /*< private >*/
+ GObjectClass parent;
+};
+
+GType mm_port_scheduler_rr_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSchedulerRR, g_object_unref)
+
+MMPortSchedulerRR *mm_port_scheduler_rr_new (void);
+
+#endif /* _MM_PORT_SCHEDULER_RR_H_ */