aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/trace_port_SUITE_data/echo_drv.c
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2015-07-06 21:14:23 +0200
committerErlang/OTP <[email protected]>2015-07-06 21:14:23 +0200
commit41bfee8dbc7127417c8d28e5189f33179908ea46 (patch)
tree63f715052609f4fc6390dc244b2bcc66eac80a0d /erts/emulator/test/trace_port_SUITE_data/echo_drv.c
parent99d3e9c5b2569169d2f5fefd67898d2533e5a83d (diff)
parente98fb1920ad053d2db4594c5d33cdfcfcdc6d771 (diff)
downloadotp-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.c12
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;
}