On 4/2/13, Daniel Shahaf <danielsh_at_elego.de> wrote:
> I'm not sure how to interpret a return value of (0,0) that's not
> accompanied by an error flag (C errno!=0, or a Python exception). Is
> that normal behaviour, a bug we should be working around in our code, or
> an indication of a bug in our logic in the preceding lines?
I took a look around a few distros, and in no case does this function
return an error, to cater for dumb terminals if I understand this correctly.
More info: http://en.wikipedia.org/wiki/POSIX_terminal_interface
> i.e., if (0,0) means "_get_term_width() was going 35mph in a school zone
> at the time of the call to fcntl.ioctl()", we should fix that.
_get_term_width()'s 'sin' is not checking for a sane minimum size, which
is I think is a reasonable omission, because setting up a TERM with a
claimed size of (0,0) isn't easily anticipated and we're only crashing
svn and not aeroplanes :>
> But if (0,0) is just a terminal emulator bug, or expected behaviour, then +1 to
I think since emacs is mainly affected here, it's definitely worthwhile
to fix that because the output is hard to read, and whilst the 'success'
message is in green, someone who is red-green color blind won't be
able to read it easily without at least one space.
Also, the bug eats the progress meter, which is a pity.
> This change will actually change the output if you resize the terminal
> window while running tests interactively (at least in terminal emulators
> that support the ioctl_GWINSZ approach).
Oops, I hadn't thought that someone might adjust their window mid-test.
However, resizing your window results in quite a visual mess in either
case. -- best avoided :)
> I'm not objected to it, but it's not clear to me what it gains either (shaves 100 syscalls
> from a 'make check' run?).
I agree, it's a a bit very picky to fix this, now that I think about it
-- coding on muds gets you this reflexive habit lest you summon the lag
monster. LPC MUDS are single threaded and Objective C is interpreted,
and every object has a computational limit per heartbeat and the driver
removes objects that time out before completing from the execution list
as irretrievably broken.
So, if you're doing anything 'fancy', you often end up staggering
executions over a number of game turns, and every even so small
inefficiency counts because it all adds up and the entire game is affected.
The linux kernel (linux-3.8.5) end of the syscall:
return tiocswinsz(real_tty, p);
static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
return err ? -EFAULT: 0;
The freebsd 9.1 kernel code:
/* Obtain window size. */
*(struct winsize*)data = tp->t_winsize;
ttioctl(tp, cmd, data, flag)
register struct tty *tp;
/* <snip> */
case TIOCGWINSZ: /* get window size */
*(struct winsize *)data = tp->t_winsize;
/* <snip> */
Received on 2013-04-06 14:02:26 CEST