File 1220-wx-Fix-driver-command-queue.patch of Package erlang

From 5c3d447c95d55c9c7da2dd69569549992e3fd741 Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Wed, 11 May 2016 10:02:48 +0200
Subject: [PATCH 1/3] wx: Fix driver command queue

The command queue could still loose a cmd because the command was
reused while still in (recursive) use, thus when deleting it after
command was done a newly added command could be mistakenly deleted and
not called.

Root cause was that wxeFifo::Strip "deleted" to many cmds.

Solve by differing deleted and executed, i.e. op= -1 cmd have been
executed and op = -2 cmd have been executed and deleted.
---
 lib/wx/c_src/wxe_helpers.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/wx/c_src/wxe_helpers.cpp b/lib/wx/c_src/wxe_helpers.cpp
index 4798e60..d1f607d 100644
--- a/lib/wx/c_src/wxe_helpers.cpp
+++ b/lib/wx/c_src/wxe_helpers.cpp
@@ -48,7 +48,7 @@ void wxeCommand::Delete()
       driver_free(buffer);
     buffer = NULL;
   }
-  op = -1;
+  op = -2;
 }
 
 /* ****************************************************************************
@@ -84,7 +84,7 @@ wxeCommand * wxeFifo::Get()
     pos = m_first++;
     m_n--;
     m_first %= m_max;
-  } while(m_q[pos].op == -1);
+  } while(m_q[pos].op < 0);
   return &m_q[pos];
 }
 
@@ -96,7 +96,7 @@ wxeCommand * wxeFifo::Peek(unsigned int *i)
       return NULL;
     pos = (m_first+*i) % m_max;
     (*i)++;
-  } while(m_q[pos].op == -1);
+  } while(m_q[pos].op < 0);
   return &m_q[pos];
 }
 
@@ -213,7 +213,7 @@ void wxeFifo::Realloc()
 // Strip end of queue if ops are already taken care of, avoids reallocs
 void wxeFifo::Strip()
 {
-  while((m_n > 0) && (m_q[(m_first + m_n - 1)%m_max].op == -1)) {
+  while((m_n > 0) && (m_q[(m_first + m_n - 1)%m_max].op < -1)) {
     m_n--;
   }
 }
-- 
2.1.4

openSUSE Build Service is sponsored by