A small correction. Everrthing backs to normal when I attach the session
from a different window.

On Wed, Nov 16, 2016 at 9:57 AM, Prabhuram K <[email protected]> wrote:

> Hi Nicholas,
> Many thanks. It now sets non-blocking always with the patch.
> However get in to another issue now. It works till I have only one window
> in the session.
> As soon as I attach a new-window to this existing session, the tmux just
> freezes. Though I could see prints are coming in to the screen, input is
> not working. As soon as I killed the new-window, everything backs to
> normal. Any Idea?
>
> Thanks,
> Prabhu
>
>
> On Wed, Nov 16, 2016 at 6:14 AM, Nicholas Marriott <
> [email protected]> wrote:
>
>> Right, but if you run an application in a terminal, they will all be
>> dup()'d file descriptors referencing the same object (open()ed from some
>> /dev/pty). On most (maybe all) *nix, O_NONBLOCK is an attribute of that
>> object, not the descriptors - if you change one, you change them all.
>>
>> tmux only changes stdin, but your stdout and stderr point to the same
>> object so they will be changed too.
>>
>>
>>
>> On Wed, Nov 16, 2016 at 06:01:43AM +0530, Prabhuram K wrote:
>> >    As for as I know STDIN STDOUT STDERR fds are defined with 0, 1 and
>> 2. I
>> >    can try the patch anyway.** Thanks again.
>> >
>> >    On Nov 16, 2016 5:54 AM, "Nicholas Marriott"
>> >    <[1][email protected]> wrote:
>> >
>> >      stdin and stdout and stderr are probably all the same file
>> descriptor.
>> >
>> >      On Wed, Nov 16, 2016 at 05:53:52AM +0530, Prabhuram K wrote:
>> >      >** ** Hi Nicholas,
>> >      >** ** Thanks a lot for the patch. But it's not just STDIN.
>> setting to
>> >      blocking.
>> >      >** ** Even STDOUT and STDERR also going back to blocking state.
>> Do I
>> >      need to add
>> >      >** ** similar code for other fds?
>> >      >
>> >      >** ** BTW: Your question on why reinitialize back, I am running
>> with a
>> >      real time
>> >      >** ** system and I run my application multiple instances under
>> tmux and
>> >      >** ** sometimes simultaneously. So I don't want this to be done
>> from my
>> >      >** ** application rather from tmux itself.
>> >      >
>> >      >** ** Thanks a lot for your help
>> >      >
>> >      >** ** Regards,
>> >      >** ** Prabhu
>> >      >
>> >      >** ** On Nov 16, 2016 5:17 AM, "Nicholas Marriott"
>> >      >** ** <[1][2][email protected]> wrote:
>> >      >
>> >      >** ** ** You could try this:
>> >      >
>> >      >** ** ** Index: client.c
>> >      >** ** **
>> >      ============================================================
>> =======
>> >      >** ** ** RCS file: /cvs/src/usr.bin/tmux/client.c,v
>> >      >** ** ** retrieving revision 1.114
>> >      >** ** ** diff -u -p -r1.114 client.c
>> >      >** ** ** --- client.c** ** 3 Oct 2016 22:52:11 -0000** ** **
>> **1.114
>> >      >** ** ** +++ client.c** ** 15 Nov 2016 23:47:22 -0000
>> >      >** ** ** @@ -38,6 +38,7 @@ static struct tmuxproc** ** ** **
>> >      *client_proc;
>> >      >** ** ** **static struct tmuxpeer *client_peer;
>> >      >** ** ** **static int** ** ** ** ** ** ** client_flags;
>> >      >** ** ** **static struct event** ** **client_stdin;
>> >      >** ** ** +static int** ** ** ** ** ** ** client_stdin_blocking;
>> >      >** ** ** **static enum {
>> >      >** ** ** ** ** ** ** CLIENT_EXIT_NONE,
>> >      >** ** ** ** ** ** ** CLIENT_EXIT_DETACHED,
>> >      >** ** ** @@ -306,10 +307,12 @@ client_main(struct event_base
>> *base, int
>> >      >** ** ** ** ** ** ** options_free(global_w_options);
>> >      >** ** ** ** ** ** ** environ_free(global_environ);
>> >      >
>> >      >** ** ** -** ** ** **/* Create stdin handler. */
>> >      >** ** ** -** ** ** **setblocking(STDIN_FILENO, 0);
>> >      >** ** ** +** ** ** **/* Create stdin event. */
>> >      >** ** ** ** ** ** ** event_set(&client_stdin, STDIN_FILENO,
>> >      EV_READ|EV_PERSIST,
>> >      >** ** ** ** ** ** ** ** ** client_stdin_callback, NULL);
>> >      >** ** ** +** ** ** **client_stdin_blocking =
>> getblocking(STDIN_FILENO);
>> >      >** ** ** +
>> >      >** ** ** +** ** ** **/* Configure terminal for control mode. */
>> >      >** ** ** ** ** ** ** if (client_flags & CLIENT_CONTROLCONTROL) {
>> >      >** ** ** ** ** ** ** ** ** ** ** if (tcgetattr(STDIN_FILENO,
>> >      &saved_tio) != 0)
>> >      >** ** ** ** ** ** ** ** ** ** ** ** ** ** ** fatal("tcgetattr
>> failed");
>> >      >** ** ** @@ -375,7 +378,7 @@ client_main(struct event_base *base,
>> int
>> >      >** ** ** ** ** ** ** ** ** ** ** tcsetattr(STDOUT_FILENO,
>> TCSAFLUSH,
>> >      &saved_tio);
>> >      >** ** ** ** ** ** ** } else if (client_exitreason !=
>> CLIENT_EXIT_NONE)
>> >      >** ** ** ** ** ** ** ** ** ** ** fprintf(stderr, "%s\n",
>> >      client_exit_message());
>> >      >** ** ** -** ** ** **setblocking(STDIN_FILENO, 1);
>> >      >** ** ** +** ** ** **setblocking(STDIN_FILENO,
>> client_stdin_blocking);
>> >      >** ** ** ** ** ** ** return (client_exitval);
>> >      >** ** ** **}
>> >      >
>> >      >** ** ** @@ -585,6 +588,7 @@ client_dispatch_wait(struct imsg
>> *imsg,
>> >      >** ** ** ** ** ** ** ** ** ** ** if (datalen != 0)
>> >      >** ** ** ** ** ** ** ** ** ** ** ** ** ** ** fatalx("bad MSG_STDIN
>> >      size");
>> >      >
>> >      >** ** ** +** ** ** ** ** ** ** **setblocking(STDIN_FILENO, 0);
>> >      >** ** ** ** ** ** ** ** ** ** ** event_add(&client_stdin, NULL);
>> >      >** ** ** ** ** ** ** ** ** ** ** break;
>> >      >** ** ** ** ** ** ** case MSG_STDOUT:
>> >      >** ** ** Index: tmux.c
>> >      >** ** **
>> >      ============================================================
>> =======
>> >      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tmux.c,v
>> >      >** ** ** retrieving revision 1.172
>> >      >** ** ** diff -u -p -r1.172 tmux.c
>> >      >** ** ** --- tmux.c** ** ** 11 Oct 2016 13:21:59 -0000** ** **
>> 1.172
>> >      >** ** ** +++ tmux.c** ** ** 15 Nov 2016 23:47:22 -0000
>> >      >** ** ** @@ -150,18 +150,31 @@ fail:
>> >      >** ** ** ** ** ** ** return (NULL);
>> >      >** ** ** **}
>> >      >
>> >      >** ** ** +int
>> >      >** ** ** +getblocking(int fd)
>> >      >** ** ** +{
>> >      >** ** ** +** ** ** **int** ** **mode;
>> >      >** ** ** +
>> >      >** ** ** +** ** ** **if ((mode = fcntl(fd, F_GETFL)) == -1)
>> >      >** ** ** +** ** ** ** ** ** ** **return (-1);
>> >      >** ** ** +** ** ** **if (mode & O_NONBLOCK)
>> >      >** ** ** +** ** ** ** ** ** ** **return (0);
>> >      >** ** ** +** ** ** **return (1);
>> >      >** ** ** +}
>> >      >** ** ** +
>> >      >** ** ** **void
>> >      >** ** ** **setblocking(int fd, int state)
>> >      >** ** ** **{
>> >      >** ** ** -** ** ** **int mode;
>> >      >** ** ** +** ** ** **int** ** **mode, new_mode;
>> >      >
>> >      >** ** ** -** ** ** **if ((mode = fcntl(fd, F_GETFL)) != -1) {
>> >      >** ** ** -** ** ** ** ** ** ** **if (!state)
>> >      >** ** ** -** ** ** ** ** ** ** ** ** ** ** **mode |= O_NONBLOCK;
>> >      >** ** ** -** ** ** ** ** ** ** **else
>> >      >** ** ** -** ** ** ** ** ** ** ** ** ** ** **mode &= ~O_NONBLOCK;
>> >      >** ** ** +** ** ** **if (state == -1 || (mode = fcntl(fd,
>> F_GETFL)) ==
>> >      -1)
>> >      >** ** ** +** ** ** ** ** ** ** **return;
>> >      >** ** ** +** ** ** **if (state)
>> >      >** ** ** +** ** ** ** ** ** ** **new_mode = (mode | O_NONBLOCK);
>> >      >** ** ** +** ** ** **else
>> >      >** ** ** +** ** ** ** ** ** ** **new_mode = (mode & ~O_NONBLOCK);
>> >      >** ** ** +** ** ** **if (new_mode != mode)
>> >      >** ** ** ** ** ** ** ** ** ** ** fcntl(fd, F_SETFL, mode);
>> >      >** ** ** -** ** ** **}
>> >      >** ** ** **}
>> >      >
>> >      >** ** ** **const char *
>> >      >** ** ** Index: tmux.h
>> >      >** ** **
>> >      ============================================================
>> =======
>> >      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
>> >      >** ** ** retrieving revision 1.677
>> >      >** ** ** diff -u -p -r1.677 tmux.h
>> >      >** ** ** --- tmux.h** ** ** 15 Nov 2016 15:17:28 -0000** ** **
>> 1.677
>> >      >** ** ** +++ tmux.h** ** ** 15 Nov 2016 23:47:23 -0000
>> >      >** ** ** @@ -1105,6 +1105,7 @@ struct tty {
>> >      >** ** ** ** ** ** ** struct tty_term *term;
>> >      >
>> >      >** ** ** ** ** ** ** int** ** ** ** ** ** ** fd;
>> >      >** ** ** +** ** ** **int** ** ** ** ** ** ** blocking;
>> >      >** ** ** ** ** ** ** struct bufferevent *event;
>> >      >
>> >      >** ** ** ** ** ** ** struct termios** **tio;
>> >      >** ** ** @@ -1512,6 +1513,7 @@ extern struct environ** **
>> >      ***global_environ;
>> >      >** ** ** **extern struct timeval** **start_time;
>> >      >** ** ** **extern const char** ** ** *socket_path;
>> >      >** ** ** **int** ** ** ** ** ** **areshell(const char *);
>> >      >** ** ** +int** ** ** ** ** ** **getblocking(int);
>> >      >** ** ** **void** ** ** ** ** ** setblocking(int, int);
>> >      >** ** ** **const char** ** ***find_home(void);
>> >      >
>> >      >** ** ** Index: tty.c
>> >      >** ** **
>> >      ============================================================
>> =======
>> >      >** ** ** RCS file: /cvs/src/usr.bin/tmux/tty.c,v
>> >      >** ** ** retrieving revision 1.214
>> >      >** ** ** diff -u -p -r1.214 tty.c
>> >      >** ** ** --- tty.c** ** ** **15 Nov 2016 15:17:28 -0000** ** **
>> 1.214
>> >      >** ** ** +++ tty.c** ** ** **15 Nov 2016 23:47:23 -0000
>> >      >** ** ** @@ -237,6 +237,7 @@ tty_init_termios(int fd, struct
>> termios
>> >      >** ** ** **void
>> >      >** ** ** **tty_start_tty(struct tty *tty)
>> >      >** ** ** **{
>> >      >** ** ** +** ** ** **tty->blocking = getblocking(tty->fd);
>> >      >** ** ** ** ** ** ** tty_init_termios(tty->fd, &tty->tio,
>> tty->event);
>> >      >
>> >      >** ** ** ** ** ** ** tty_putcode(tty, TTYC_SMCUP);
>> >      >** ** ** @@ -330,7 +331,7 @@ tty_stop_tty(struct tty *tty)
>> >      >** ** ** ** ** ** ** ** ** ** ** tty_raw(tty, "\033[?69l"); /*
>> DECLRMM
>> >      */
>> >      >** ** ** ** ** ** ** tty_raw(tty, tty_term_string(tty->term,
>> >      TTYC_RMCUP));
>> >      >
>> >      >** ** ** -** ** ** **setblocking(tty->fd, 1);
>> >      >** ** ** +** ** ** **setblocking(tty->fd, tty->blocking);
>> >      >** ** ** **}
>> >      >
>> >      >** ** ** **void
>> >      >
>> >      >** ** ** On Tue, Nov 15, 2016 at 11:33:02PM +0000, Nicholas
>> Marriott
>> >      wrote:
>> >      >** ** ** > tmux sets stdin nonblocking then sets it blocking
>> again on
>> >      exit, we
>> >      >** ** ** > could probably not do that unless we are going to use
>> it,
>> >      and restore
>> >      >** ** ** > it only if it wasn't already nonblocking. But TBH does
>> it
>> >      matter that
>> >      >** ** ** > much? Why not just set it nonblocking yourself after
>> you run
>> >      tmux?
>> >      >** ** ** >
>> >      >** ** ** >
>> >      >** ** ** > On Tue, Nov 15, 2016 at 11:01:54PM +0530, Prabhuram K
>> wrote:
>> >      >** ** ** > >** ** Hi,
>> >      >** ** ** > >** ** I have an application and run it under tmux.
>> >      >** ** ** > >** ** The application sets** STDIN_FILENO,
>> STDOUT_FILENO
>> >      and
>> >      >** ** ** STDERR_FILENO to
>> >      >** ** ** > >** ** nonblocking using fcntl calls.
>> >      >** ** ** > >** ** The application internally loads the tmux
>> >      configuration file
>> >      >** ** ** using system
>> >      >** ** ** > >** ** command (tmux source-file xxx). Soon after this
>> is
>> >      executed
>> >      >** ** ** inside from my
>> >      >** ** ** > >** ** application, all the STDIN/STDOUT/STDERR fds
>> sets
>> >      back to
>> >      >** ** ** blocking state.
>> >      >** ** ** > >** ** Not sure what is the problem here. Why tmux
>> always
>> >      sets the fds
>> >      >** ** ** to
>> >      >** ** ** > >** ** blocking state. Is there a way to always set to
>> >      non-blocking.
>> >      >** ** ** > >** ** Any help is highly appreciated.
>> >      >** ** ** > >
>> >      >** ** ** > >** ** Thanks,
>> >      >** ** ** > >** ** Prabhu
>> >      >** ** ** > >
>> >      >** ** ** > >** ** --
>> >      >** ** ** > >** ** You received this message because you are
>> subscribed
>> >      to the
>> >      >** ** ** Google Groups
>> >      >** ** ** > >** ** "tmux-users" group.
>> >      >** ** ** > >** ** To unsubscribe from this group and stop
>> receiving
>> >      emails from
>> >      >** ** ** it, send an
>> >      >** ** ** > >** ** email to
>> >      [1][2][3][email protected].
>> >      >** ** ** > >** ** To post to this group, send email to
>> >      >** ** ** [2][3][4][email protected].
>> >      >** ** ** > >** ** For more options, visit
>> >      >** ** ** [3][4][5]https://groups.google.com/d/optout.
>> >      >** ** ** > >
>> >      >** ** ** > > References
>> >      >** ** ** > >
>> >      >** ** ** > >** ** Visible links
>> >      >** ** ** > >** ** 1.
>> >      mailto:[5][6][email protected]
>> >      >** ** ** > >** ** 2. mailto:[6][7][email protected]
>> >      >** ** ** > >** ** 3. [7][8]https://groups.google.com/d/optout
>> >      >
>> >      > References
>> >      >
>> >      >** ** Visible links
>> >      >** ** 1. mailto:[9][email protected]
>> >      >** ** 2. mailto:[10]tmux-users%[email protected]
>> >      >** ** 3. mailto:[11][email protected]
>> >      >** ** 4. [12]https://groups.google.com/d/optout
>> >      >** ** 5. mailto:[13]tmux-users%[email protected]
>> >      >** ** 6. mailto:[14][email protected]
>> >      >** ** 7. [15]https://groups.google.com/d/optout
>> >
>> >    --
>> >    You received this message because you are subscribed to the Google
>> Groups
>> >    "tmux-users" group.
>> >    To unsubscribe from this group and stop receiving emails from it,
>> send an
>> >    email to [16][email protected].
>> >    To post to this group, send email to [17][email protected]
>> .
>> >    For more options, visit [18]https://groups.google.com/d/optout.
>> >
>> > References
>> >
>> >    Visible links
>> >    1. mailto:[email protected]
>> >    2. mailto:[email protected]
>> >    3. mailto:tmux-users%[email protected]
>> >    4. mailto:[email protected]
>> >    5. https://groups.google.com/d/optout
>> >    6. mailto:tmux-users%[email protected]
>> >    7. mailto:[email protected]
>> >    8. https://groups.google.com/d/optout
>> >    9. mailto:[email protected]
>> >   10. mailto:tmux-users%[email protected]
>> >   11. mailto:[email protected]
>> >   12. https://groups.google.com/d/optout
>> >   13. mailto:tmux-users%[email protected]
>> >   14. mailto:[email protected]
>> >   15. https://groups.google.com/d/optout
>> >   16. mailto:[email protected]
>> >   17. mailto:[email protected]
>> >   18. https://groups.google.com/d/optout
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"tmux-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to