From 1bad9713611010563deb083c631c7dfe32682acf Mon Sep 17 00:00:00 2001
From: "martin.holst@gmail.com"
 <martin.holst@gmail.com@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Date: Thu, 6 Jun 2013 18:30:00 +0000
Subject: [PATCH] Fixed so storeCommand/getCommand are multithread-safe (at
 least dual-thread). Hopefully.
 http://www.proxmark.org/forum/viewtopic.php?pid=7400#p7400

---
 client/cmdmain.c | 21 ++++-----------------
 1 file changed, 4 insertions(+), 17 deletions(-)

diff --git a/client/cmdmain.c b/client/cmdmain.c
index 85a0e0ca..972558c3 100644
--- a/client/cmdmain.c
+++ b/client/cmdmain.c
@@ -39,7 +39,7 @@ static UsbCommand cmdBuffer[CMD_BUFFER_SIZE];
 //Points to the next empty position to write to
 static int cmd_head;//Starts as 0
 //Points to the position of the last unread command
-static int cmd_tail = -1;//Starts as -1
+static int cmd_tail;//Starts as 0
 
 static command_t CommandTable[] = 
 {
@@ -211,7 +211,7 @@ void UsbCommandReceived(UsbCommand *UC)
  */
 void storeCommand(UsbCommand *command)
 {
-    if(cmd_head == cmd_tail)
+    if( ( cmd_head+1) % CMD_BUFFER_SIZE == cmd_tail)
     {
         //If these two are equal, we're about to overwrite in the
         // circular buffer.
@@ -221,14 +221,7 @@ void storeCommand(UsbCommand *command)
     UsbCommand* destination = &cmdBuffer[cmd_head];
     memcpy(destination, command, sizeof(UsbCommand));
 
-    //Also, if cmd_tail is still -1 because the buffer was
-    // previously empty, set it to head
-    if(cmd_tail < 0) {
-        cmd_tail = cmd_head;
-    }
-
-    cmd_head++; //increment head
-    cmd_head %= CMD_BUFFER_SIZE;//wrap around
+    cmd_head = (cmd_head +1) % CMD_BUFFER_SIZE; //increment head and wrap
 
 }
 /**
@@ -239,7 +232,7 @@ void storeCommand(UsbCommand *command)
 int getCommand(UsbCommand* response)
 {
     //If head == tail, there's nothing to read, or if we just got initialized
-    if(cmd_head == cmd_tail || cmd_tail == -1){
+    if(cmd_head == cmd_tail){
         return 0;
     }
     //Pick out the next unread command
@@ -247,12 +240,6 @@ int getCommand(UsbCommand* response)
     memcpy(response, last_unread, sizeof(UsbCommand));
     //Increment tail - this is a circular buffer, so modulo buffer size
     cmd_tail = (cmd_tail +1 ) % CMD_BUFFER_SIZE;
-    //In order to detect when the buffer overwrites itself, we set the
-    // tail to -1 whenever it 'catches up' with head : this means the buffer is empty.
-    // Otherwise, head==tail could mean both: either empty or full.
-    if(cmd_tail == cmd_head){
-        cmd_tail = -1 ;
-    }
 
     return 1;
 
-- 
2.39.5