From: martin.holst@gmail.com Date: Thu, 6 Jun 2013 18:30:00 +0000 (+0000) Subject: Fixed so storeCommand/getCommand are multithread-safe (at least dual-thread). Hopeful... X-Git-Tag: v1.0.0~89 X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/1bad9713611010563deb083c631c7dfe32682acf Fixed so storeCommand/getCommand are multithread-safe (at least dual-thread). Hopefully. http://www.proxmark.org/forum/viewtopic.php?pid=7400#p7400 --- 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;