diff options
author | Erlang/OTP <[email protected]> | 2015-07-06 21:14:23 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2015-07-06 21:14:23 +0200 |
commit | 41bfee8dbc7127417c8d28e5189f33179908ea46 (patch) | |
tree | 63f715052609f4fc6390dc244b2bcc66eac80a0d /erts/emulator/test/trace_port_SUITE_data/echo_drv.c | |
parent | 99d3e9c5b2569169d2f5fefd67898d2533e5a83d (diff) | |
parent | e98fb1920ad053d2db4594c5d33cdfcfcdc6d771 (diff) | |
download | otp-41bfee8dbc7127417c8d28e5189f33179908ea46.tar.gz otp-41bfee8dbc7127417c8d28e5189f33179908ea46.tar.bz2 otp-41bfee8dbc7127417c8d28e5189f33179908ea46.zip |
Merge branch 'rickard/non-smp-trace-port-exit-bug/OTP-12889' into maint-17
* rickard/non-smp-trace-port-exit-bug/OTP-12889:
Teach non-smp VM how to deal with trace port crash
Test case testing crash in tracer port
Diffstat (limited to 'erts/emulator/test/trace_port_SUITE_data/echo_drv.c')
-rw-r--r-- | erts/emulator/test/trace_port_SUITE_data/echo_drv.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/erts/emulator/test/trace_port_SUITE_data/echo_drv.c b/erts/emulator/test/trace_port_SUITE_data/echo_drv.c index a8d4ede4fe..e40b9193ea 100644 --- a/erts/emulator/test/trace_port_SUITE_data/echo_drv.c +++ b/erts/emulator/test/trace_port_SUITE_data/echo_drv.c @@ -1,5 +1,6 @@ #include <stdio.h> #include "erl_driver.h" +#include <errno.h> @@ -14,6 +15,7 @@ enum e_heavy { typedef struct _erl_drv_data { ErlDrvPort erlang_port; enum e_heavy heavy; + int crash; } EchoDrvData; static EchoDrvData echo_drv_data, *echo_drv_data_p; @@ -78,6 +80,7 @@ static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command) echo_drv_data_p = &echo_drv_data; echo_drv_data_p->erlang_port = port; echo_drv_data_p->heavy = heavy_off; + echo_drv_data_p->crash = 0; return echo_drv_data_p; } @@ -87,6 +90,12 @@ static void echo_drv_stop(EchoDrvData *data_p) { static void echo_drv_output(ErlDrvData drv_data, char *buf, ErlDrvSizeT len) { EchoDrvData* data_p = (EchoDrvData *) drv_data; + + if (data_p->crash) { + driver_failure_posix(data_p->erlang_port, EINTR); + return; + } + driver_output(data_p->erlang_port, buf, len); switch (data_p->heavy) { case heavy_off: @@ -100,6 +109,7 @@ static void echo_drv_output(ErlDrvData drv_data, char *buf, ErlDrvSizeT len) { data_p->heavy = heavy_off; break; } + } static void echo_drv_finish() { @@ -115,6 +125,8 @@ static ErlDrvSSizeT echo_drv_control(ErlDrvData drv_data, case 'h': data_p->heavy = heavy_set; break; + case 'c': + data_p->crash = 1; } return 0; } |