aboutsummaryrefslogtreecommitdiffstats
path: root/erts/etc/unix/to_erl.c
diff options
context:
space:
mode:
authorStefan Zegenhagen <[email protected]>2013-05-29 16:50:43 +0200
committerBjörn-Egil Dahlberg <[email protected]>2013-07-22 11:27:36 +0200
commit02986f8623e02b5afba41f7f593710e74b3c8a7f (patch)
tree1e5a14930b7ab7526ceb20b93de3b070be25b1bc /erts/etc/unix/to_erl.c
parent3c12a584fc8b88625902342747c7b3d8a3eb06b3 (diff)
downloadotp-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.
Diffstat (limited to 'erts/etc/unix/to_erl.c')
-rw-r--r--erts/etc/unix/to_erl.c4
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;
}