diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/emulator/test/trace_port_SUITE_data | |
download | otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2 otp-84adefa331c4159d432d22840663c38f155cd4c1.zip |
The R13B03 release.OTP_R13B03
Diffstat (limited to 'erts/emulator/test/trace_port_SUITE_data')
-rw-r--r-- | erts/emulator/test/trace_port_SUITE_data/Makefile.src | 3 | ||||
-rw-r--r-- | erts/emulator/test/trace_port_SUITE_data/echo_drv.c | 107 |
2 files changed, 110 insertions, 0 deletions
diff --git a/erts/emulator/test/trace_port_SUITE_data/Makefile.src b/erts/emulator/test/trace_port_SUITE_data/Makefile.src new file mode 100644 index 0000000000..c1bf142ccf --- /dev/null +++ b/erts/emulator/test/trace_port_SUITE_data/Makefile.src @@ -0,0 +1,3 @@ +all: echo_drv@dll@ + +@SHLIB_RULES@ diff --git a/erts/emulator/test/trace_port_SUITE_data/echo_drv.c b/erts/emulator/test/trace_port_SUITE_data/echo_drv.c new file mode 100644 index 0000000000..15c4ca11fe --- /dev/null +++ b/erts/emulator/test/trace_port_SUITE_data/echo_drv.c @@ -0,0 +1,107 @@ +#include <stdio.h> +#include "erl_driver.h" + + + +/* ------------------------------------------------------------------------- +** Data types +**/ + +enum e_heavy { + heavy_off, heavy_set, heavy_reset +}; + +typedef struct _erl_drv_data { + ErlDrvPort erlang_port; + enum e_heavy heavy; +} EchoDrvData; + +static EchoDrvData echo_drv_data, *echo_drv_data_p; + + + +/* ------------------------------------------------------------------------- +** Entry struct +**/ + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command); +static void echo_drv_stop(EchoDrvData *data_p); +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len); +static void echo_drv_finish(void); +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen); + +static ErlDrvEntry echo_drv_entry = { + NULL, /* init */ + echo_drv_start, + echo_drv_stop, + echo_drv_output, + NULL, /* ready_input */ + NULL, /* ready_output */ + "echo_drv", + echo_drv_finish, + NULL, /* handle */ + echo_drv_control, + NULL, /* timeout */ + NULL, /* outputv */ + NULL /* ready_async */ +}; + + + +/* ------------------------------------------------------------------------- +** Entry functions +**/ + +DRIVER_INIT(echo_drv) +{ + echo_drv_data_p = NULL; + return &echo_drv_entry; +} + +static EchoDrvData *echo_drv_start(ErlDrvPort port, char *command) +{ + if (echo_drv_data_p != NULL) { + return ERL_DRV_ERROR_GENERAL; + } + echo_drv_data_p = &echo_drv_data; + echo_drv_data_p->erlang_port = port; + echo_drv_data_p->heavy = heavy_off; + return echo_drv_data_p; +} + +static void echo_drv_stop(EchoDrvData *data_p) { + echo_drv_data_p = NULL; +} + +static void echo_drv_output(EchoDrvData *data_p, char *buf, int len) { + driver_output(data_p->erlang_port, buf, len); + switch (data_p->heavy) { + case heavy_off: + break; + case heavy_set: + set_port_control_flags(data_p->erlang_port, PORT_CONTROL_FLAG_HEAVY); + data_p->heavy = heavy_reset; + break; + case heavy_reset: + set_port_control_flags(data_p->erlang_port, 0); + data_p->heavy = heavy_off; + break; + } +} + +static void echo_drv_finish() { + echo_drv_data_p = NULL; +} + +static int echo_drv_control(EchoDrvData *data_p, unsigned int command, + char *buf, int len, + char **rbuf, int rlen) { + switch (command) { + case 'h': + data_p->heavy = heavy_set; + break; + } + return 0; +} |