Ok thanks for the info.
I just got home now and will go sleep, and when I wake up you will probably
be gone already, so I will see what I can do and next sunday you give
feedback.
Until then
On Sat, Feb 23, 2013 at 7:45 PM, Nicholas Marriott <
nicholas.marri...@gmail.com> wrote:
> I've committed my cmdq changes after all so you will need to do it that
> way at some point, the differences aren't substantial - basically what I
> outlined below, save and reference the cmdq rather than the client and
> wake it up with cmdq_free/cmdq_continue. If you look at run-shell it
> should be clear enough.
>
>
> On Sat, Feb 23, 2013 at 09:55:43PM +0000, Nicholas Marriott wrote:
> > On Sat, Feb 23, 2013 at 06:24:56PM -0300, Thiago Padilha wrote:
> > > I have started to read the source code and began to wonder if those
> > > features are possible to implement.
> > > I'm assuming that a overview(very high level) of what happens when
> a tmux
> > > command is executed is:
> >
> > Yes this is correct, except for attach-client or new-session.
> >
> > > 1- user types 'tmux somecmd' in a shell running inside a tmux
> session,
> > > which opens 'tmux program'
> > > 2- tmux program opens a connection with the server
> > > 3- tmux program sends 'somecmd' through the connection fd and wait
> for a
> > > response
> > > 4- tmux server processes the command, sending every output to the
> > > connection fd, which tmux program forwards to stdout(which I assume
> is the
> > > tmux client)
> > > 5- tmux server closes the connection fd**
> >
> > Not quite, there is a client exit protocol, it is not just a close. But
> > that isn't important.
> >
> > > 6- tmux program detects EOF and returns.
> > > Since tmux is libevent based, to implement the semaphore/lock
> mechanisms
> > > described, I would need to block the tmux program from returning,
> which
> > > would require me to push the connection fd to some list or queue
> and only
> > > close it at a later time.
> >
> > The client will not exit until it is told to, it will just sit on the
> > tty. What you do currently for a command-line client is return
> > CMD_RETURN_YIELD from your command exec function and then set the
> > CLIENT_EXIT bit in the flags when you are done. Take a look at
> > cmd-run-shell.c.
> >
> > This will change shortly when I commit my command queue changes but I
> > suggest you not worry about that for now - just work on the current
> > system, it won't be hard to convert later.
> >
> > > Is something like this possible to do inside a normal tmux command?
> If so
> > > can you give me some hints?
> >
> > I would say you need to do this for waiting:
> >
> > - Define a global tree of wait ids keyed by string, each one will need a
> > queue of clients. Use the tree.h RB tree and queue.h TAILQ (so eg add
> > a TAILQ_ENTRY waitqentry to struct client).
> >
> > - In your new command's exec function make sure cmdclient is non-NULL,
> > if not you are inside tmux or in the config file and you can't do this
> > at the moment so make it an error.
> >
> > - Add your client to the queue for the wait id and return
> > CMD_RETURN_YIELD. Don't forget to increase the client reference count
> > (c->references).
> >
> > Then for the wakeup:
> >
> > - Lookup the wait id in the tree.
> >
> > - Walk the list of waiters, set their CLIENT_EXIT flag and reduce the
> > reference count.
> >
> > - Free all the bits that aren't needed now and return CMD_RETURN_NORMAL.
> >
> > With the current code this will NOT block execution of further commands
> > in a command sequence - this is impossible until I commit my changes. So
> > don't expect this to work:
> >
> > tmux wait foo\; lsk
> >
> > But this will:
> >
> > tmux wait foo
> > tmux lsk
> >
> > I'm not sure if I will commit my new code before I go but if I do the
> > idea will be very similar except instead of putting the client on the
> > list you will put the struct cmdq on there (and increase it's reference
> > but not the client's), instead of YIELD you will return WAIT and instead
> > of doing references-- and setting CLIENT_EXIT flag you will do
> > if(!cmdq_free(cmdq)) cmdq_continue(cmdq).
> >
> > If you have any questions make them before about 0900 GMT tomorrow or I
> > will be gone until next Sunday :-).
> >
> > > Thanks
> > > On Fri, Feb 22, 2013 at 8:16 PM, Nicholas Marriott
> > > <[1]nicholas.marri...@gmail.com> wrote:
> > >
> > > No don't need any other changes thanks
> > >
> > > On Fri, Feb 22, 2013 at 07:14:30PM -0300, Thiago Padilha wrote:
> > > > Ok by me, I was just **following the existing code :)
> > > >
> > > > So the patch is good to merge? Need me to do any other
> modifications?
> > > >
> > > > On Fri, Feb 22, 2013 at 6:50 PM, Nicholas Marriott
> > > > <[2]nicholas.marri...@gmail.com> wrote:
> > > > > On Fri, Feb 22, 2013 at 06:34:14PM -0300, Thiago Padilha
> wrote:
> > > > >> I had forgotten to update the man pages to reflect the nem
> flag,
> > > this
> > > > >> patch contains the complete thing.
> > > > >
> > > > > I think this is a bit more pithy, don't see a need to info()
> the old
> > > > > value.
> > > > >
> > > > >
> > > > > diff --git a/cmd-set-option.c b/cmd-set-option.c
> > > > > index a09e6db..94b44c7 100644
> > > > > --- a/cmd-set-option.c
> > > > > +++ b/cmd-set-option.c
> > > > > @@ -63,8 +63,8 @@ struct options_entry
> *cmd_set_option_choice(struct
> > > cmd *, struct cmd_ctx *,
> > > > >
> > > > > **const struct cmd_entry cmd_set_option_entry = {
> > > > > ** ** ** ** "set-option", "set",
> > > > > - ** ** ** "agqst:uw", 1, 2,
> > > > > - ** ** ** "[-agsquw] [-t target-session|target-window] option
> > > [value]",
> > > > > + ** ** ** "agoqst:uw", 1, 2,
> > > > > + ** ** ** "[-agosquw] [-t target-session|target-window]
> option
> > > [value]",
> > > > > ** ** ** ** 0,
> > > > > ** ** ** ** NULL,
> > > > > ** ** ** ** NULL,
> > > > > @@ -73,8 +73,8 @@ const struct cmd_entry cmd_set_option_entry
> = {
> > > > >
> > > > > **const struct cmd_entry cmd_set_window_option_entry = {
> > > > > ** ** ** ** "set-window-option", "setw",
> > > > > - ** ** ** "agqt:u", 1, 2,
> > > > > - ** ** ** "[-agqu] " CMD_TARGET_WINDOW_USAGE " option
> [value]",
> > > > > + ** ** ** "agoqt:u", 1, 2,
> > > > > + ** ** ** "[-agoqu] " CMD_TARGET_WINDOW_USAGE " option
> [value]",
> > > > > ** ** ** ** 0,
> > > > > ** ** ** ** NULL,
> > > > > ** ** ** ** NULL,
> > > > > @@ -151,6 +151,11 @@ cmd_set_option_exec(struct cmd *self,
> struct
> > > cmd_ctx *ctx)
> > > > > ** ** ** ** ** ** ** ** if (cmd_set_option_unset(self, ctx,
> oe, oo,
> > > valstr) != 0)
> > > > > ** ** ** ** ** ** ** ** ** ** ** ** return (CMD_RETURN_ERROR);
> > > > > ** ** ** ** } else {
> > > > > + ** ** ** ** ** ** ** if (args_has(args, 'o') &&
> options_find1(oo,
> > > optstr) != NULL) {
> > > > > + ** ** ** ** ** ** ** ** ** ** ** if (!args_has(args, 'q'))
> > > > > + ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ctx->print(ctx,
> > > "already set: %s", optstr);
> > > > > + ** ** ** ** ** ** ** ** ** ** ** return (CMD_RETURN_NORMAL);
> > > > > + ** ** ** ** ** ** ** }
> > > > > ** ** ** ** ** ** ** ** if (cmd_set_option_set(self, ctx, oe,
> oo,
> > > valstr) != 0)
> > > > > ** ** ** ** ** ** ** ** ** ** ** ** return (CMD_RETURN_ERROR);
> > > > > ** ** ** ** }
> > > > > @@ -227,6 +232,11 @@ cmd_set_option_user(struct cmd *self,
> struct
> > > cmd_ctx *ctx, const char* optstr,
> > > > > ** ** ** ** ** ** ** ** ** ** ** ** ctx->error(ctx, "empty
> value");
> > > > > ** ** ** ** ** ** ** ** ** ** ** ** return (CMD_RETURN_ERROR);
> > > > > ** ** ** ** ** ** ** ** }
> > > > > + ** ** ** ** ** ** ** if (args_has(args, 'o') &&
> options_find1(oo,
> > > optstr) != NULL) {
> > > > > + ** ** ** ** ** ** ** ** ** ** ** if (!args_has(args, 'q'))
> > > > > + ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ctx->print(ctx,
> > > "already set: %s", optstr);
> > > > > + ** ** ** ** ** ** ** ** ** ** ** return (CMD_RETURN_NORMAL);
> > > > > + ** ** ** ** ** ** ** }
> > > > > ** ** ** ** ** ** ** ** options_set_string(oo, optstr, "%s",
> > > valstr);
> > > > > ** ** ** ** ** ** ** ** if (!args_has(args, 'q'))
> > > > > ** ** ** ** ** ** ** ** ** ** ** ** ctx->info(ctx, "set
> option: %s
> > > -> %s", optstr, valstr);
> > > > > diff --git a/tmux.1 b/tmux.1
> > > > > index 475bac0..0b2892a 100644
> > > > > --- a/tmux.1
> > > > > +++ b/tmux.1
> > > > > @@ -1996,7 +1996,7 @@ abc123
> > > > > **Commands which set options are as follows:
> > > > > **.Bl -tag -width Ds
> > > > > **.It Xo Ic set-option
> > > > > -.Op Fl agqsuw
> > > > > +.Op Fl agoqsuw
> > > > > **.Op Fl t Ar target-session | Ar target-window
> > > > > **.Ar option Ar value
> > > > > **.Xc
> > > > > @@ -2025,6 +2025,10 @@ options.
> > > > > **It is not possible to unset a global option.
> > > > > **.Pp
> > > > > **The
> > > > > +.Fl o
> > > > > +flag prevents setting an option that is already set.
> > > > > +.Pp
> > > > > +The
> > > > > **.Fl q
> > > > > **flag suppresses the informational message (as if the
> > > > > **.Ic quiet
> > > > >
> > > > >
> > >
> > > References
> > >
> > > Visible links
> > > 1. mailto:nicholas.marri...@gmail.com
> > > 2. mailto:nicholas.marri...@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