aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/drivers/win32/ttsl_drv.c
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2014-06-26 18:55:47 +0200
committerLukas Larsson <[email protected]>2014-10-16 17:56:16 +0200
commit48083e54b502afb2768066394074d29423162dc8 (patch)
tree00edbcd4e486ac47a61a701d3f0cc6f2e3004156 /erts/emulator/drivers/win32/ttsl_drv.c
parent5ab275d6554f4db877624a152dda90c0e3c4cddc (diff)
downloadotp-48083e54b502afb2768066394074d29423162dc8.tar.gz
otp-48083e54b502afb2768066394074d29423162dc8.tar.bz2
otp-48083e54b502afb2768066394074d29423162dc8.zip
kernel,ssh: Add synchronous user_drv protocol
Added a put_chars_sync to the protocol that can be used to talk to user_drv and made group use it. This is needed in order to guarantee that bytes has been pushed to the tty port when doing something like this: io:format("halting\n"),erlang:halt(0). Before this change the halting message could be lost in the message queue of the user_drv process, this is no longer possible. This commit also fixes ssh_cli as that plugs itself in as a user_drv process. OTP-12240
Diffstat (limited to 'erts/emulator/drivers/win32/ttsl_drv.c')
-rw-r--r--erts/emulator/drivers/win32/ttsl_drv.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/erts/emulator/drivers/win32/ttsl_drv.c b/erts/emulator/drivers/win32/ttsl_drv.c
index 502cb58dfa..851c336a11 100644
--- a/erts/emulator/drivers/win32/ttsl_drv.c
+++ b/erts/emulator/drivers/win32/ttsl_drv.c
@@ -46,6 +46,7 @@ static int rows; /* Number of rows available. */
#define OP_INSC 2
#define OP_DELC 3
#define OP_BEEP 4
+#define OP_PUTC_SYNC 5
/* Control op */
#define CTRL_OP_GET_WINSIZE 100
@@ -458,6 +459,7 @@ static void ttysl_from_erlang(ErlDrvData ttysl_data, char* buf, ErlDrvSizeT coun
switch (buf[0]) {
case OP_PUTC:
+ case OP_PUTC_SYNC:
DEBUGLOG(("OP: Putc(%I64u)",(unsigned long long)count-1));
if (check_buf_size((byte*)buf+1, count-1) == 0)
return;
@@ -481,6 +483,20 @@ static void ttysl_from_erlang(ErlDrvData ttysl_data, char* buf, ErlDrvSizeT coun
/* Unknown op, just ignore. */
break;
}
+
+ if (buf[0] == OP_PUTC_SYNC) {
+ /* On windows we do a blocking write to the tty so we just
+ send the ack immidiately. If at some point in the future
+ someone has a problem with tty output being blocking
+ this has to be changed. */
+ ErlDrvTermData spec[] = {
+ ERL_DRV_PORT, driver_mk_port(ttysl_port),
+ ERL_DRV_ATOM, driver_mk_atom("ok"),
+ ERL_DRV_TUPLE, 2
+ };
+ erl_drv_output_term(driver_mk_port(ttysl_port), spec,
+ sizeof(spec) / sizeof(spec[0]));
+ }
return;
}