diff options
author | Stefan Zegenhagen <[email protected]> | 2013-05-29 16:50:43 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2013-07-22 11:27:36 +0200 |
commit | 02986f8623e02b5afba41f7f593710e74b3c8a7f (patch) | |
tree | 1e5a14930b7ab7526ceb20b93de3b070be25b1bc | |
parent | 3c12a584fc8b88625902342747c7b3d8a3eb06b3 (diff) | |
download | otp-02986f8623e02b5afba41f7f593710e74b3c8a7f.tar.gz otp-02986f8623e02b5afba41f7f593710e74b3c8a7f.tar.bz2 otp-02986f8623e02b5afba41f7f593710e74b3c8a7f.zip |
Fix changing terminal parameters in to_erl
One of our devices does not like 'to_erl' to be run over a serial port.
When to_erl is started, we see "Attaching to /tm<0xFF>" being printed
and the device then refuses to accept any input. Occasionally, we have
seen a linux kernel error message "serial8250: too much work for irq16"
simultaneously. After some debugging we found out that cause is a call
to tcsetattr() by to_erl, immediately preceeded by some printf().
The UART in our device doesn't like hardware parameters to be changed
while output is concurrently active. In fact, the GNU libc manual also
mentions that it might be dangerous to change UART hardware parameters
when a transmission is ongoing.
The patch attached to this e-mail changes the behaviour of to_erl to use
TCSADRAIN instead of TCSANOW when changing terminal parameters. This
makes the serial driver wait for the output queues to be empty before
applying the terminal parameter change.
-rw-r--r-- | erts/etc/unix/to_erl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/erts/etc/unix/to_erl.c b/erts/etc/unix/to_erl.c index 094006c5fd..5a8c9f77d4 100644 --- a/erts/etc/unix/to_erl.c +++ b/erts/etc/unix/to_erl.c @@ -339,7 +339,7 @@ int main(int argc, char **argv) tty_smode.c_cc[VTIME] =0;/* Note that VTIME is the same as VEOL! */ tty_smode.c_cc[VINTR] =3; - tcsetattr(0, TCSANOW, &tty_smode); + tcsetattr(0, TCSADRAIN, &tty_smode); #ifdef DEBUG show_terminal_settings(&tty_smode); @@ -484,7 +484,7 @@ int main(int argc, char **argv) * Reset terminal characterstics * XXX */ - tcsetattr(0, TCSANOW, &tty_rmode); + tcsetattr(0, TCSADRAIN, &tty_rmode); return 0; } |