I think this could be much simpler - to give you an idea, this is the kind of thing I had in mind, but instead of just one saved cmdq having a tree of wait channels each with a list of cmdq attached.
Locking can be implemented very similarly and perhaps even using the same data structures as needed for waiting. diff --git a/Makefile.am b/Makefile.am index 5caa498..19220d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -135,6 +135,7 @@ dist_tmux_SOURCES = \ cmd-switch-client.c \ cmd-unbind-key.c \ cmd-unlink-window.c \ + cmd-wait-for.c \ cmd.c \ colour.c \ control.c \ diff --git a/cmd-wait-for.c b/cmd-wait-for.c new file mode 100644 index 0000000..7b11c8d --- /dev/null +++ b/cmd-wait-for.c @@ -0,0 +1,69 @@ +/* $Id$ */ + +/* + * Copyright (c) 2013 Nicholas Marriott <n...@users.sourceforge.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> + +#include "tmux.h" + +/* + * Block client until woken. + */ + +struct cmd_q *xxx_wait_cmdq; /* XXX tree */ + +enum cmd_retval cmd_wait_for_exec(struct cmd *, struct cmd_q *); + +const struct cmd_entry cmd_wait_for_entry = { + "wait-for", "wait", + "S", 1, 1, + "[-S] channel", + 0, + NULL, + NULL, + cmd_wait_for_exec +}; + +enum cmd_retval +cmd_wait_for_exec(struct cmd *self, struct cmd_q *cmdq) +{ + struct args *args = self->args; + + if (args_has(args, 'S')) { + if (xxx_wait_cmdq == NULL) { + cmdq_error(cmdq, "no waiting clients"); + return (CMD_RETURN_ERROR); + } + if (!cmdq_free(xxx_wait_cmdq)) + cmdq_continue(xxx_wait_cmdq); + xxx_wait_cmdq = NULL; + return (CMD_RETURN_NORMAL); + } + + if (cmdq->client == NULL || cmdq->client->session != NULL) { + cmdq_error(cmdq, "not able to wait"); + return (CMD_RETURN_ERROR); + } + + if (xxx_wait_cmdq != NULL) { + cmdq_error(cmdq, "client already waiting"); + return (CMD_RETURN_ERROR); + } + cmdq->references++; + xxx_wait_cmdq = cmdq; + return (CMD_RETURN_WAIT); +} diff --git a/cmd.c b/cmd.c index 0d6a85f..20484ed 100644 --- a/cmd.c +++ b/cmd.c @@ -112,6 +112,7 @@ const struct cmd_entry *cmd_table[] = { &cmd_switch_client_entry, &cmd_unbind_key_entry, &cmd_unlink_window_entry, + &cmd_wait_for_entry, NULL }; diff --git a/tmux.h b/tmux.h index c1ad662..95dd97c 100644 --- a/tmux.h +++ b/tmux.h @@ -1835,6 +1835,7 @@ extern const struct cmd_entry cmd_switch_client_entry; extern const struct cmd_entry cmd_unbind_key_entry; extern const struct cmd_entry cmd_unlink_window_entry; extern const struct cmd_entry cmd_up_pane_entry; +extern const struct cmd_entry cmd_wait_for_entry; /* cmd-attach-session.c */ enum cmd_retval cmd_attach_session(struct cmd_q *, const char*, int, int); On Tue, Mar 05, 2013 at 09:47:45AM -0300, Thiago Padilha wrote: > Any chance this patch will be accepted? > I still need to tweak a few things: > - Detect when a waiting pane exits and remove it from the queue/monitor > - Move the queue shifting to the event loop > - Handle SIGINT in the tmux client(Not sure **about this one) > I didn't manage to implement those myself, so I was hoping for some > feedback/help > If you guys want I can recreate the patch against the current master. > > On Sun, Mar 3, 2013 at 7:53 PM, Thiago Padilha <[1]tpadilh...@gmail.com> > wrote: > > Here's a nice integration between vim and tmux for any zsh users that > want to give this patch a > try:**[2]https://gist.github.com/tarruda/5051527 > Combined with the new zoom patch, you can get a nice 'toggle top > terminal' experience. > > On Tue, Feb 26, 2013 at 11:37 AM, Thiago Padilha > <[3]tpadilh...@gmail.com> wrote: > > Here is TAILQ version of the patch, along with the event loop > diff(which > randomly crashes the server for me again) > --- > **Makefile.am ** ** ** ** | ** 2 + > **cmd-monitor.c ** ** ** | 110 ++++++++++++++++++++++++++++ > **cmd.c ** ** ** ** ** ** ** | ** 1 + > **examples/monitor.sh | 120 ++++++++++++++++++++++++++++++ > **monitor.c ** ** ** ** ** | 206 > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > **tmux.c ** ** ** ** ** ** **| ** 3 + > **tmux.h ** ** ** ** ** ** **| **71 ++++++++++++++++++ > **7 files changed, 513 insertions(+) > **create mode 100644 cmd-monitor.c > **create mode 100755 examples/monitor.sh > **create mode 100644 monitor.c > > References > > Visible links > 1. mailto:tpadilh...@gmail.com > 2. https://gist.github.com/tarruda/5051527 > 3. mailto:tpadilh...@gmail.com > ------------------------------------------------------------------------------ > Everyone hates slow websites. So do we. > Make your web apps faster with AppDynamics > Download AppDynamics Lite for free today: > http://p.sf.net/sfu/appdyn_d2d_feb > _______________________________________________ > tmux-users mailing list > tmux-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/tmux-users ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users