From 3b07517b13196aa20b727b18abb862b584a67bb5 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 1 Oct 2012 13:56:06 +0200 Subject: [PATCH] uterm: vt: add helpers to (de)activate all VTs at once Two new helpers to activate or deactivate all VTs at once. They return the total count of VT switches that are pending or an error code. Signed-off-by: David Herrmann --- src/uterm.h | 3 +++ src/uterm_vt.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/uterm.h b/src/uterm.h index 8912df1..1aaea1b 100644 --- a/src/uterm.h +++ b/src/uterm.h @@ -335,6 +335,9 @@ int uterm_vt_master_new(struct uterm_vt_master **out, void uterm_vt_master_ref(struct uterm_vt_master *vtm); void uterm_vt_master_unref(struct uterm_vt_master *vtm); +int uterm_vt_master_activate_all(struct uterm_vt_master *vtm); +int uterm_vt_master_deactivate_all(struct uterm_vt_master *vtm); + int uterm_vt_allocate(struct uterm_vt_master *vt, struct uterm_vt **out, const char *seat, struct uterm_input *input, const char *vt_for_seat0, uterm_vt_cb cb, void *data); diff --git a/src/uterm_vt.c b/src/uterm_vt.c index ec915be..74e279d 100644 --- a/src/uterm_vt.c +++ b/src/uterm_vt.c @@ -658,3 +658,53 @@ void uterm_vt_master_unref(struct uterm_vt_master *vtm) ev_eloop_unref(vtm->eloop); free(vtm); } + +int uterm_vt_master_activate_all(struct uterm_vt_master *vtm) +{ + struct uterm_vt *vt; + struct shl_dlist *iter; + int ret, res = 0; + unsigned int in_progress = 0; + + if (!vtm) + return -EINVAL; + + shl_dlist_for_each(iter, &vtm->vts) { + vt = shl_dlist_entry(iter, struct uterm_vt, list); + ret = uterm_vt_activate(vt); + if (ret == -EINPROGRESS) + in_progress++; + else if (ret) + res = ret; + } + + if (in_progress) + return in_progress; + + return res; +} + +int uterm_vt_master_deactivate_all(struct uterm_vt_master *vtm) +{ + struct uterm_vt *vt; + struct shl_dlist *iter; + int ret, res = 0; + unsigned int in_progress = 0; + + if (!vtm) + return -EINVAL; + + shl_dlist_for_each(iter, &vtm->vts) { + vt = shl_dlist_entry(iter, struct uterm_vt, list); + ret = uterm_vt_deactivate(vt); + if (ret == -EINPROGRESS) + in_progress++; + else if (ret) + res = ret; + } + + if (in_progress) + return in_progress; + + return res; +} -- 2.7.4