]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/serial/SerialDispatcherP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / serial / SerialDispatcherP.nc
index 5f1a9b6badae105959668534a25d22f25964d16c..fd2946b19ab33424ad271e944c92bd1980b85825 100644 (file)
@@ -75,14 +75,14 @@ implementation {
 
   /* This component provides double buffering. */
   message_t messages[2];     // buffer allocation
-  message_t* messagePtrs[2] = { &messages[0], &messages[1]};
+  message_t* ONE messagePtrs[2] = { &messages[0], &messages[1]};
   
   // We store a separate receiveBuffer variable because indexing
   // into a pointer array can be costly, and handling interrupts
   // is time critical.
-  uint8_t* receiveBuffer = (uint8_t*)(&messages[0]);
+  uint8_t* COUNT_NOK(sizeof(message_t)) receiveBuffer = (uint8_t* COUNT_NOK(sizeof(message_t)))(&messages[0]);
 
-  uint8_t *sendBuffer = NULL;
+  uint8_t *COUNT_NOK(sizeof(message_t)) sendBuffer = NULL;
   send_state_t sendState = SEND_STATE_IDLE;
   uint8_t sendLen = 0;
   uint8_t sendIndex = 0;
@@ -94,7 +94,7 @@ implementation {
   uint8_t receiveTaskPending = FALSE;
   uart_id_t receiveTaskType = 0;
   uint8_t receiveTaskWhich;
-  message_t *receiveTaskBuf = NULL;
+  message_t * ONE_NOK receiveTaskBuf = NULL;
   uint8_t receiveTaskSize = 0;
 
   command error_t Send.send[uint8_t id](message_t* msg, uint8_t len) {
@@ -186,7 +186,7 @@ implementation {
   }
 
   bool isCurrentBufferLocked() {
-    return (receiveState.which)? receiveState.bufZeroLocked : receiveState.bufOneLocked;
+    return (receiveState.which)? receiveState.bufOneLocked : receiveState.bufZeroLocked;
   }
 
   void lockCurrentBuffer() {
@@ -294,6 +294,9 @@ implementation {
         receiveTaskSize = recvIndex;
         receiveBufferSwap();
         receiveState.state = RECV_STATE_IDLE;
+      } else {
+        // we can't deliver the packet, better free the current buffer.
+        unlockBuffer(receiveState.which);
       }
     }
     if (postsignalreceive){