aboutsummaryrefslogtreecommitdiff
path: root/chardev/chardev-internal.h
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2025-02-03 13:42:02 -0500
committerStefan Hajnoczi <stefanha@redhat.com>2025-02-03 13:42:02 -0500
commitd922088eb4ba6bc31a99f17b32cf75e59dd306cd (patch)
tree0ad74b2484eaa6df1546107bc4e08bebaa440973 /chardev/chardev-internal.h
parentf58eb46a5ba284a97e45fd754871333ba2aeff39 (diff)
parent19c628f2f579f2702dd13192b7c2de6bc8d665ce (diff)
downloadqemu-d922088eb4ba6bc31a99f17b32cf75e59dd306cd.zip
qemu-d922088eb4ba6bc31a99f17b32cf75e59dd306cd.tar.gz
qemu-d922088eb4ba6bc31a99f17b32cf75e59dd306cd.tar.bz2
Merge tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu into staging
UI/chardev-related patch queue # -----BEGIN PGP SIGNATURE----- # # iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmeg+mwcHG1hcmNhbmRy # ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5X9JD/4ie4unhYkWEaJLR5ks # eVRE2ZrwrO1HF2HkFHgs9UN/G6Pl4o/YaPzICQkManJOhbJvOcp8hReOrSETrOLg # iiYHr3DH+H1nRzPgH+Nuvj3IRnl2EdypfgHbWVmvMQQ7u0vwpUiraTHEqy2PvTqO # ougTl0lf4v4NB1CHWDTbs6IT4/hMwXM4/pP1ztXvdWeJxKUUTKb9SSOlmjkdT/Ou # kZqDr/aonWxvQs6t3HeauNkiIIq21pVAIDUoDr338hTK4/EPhxOwaTpZ0b2RATA6 # ldpcS7VNfsMe8aJI3nsRaRz5NkWNDnQgejGkIxxXo3xj8c/rhZMyqrrqYaqFleVW # 0ahh6eY0qxc+Z7HJ+SxU8oDUzNjOw+14NeUlHTd+qRnZVasWXZlB7wYTxlbLKCHP # KtbAm8KsdWrKokMkupRCHiI0je3QXlhX3TGEUS5HHcknjhvmkEzCcEYy0gYuyLRq # +e79xdC/IyylZvzM/SXQXWEtb3GmBhi5pQmcRftTgISNxryXFfYXeOOQhgvJQS2L # 8/Ul/rIEvhecj1me/wzOK1bDGzFae8xYSM2z7v/EAm4I59N8N8aomnN3sHeaeLlG # UwWGpq9Z3igoWaM88/h8EktA0Kk8s9YBXZoKvGwVQPglEqEeWEwvrGKEM2Le7kYF # eHM+osrJFf2iD42v6AnYVARhIA== # =1pl1 # -----END PGP SIGNATURE----- # gpg: Signature made Mon 03 Feb 2025 12:18:36 EST # gpg: using RSA key 87A9BD933F87C606D276F62DDAE8E10975969CE5 # gpg: issuer "marcandre.lureau@redhat.com" # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" [full] # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" [full] # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu: dbus: add -audio dbus nsamples option plugins: fix -Werror=maybe-uninitialized false-positive ui/dbus: clarify the kind of win32 handle that is shared ui/dbus: on win32, allow ANONYMOUS with p2p qemu-options.hx: describe hub chardev and aggregation of several backends tests/unit/test-char: add unit tests for hub chardev backend chardev/char-hub: implement backend chardev aggregator chardev/char-pty: send CHR_EVENT_CLOSED on disconnect Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'chardev/chardev-internal.h')
-rw-r--r--chardev/chardev-internal.h51
1 files changed, 50 insertions, 1 deletions
diff --git a/chardev/chardev-internal.h b/chardev/chardev-internal.h
index 853807f..9752dd7 100644
--- a/chardev/chardev-internal.h
+++ b/chardev/chardev-internal.h
@@ -29,13 +29,16 @@
#include "chardev/char-fe.h"
#include "qom/object.h"
+#define MAX_HUB 4
#define MAX_MUX 4
#define MUX_BUFFER_SIZE 32 /* Must be a power of 2. */
#define MUX_BUFFER_MASK (MUX_BUFFER_SIZE - 1)
struct MuxChardev {
Chardev parent;
+ /* Linked frontends */
CharBackend *backends[MAX_MUX];
+ /* Linked backend */
CharBackend chr;
unsigned long mux_bitset;
int focus;
@@ -53,11 +56,57 @@ struct MuxChardev {
int64_t timestamps_start;
};
typedef struct MuxChardev MuxChardev;
+typedef struct HubChardev HubChardev;
+typedef struct HubCharBackend HubCharBackend;
+
+/*
+ * Back-pointer on a hub, actual backend and its index in
+ * `hub->backends` array
+ */
+struct HubCharBackend {
+ HubChardev *hub;
+ CharBackend be;
+ unsigned int be_ind;
+};
+
+struct HubChardev {
+ Chardev parent;
+ /* Linked backends */
+ HubCharBackend backends[MAX_HUB];
+ /*
+ * Number of backends attached to this hub. Once attached, a
+ * backend can't be detached, so the counter is only increasing.
+ * To safely remove a backend, hub has to be removed first.
+ */
+ unsigned int be_cnt;
+ /*
+ * Number of CHR_EVEN_OPENED events from all backends. Needed to
+ * send CHR_EVEN_CLOSED only when counter goes to zero.
+ */
+ unsigned int be_event_opened_cnt;
+ /*
+ * Counters of written bytes from a single frontend device
+ * to multiple backend devices.
+ */
+ unsigned int be_written[MAX_HUB];
+ unsigned int be_min_written;
+ /*
+ * Index of a backend device which got EAGAIN on last write,
+ * -1 is invalid index.
+ */
+ int be_eagain_ind;
+};
+typedef struct HubChardev HubChardev;
DECLARE_INSTANCE_CHECKER(MuxChardev, MUX_CHARDEV,
TYPE_CHARDEV_MUX)
-#define CHARDEV_IS_MUX(chr) \
+DECLARE_INSTANCE_CHECKER(HubChardev, HUB_CHARDEV,
+ TYPE_CHARDEV_HUB)
+
+#define CHARDEV_IS_MUX(chr) \
object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_MUX)
+#define CHARDEV_IS_HUB(chr) \
+ object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_HUB)
bool mux_chr_attach_frontend(MuxChardev *d, CharBackend *b,
unsigned int *tag, Error **errp);