File 0237-erts-Fix-trace_SUITE-system_monitor_long_schedule-tc.patch of Package erlang

From 31658e82cd5c2f4e49a6dd8f0a18455bc79fb31f Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Mon, 16 Sep 2019 11:23:10 +0200
Subject: [PATCH] erts: Fix trace_SUITE:system_monitor_long_schedule tc

---
 erts/emulator/test/trace_SUITE.erl               |  5 +-
 erts/emulator/test/trace_SUITE_data/Makefile.src |  3 +
 erts/emulator/test/trace_SUITE_data/slow_drv.c   | 94 ++++++++++++++++++++++++
 3 files changed, 99 insertions(+), 3 deletions(-)
 create mode 100644 erts/emulator/test/trace_SUITE_data/Makefile.src
 create mode 100644 erts/emulator/test/trace_SUITE_data/slow_drv.c

diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl
index c2d5cd7023..871b2f7a03 100644
--- a/erts/emulator/test/trace_SUITE.erl
+++ b/erts/emulator/test/trace_SUITE.erl
@@ -958,15 +958,14 @@ do_system_monitor_long_schedule() ->
         {Self,L} when is_list(L) ->
             ok
     after 1000 ->
-              ct:fail(no_trace_of_pid)
+            ct:fail(no_trace_of_pid)
     end,
     "ok" = erlang:port_control(Port,1,[]),
-    "ok" = erlang:port_control(Port,2,[]),
     receive
         {Port,LL} when is_list(LL) ->
             ok
     after 1000 ->
-              ct:fail(no_trace_of_port)
+            ct:fail(no_trace_of_port)
     end,
     port_close(Port),
     erlang:system_monitor(undefined),
diff --git a/erts/emulator/test/trace_SUITE_data/Makefile.src b/erts/emulator/test/trace_SUITE_data/Makefile.src
new file mode 100644
index 0000000000..645107d7b0
--- /dev/null
+++ b/erts/emulator/test/trace_SUITE_data/Makefile.src
@@ -0,0 +1,3 @@
+all: slow_drv@dll@
+
+@SHLIB_RULES@
diff --git a/erts/emulator/test/trace_SUITE_data/slow_drv.c b/erts/emulator/test/trace_SUITE_data/slow_drv.c
new file mode 100644
index 0000000000..5e26772f64
--- /dev/null
+++ b/erts/emulator/test/trace_SUITE_data/slow_drv.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include "erl_driver.h"
+
+typedef struct _erl_drv_data {
+    ErlDrvPort   erlang_port;
+} EchoDrvData;
+
+static EchoDrvData slow_drv_data, *slow_drv_data_p;
+
+static EchoDrvData *slow_drv_start(ErlDrvPort port, char *command);
+static void         slow_drv_stop(EchoDrvData *data_p);
+static void         slow_drv_output(ErlDrvData drv_data, char *buf,
+				    ErlDrvSizeT len);
+static ErlDrvSSizeT slow_drv_control(ErlDrvData drv_data, unsigned int command,
+                                     char *buf, ErlDrvSizeT len,
+                                     char **rbuf, ErlDrvSizeT rlen);
+static void         slow_drv_timeout(ErlDrvData drv_data);
+static void         slow_drv_finish(void);
+
+static ErlDrvEntry slow_drv_entry = { 
+    NULL, /* init */
+    slow_drv_start,
+    slow_drv_stop,
+    slow_drv_output,
+    NULL, /* ready_input */
+    NULL, /* ready_output */
+    "slow_drv",
+    slow_drv_finish,
+    NULL, /* handle */
+    slow_drv_control, /* control */
+    slow_drv_timeout, /* timeout */
+    NULL, /* outputv */
+    NULL,  /* ready_async */
+    NULL,
+    NULL,
+    NULL,
+    ERL_DRV_EXTENDED_MARKER,
+    ERL_DRV_EXTENDED_MAJOR_VERSION,
+    ERL_DRV_EXTENDED_MINOR_VERSION,
+    0,
+    NULL,
+    NULL,
+    NULL
+
+};
+
+DRIVER_INIT(slow_drv)
+{
+    slow_drv_data_p = NULL;
+    return &slow_drv_entry;
+}
+
+static EchoDrvData *slow_drv_start(ErlDrvPort port, char *command)
+{
+    if (slow_drv_data_p != NULL) {
+	return ERL_DRV_ERROR_GENERAL;
+    }
+    slow_drv_data_p = &slow_drv_data;
+    slow_drv_data_p->erlang_port = port;
+    return slow_drv_data_p;
+}
+
+static void slow_drv_stop(EchoDrvData *data_p) {
+    slow_drv_data_p = NULL;
+}
+
+static void slow_drv_output(ErlDrvData drv_data, char *buf, ErlDrvSizeT len) {
+    EchoDrvData* data_p = (EchoDrvData *) drv_data;
+    driver_output(data_p->erlang_port, buf, len);
+}
+
+static ErlDrvSSizeT slow_drv_control(ErlDrvData drv_data, unsigned int command,
+                                     char *buf, ErlDrvSizeT len,
+                                     char **rbuf, ErlDrvSizeT rlen)
+{
+    EchoDrvData* data_p = (EchoDrvData *) drv_data;
+    memcpy(*rbuf,"ok",2);
+    if (command == 1) {
+        driver_set_timer(data_p->erlang_port, 0);
+    } else {
+        slow_drv_timeout(drv_data);
+    }
+    return 2;
+}
+
+static void slow_drv_timeout(ErlDrvData drv_data)
+{
+    /* Sleep for 500 msec */
+    usleep(150000);
+}
+
+static void slow_drv_finish() {
+    slow_drv_data_p = NULL;
+}
-- 
2.16.4

openSUSE Build Service is sponsored by