aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/trace_port_SUITE_data/echo_drv.c
diff options
context:
space:
mode:
authorZandra Hird <[email protected]>2015-07-07 15:17:10 +0200
committerZandra Hird <[email protected]>2015-07-07 15:17:10 +0200
commit832aa9e06aced4975c9cb02257f74827602217aa (patch)
tree4f5e5263bd6e578fe6fa2a619bfd3bec9a0c512b /erts/emulator/test/trace_port_SUITE_data/echo_drv.c
parentddc7ce9124a8fb03bb95b5d550812c34f4177946 (diff)
parent12002949e5435d19c750fe2cd8e897b4059f875a (diff)
downloadotp-832aa9e06aced4975c9cb02257f74827602217aa.tar.gz
otp-832aa9e06aced4975c9cb02257f74827602217aa.tar.bz2
otp-832aa9e06aced4975c9cb02257f74827602217aa.zip
Merge branch 'maint-17' into maint
Conflicts: OTP_VERSION erts/doc/src/notes.xml erts/vsn.mk lib/runtime_tools/doc/src/notes.xml lib/runtime_tools/vsn.mk otp_versions.table
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;
}