diff options
author | Kevin Ballard <kevin@sb.org> | 2014-08-24 00:59:03 -0700 |
---|---|---|
committer | Kevin Ballard <kevin@sb.org> | 2014-08-29 12:46:03 -0700 |
commit | cc52a59e1ac7155123a314067cc8ad9f3affe491 (patch) | |
tree | 26a24c179ad7f6e8bfe59e77a8f59b53520f7d07 /tests/read.out | |
parent | 24ac7d2698c06792cc78a82bb06f41fcdeb0934c (diff) |
Rework how screen size is tracked
The screen size is fetched after a SIGWINCH is delivered. The current
implementation has two issues:
* It calls ioctl() from the SIGWINCH signal handler, despite ioctl() not
being a function that is known to be safe to call.
* It's not thread-safe.
Signals can be delivered on arbitrary threads, so we don't know if it's
actually safe to be modifying the cached winsize in response to a
signal. It's also plausible that the winsize may be requested from a
background thread.
To solve the first issue, we twiddle a volatile boolean flag in the
signal handler and defer the ioctl() call until we actually request the
screen size.
To solve the second issue, we introduce a pthread rwlock around the
cached winsize. A rwlock is used because it can be expected that there
are likely to be far more window size reads than window size writes. If
we were using C++11 we could probably get away with atomics, but since
we don't have that (or boost), a rwlock should suffice.
Fixes #1613.
Diffstat (limited to 'tests/read.out')
0 files changed, 0 insertions, 0 deletions