A new user interface for you! Read more...

File 0504-Don-t-try-to-wake-up-wx-thread-when-not-necessary.patch of Package erlang

From 1ec09d6d239194689a95a0f0111d751d9a57e407 Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Thu, 6 Dec 2018 21:50:46 +0100
Subject: [PATCH] Don't try to wake up wx thread when not necessary

That kills performance on at least windows when a the load goes up and
a lot of commands is sent to the driver.
---
 lib/wx/c_src/wxe_helpers.cpp | 3 ++-
 lib/wx/c_src/wxe_helpers.h   | 2 +-
 lib/wx/c_src/wxe_impl.cpp    | 4 ++--
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/lib/wx/c_src/wxe_helpers.cpp b/lib/wx/c_src/wxe_helpers.cpp
index d1f607d2af..47955494f9 100644
--- a/lib/wx/c_src/wxe_helpers.cpp
+++ b/lib/wx/c_src/wxe_helpers.cpp
@@ -101,7 +101,7 @@ wxeCommand * wxeFifo::Peek(unsigned int *i)
 }
 
 
-void wxeFifo::Add(int fc, char * cbuf,int buflen, wxe_data *sd)
+int wxeFifo::Add(int fc, char * cbuf,int buflen, wxe_data *sd)
 {
   unsigned int pos;
   wxeCommand *curr;
@@ -144,6 +144,7 @@ void wxeFifo::Add(int fc, char * cbuf,int buflen, wxe_data *sd)
   } else {   // No-op only PING currently
     curr->buffer = NULL;
   }
+  return m_n;
 }
 
 void wxeFifo::Append(wxeCommand *orig)
diff --git a/lib/wx/c_src/wxe_helpers.h b/lib/wx/c_src/wxe_helpers.h
index 70ffccdc13..a6c00e5aca 100644
--- a/lib/wx/c_src/wxe_helpers.h
+++ b/lib/wx/c_src/wxe_helpers.h
@@ -63,7 +63,7 @@ class wxeFifo {
     wxeFifo(unsigned int size);
     virtual ~wxeFifo();
 
-    void Add(int fc, char * cbuf,int buflen, wxe_data *);
+    int Add(int fc, char * cbuf,int buflen, wxe_data *);
     void Append(wxeCommand *Other);
 
     wxeCommand * Get();
diff --git a/lib/wx/c_src/wxe_impl.cpp b/lib/wx/c_src/wxe_impl.cpp
index f856099ffa..bd22502d00 100644
--- a/lib/wx/c_src/wxe_impl.cpp
+++ b/lib/wx/c_src/wxe_impl.cpp
@@ -70,7 +70,7 @@ void push_command(int op,char * buf,int len, wxe_data *sd)
   /* fprintf(stderr, "Op %d %d [%ld] %d\r\n", op, (int) driver_caller(sd->port_handle),
      wxe_batch->size(), wxe_batch_caller),fflush(stderr); */
   erl_drv_mutex_lock(wxe_batch_locker_m);
-  wxe_queue->Add(op, buf, len, sd);
+  int n = wxe_queue->Add(op, buf, len, sd);
 
   if(wxe_needs_signal) {
     // wx-thread is waiting on batch end in cond_wait
@@ -79,7 +79,7 @@ void push_command(int op,char * buf,int len, wxe_data *sd)
   } else {
     // wx-thread is waiting gui-events
     erl_drv_mutex_unlock(wxe_batch_locker_m);
-    wxWakeUpIdle();
+    if(n < 2) wxWakeUpIdle();
   }
 }
 
-- 
2.16.4