[Tinyos-2-commits] CVS: tinyos-2.x/support/sdk/cpp/sf tcpcomm.h, 1.3, 1.4 tcpcomm.cpp, 1.5, 1.6 sfpacket.cpp, 1.2, 1.3 serialcomm.h, 1.2, 1.3 serialcomm.cpp, 1.3, 1.4 packetbuffer.h, 1.2, 1.3 packetbuffer.cpp, 1.2, 1.3 basecomm.h, 1.2, 1.3 basecomm.cpp, 1.2, 1.3

akoepke andreaskoepke at users.sourceforge.net
Mon Apr 21 12:57:49 PDT 2008


Update of /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv11422

Modified Files:
	tcpcomm.h tcpcomm.cpp sfpacket.cpp serialcomm.h serialcomm.cpp 
	packetbuffer.h packetbuffer.cpp basecomm.h basecomm.cpp 
Log Message:
- pass errno across interface
- do not cancel threads that are not running
- exit on write failures (just as we do for read failures)


Index: tcpcomm.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/tcpcomm.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** tcpcomm.h	21 Sep 2007 14:01:13 -0000	1.3
--- tcpcomm.h	21 Apr 2008 19:57:46 -0000	1.4
***************
*** 139,143 ****
  protected:
      /* performs blocking write on fd */
!     virtual int writeFD(int fd, const char *buffer, int count);
  
      /* checks SF client protocol version */
--- 139,143 ----
  protected:
      /* performs blocking write on fd */
!     virtual int writeFD(int fd, const char *buffer, int count, int *err);
  
      /* checks SF client protocol version */

Index: tcpcomm.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/tcpcomm.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** tcpcomm.cpp	21 Sep 2007 15:43:22 -0000	1.5
--- tcpcomm.cpp	21 Apr 2008 19:57:47 -0000	1.6
***************
*** 58,62 ****
  /* opens tcp server port for listening and start threads*/
  TCPComm::TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), errorReported(false), errorMsg(""), control(pControl)
! {
      // init values
      writerThreadRunning = false;
--- 58,62 ----
  /* opens tcp server port for listening and start threads*/
  TCPComm::TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), errorReported(false), errorMsg(""), control(pControl)
! {   
      // init values
      writerThreadRunning = false;
***************
*** 68,71 ****
--- 68,72 ----
      writtenPacketCount = 0;
      port = pPort;
+     
      pthread_mutex_init(&clientInfo.sleeplock, NULL);
      pthread_mutex_init(&clientInfo.countlock, NULL);
***************
*** 162,167 ****
      char l;
      char* buffer[SFPacket::getMaxPayloadLength()];
! 
!     if (readFD(pFD, &l, 1) != 1)
      {
          return false;
--- 163,169 ----
      char l;
      char* buffer[SFPacket::getMaxPayloadLength()];
!     int err;
!     
!     if (readFD(pFD, &l, 1, &err) != 1)
      {
          return false;
***************
*** 171,175 ****
          return false;
      }
!     if (readFD(pFD, (char*) buffer, static_cast<int>(l)) != l)
      {
          return false;
--- 173,177 ----
          return false;
      }
!     if (readFD(pFD, (char*) buffer, static_cast<int>(l), &err) != l)
      {
          return false;
***************
*** 185,189 ****
  }
  
! int TCPComm::writeFD(int fd, const char *buffer, int count)
  {
      int actual = 0;
--- 187,191 ----
  }
  
! int TCPComm::writeFD(int fd, const char *buffer, int count, int *err)
  {
      int actual = 0;
***************
*** 195,200 ****
          int n = send(fd, buffer, count, MSG_NOSIGNAL);
  #endif
!         if (n == -1)
!         {
              return -1;
          }
--- 197,202 ----
          int n = send(fd, buffer, count, MSG_NOSIGNAL);
  #endif
!         if (n == -1) {
!             *err = errno;
              return -1;
          }
***************
*** 210,218 ****
  {
      char len = pPacket.getLength();
!     if (writeFD(pFD, &len, 1) != 1)
      {
          return false;
      }
!     if (writeFD(pFD, pPacket.getPayload(), len) != len)
      {
          return false;
--- 212,221 ----
  {
      char len = pPacket.getLength();
!     int err;
!     if (writeFD(pFD, &len, 1, &err) != 1)
      {
          return false;
      }
!     if (writeFD(pFD, pPacket.getPayload(), len, &err) != len)
      {
          return false;
***************
*** 226,238 ****
      char check[2], us[2];
      int version;
! 
      /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */
      us[0] = 'U';
      us[1] = ' ';
!     if (writeFD(clientFD, us, 2) != 2)
      {
          return false;
      }
!     if (readFD(clientFD, check, 2) != 2)
      {
          return false;
--- 229,242 ----
      char check[2], us[2];
      int version;
!     int err = 0;
      /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */
      us[0] = 'U';
      us[1] = ' ';
!     
!     if (writeFD(clientFD, us, 2, &err) != 2)
      {
          return false;
      }
!     if (readFD(clientFD, check, 2, &err) != 2)
      {
          return false;
***************
*** 396,407 ****
                  {
                      SFPacket packet;
!                     if (readPacket(*it, packet))
!                     {
                          // this call blocks until buffer is not full
                          readBuffer.enqueueBack(packet);
                          ++readPacketCount;
                      }
!                     else
!                     {
                          DEBUG("TCPComm::readClients : removeClient")
                          removeClient(*it);
--- 400,409 ----
                  {
                      SFPacket packet;
!                     if(readPacket(*it, packet)) {
                          // this call blocks until buffer is not full
                          readBuffer.enqueueBack(packet);
                          ++readPacketCount;
                      }
!                     else {
                          DEBUG("TCPComm::readClients : removeClient")
                          removeClient(*it);

Index: sfpacket.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/sfpacket.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** sfpacket.cpp	6 Jul 2007 20:29:12 -0000	1.2
--- sfpacket.cpp	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 45,48 ****
--- 45,49 ----
      length = pPacket.getLength();
      type = pPacket.getType();
+     seqno = pPacket.getSeqno();
      setPayload(pPacket.getPayload(), length);
  }

Index: serialcomm.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/serialcomm.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** serialcomm.h	6 Jul 2007 20:29:12 -0000	1.2
--- serialcomm.h	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 200,207 ****
       *  try to read at least count bytes in one go, but may read up to maxCount bytes.
       */
!     virtual int readFD(int fd, char *buffer, int count, int maxCount);
  
      /* enables byte escaping. overwrites method from base class.*/
!     virtual int writeFD(int fd, const char *buffer, int count);
  
      /* reads a packet (blocking) */
--- 200,207 ----
       *  try to read at least count bytes in one go, but may read up to maxCount bytes.
       */
!     virtual int readFD(int fd, char *buffer, int count, int maxCount, int *err);
  
      /* enables byte escaping. overwrites method from base class.*/
!     virtual int writeFD(int fd, const char *buffer, int count, int *err);
  
      /* reads a packet (blocking) */

Index: serialcomm.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/serialcomm.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** serialcomm.cpp	26 Feb 2008 18:17:04 -0000	1.3
--- serialcomm.cpp	21 Apr 2008 19:57:47 -0000	1.4
***************
*** 242,246 ****
  }
  
! SerialComm::SerialComm(const char* pDevice, int pBaudrate, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), droppedReadPacketCount(0), droppedWritePacketCount(0), readPacketCount(0), writtenPacketCount(0), badPacketCount(0), sumRetries(0), device(pDevice), baudrate(pBaudrate), errorReported(false), errorMsg(""), control(pControl)
  {
      writerThreadRunning = false;
--- 242,246 ----
  }
  
! SerialComm::SerialComm(const char* pDevice, int pBaudrate, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), droppedReadPacketCount(0), droppedWritePacketCount(0), readPacketCount(0), writtenPacketCount(0), badPacketCount(0), sumRetries(0), device(pDevice), baudrate(pBaudrate), serialReadFD(-1), serialWriteFD(-1), errorReported(false), errorMsg(""), control(pControl)
  {
      writerThreadRunning = false;
***************
*** 315,320 ****
      pthread_cond_destroy(&ack.received);
  
!     close(serialReadFD);
!     close(serialWriteFD);
  }
  
--- 315,320 ----
      pthread_cond_destroy(&ack.received);
  
!     if(serialReadFD > 2) close(serialReadFD);
!     if(serialWriteFD > 2) close(serialWriteFD);
  }
  
***************
*** 334,338 ****
  }
  
! int SerialComm::writeFD(int fd, const char *buffer, int count)
  {
      int cnt = 0;
--- 334,338 ----
  }
  
! int SerialComm::writeFD(int fd, const char *buffer, int count, int *err)
  {
      int cnt = 0;
***************
*** 344,349 ****
      FD_CLR(serialWriteFD, &wfds);
       */
!     int tmpCnt = BaseComm::writeFD(fd, buffer, count);
      if (tmpCnt < 0) {
          return tmpCnt;
      }
--- 344,350 ----
      FD_CLR(serialWriteFD, &wfds);
       */
!     int tmpCnt = BaseComm::writeFD(fd, buffer, count, err);
      if (tmpCnt < 0) {
+         *err = errno;
          return tmpCnt;
      }
***************
*** 357,361 ****
  /* Work around buggy usb serial driver (returns 0 when no data is
     available, independent of the blocking/non-blocking mode) */
! int SerialComm::readFD(int fd, char *buffer, int count, int maxCount)
  {
      int cnt = 0;
--- 358,362 ----
  /* Work around buggy usb serial driver (returns 0 when no data is
     available, independent of the blocking/non-blocking mode) */
! int SerialComm::readFD(int fd, char *buffer, int count, int maxCount, int *err)
  {
      int cnt = 0;
***************
*** 377,380 ****
--- 378,382 ----
          int tmpCnt = read(fd, buffer, maxCount);
          if (tmpCnt < 0) {
+             *err = errno;
              return tmpCnt;
          }
***************
*** 388,391 ****
--- 390,394 ----
  char SerialComm::nextRaw() {
      char nextByte = 0;
+     int err = 0;
      if(rawFifo.tail < rawFifo.head) {
          nextByte = rawFifo.queue[rawFifo.tail++];
***************
*** 394,399 ****
          // fifo empty -- need to get some bytes
          rawFifo.tail = 0;
          reportError("SerialComm::nextRaw: readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1)",
!                     rawFifo.head = readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1));
          nextByte = rawFifo.queue[rawFifo.tail++];
      }
--- 397,410 ----
          // fifo empty -- need to get some bytes
          rawFifo.tail = 0;
+         rawFifo.head = readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1, &err);
+         if(rawFifo.head < 0) {
+             close(serialReadFD);
+             close(serialWriteFD);
+             serialReadFD = -1;
+             serialWriteFD = -1;
+             errno = err;
+         }
          reportError("SerialComm::nextRaw: readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1)",
!                     rawFifo.head);
          nextByte = rawFifo.queue[rawFifo.tail++];
      }
***************
*** 546,554 ****
  bool SerialComm::writePacket(SFPacket &pPacket)
  {
!     char type, byte;
      uint16_t crc = 0;
      char buffer[2*pPacket.getLength() + 20];
      int offset = 0;
! 
      // put SFD into buffer 
      buffer[offset++] = SYNC_BYTE;
--- 557,567 ----
  bool SerialComm::writePacket(SFPacket &pPacket)
  {
!     char type, byte = 0;
      uint16_t crc = 0;
      char buffer[2*pPacket.getLength() + 20];
      int offset = 0;
!     int err = 0;
!     int written = 0;
!     
      // put SFD into buffer 
      buffer[offset++] = SYNC_BYTE;
***************
*** 563,567 ****
      crc = byteCRC(byte, crc);
      offset += hdlcEncode(1, &byte, buffer + offset);
- 
      switch (type)
      {
--- 576,579 ----
***************
*** 588,592 ****
      // put SFD into buffer
      buffer[offset++] = SYNC_BYTE;
!     if(writeFD(serialWriteFD, buffer, offset) < offset)  {
          DEBUG("SerialComm::writePacket failed");
          return false;
--- 600,616 ----
      // put SFD into buffer
      buffer[offset++] = SYNC_BYTE;
!     written = writeFD(serialWriteFD, buffer, offset, &err);
!     if(written < 0) {
!         if(err != EINTR) {
!             close(serialReadFD);
!             serialReadFD = -1;
!             close(serialWriteFD);
!             serialWriteFD = -1;
!             errno = err;
!             reportError("SerialComm::writePacket failed",-1);
!             return false;
!         }
!     }
!     else if(written < offset) {
          DEBUG("SerialComm::writePacket failed");
          return false;
***************
*** 738,742 ****
  {
      pthread_t callingThread = pthread_self();
!     if (pthread_equal(callingThread, readerThread))
      {
          DEBUG("SerialComm::cancel : by readerThread")
--- 762,766 ----
  {
      pthread_t callingThread = pthread_self();
!     if(readerThreadRunning && pthread_equal(callingThread, readerThread))
      {
          DEBUG("SerialComm::cancel : by readerThread")
***************
*** 753,757 ****
          pthread_exit(NULL);
      }
!     else if ((pthread_equal(callingThread, writerThread)))
      {
          DEBUG("SerialComm::cancel : by writerThread")
--- 777,781 ----
          pthread_exit(NULL);
      }
!     else if(writerThreadRunning && pthread_equal(callingThread, writerThread))
      {
          DEBUG("SerialComm::cancel : by writerThread")

Index: packetbuffer.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/packetbuffer.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** packetbuffer.h	6 Jul 2007 20:29:12 -0000	1.2
--- packetbuffer.h	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 38,42 ****
  #include "sfpacket.h"
  
! //#define DEBUG_PACKETBUFFER
  
  #undef DEBUG
--- 38,42 ----
  #include "sfpacket.h"
  
! // #define DEBUG_PACKETBUFFER
  
  #undef DEBUG
***************
*** 52,56 ****
  protected:
  
!   static const int cMaxBufferSize = 25;
  
    typedef std::list<SFPacket> container_t;
--- 52,56 ----
  protected:
  
!   static const unsigned cMaxBufferSize = 25;
  
    typedef std::list<SFPacket> container_t;
***************
*** 67,72 ****
      // actual buffer 
      container_t container;
-     // number of packets in buffer
-     int size;
    } sharedBuffer_t;
  
--- 67,70 ----

Index: packetbuffer.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/packetbuffer.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** packetbuffer.cpp	6 Jul 2007 20:29:12 -0000	1.2
--- packetbuffer.cpp	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 41,45 ****
      pthread_cond_init(&buffer.notempty, NULL);
      pthread_cond_init(&buffer.notfull, NULL);
-     buffer.size = 0;
  }
  
--- 41,44 ----
***************
*** 58,62 ****
      // clear
      buffer.container.clear();
-     buffer.size = 0;
      DEBUG("PacketBuffer::clear : cleared buffer and signal <notfull>")
      pthread_cond_signal(&buffer.notfull);
--- 57,60 ----
***************
*** 72,76 ****
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ empty
!     while(buffer.size == 0)
      {
          DEBUG("PacketBuffer::dequeue : waiting until buffer is <notempty>")
--- 70,74 ----
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ empty
!     while(buffer.container.size() == 0)
      {
          DEBUG("PacketBuffer::dequeue : waiting until buffer is <notempty>")
***************
*** 80,84 ****
      packet = buffer.container.front();
      buffer.container.pop_front();
-     --buffer.size;
      DEBUG("PacketBuffer::dequeue : get from buffer and signal <notfull>")
      pthread_cond_signal(&buffer.notfull);
--- 78,81 ----
***************
*** 94,98 ****
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ full
!     while(buffer.size >= cMaxBufferSize)
      {
          DEBUG("PacketBuffer::enqueueFront : waiting until buffer is <notfull>")
--- 91,95 ----
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ full
!     while(buffer.container.size() >= cMaxBufferSize)
      {
          DEBUG("PacketBuffer::enqueueFront : waiting until buffer is <notfull>")
***************
*** 100,104 ****
      }
      // enqueue
-     ++buffer.size;
      buffer.container.push_front(pPacket);
      DEBUG("PacketBuffer::enqueueFront : put in buffer and signal <notempty>")
--- 97,100 ----
***************
*** 116,120 ****
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ full
!     while(buffer.size >= cMaxBufferSize)
      {
          DEBUG("PacketBuffer::enqueueBack : waiting until buffer is <notfull>")
--- 112,116 ----
      pthread_mutex_lock(&buffer.lock);
      // wait until buffer is _not_ full
!     while(buffer.container.size() >= cMaxBufferSize)
      {
          DEBUG("PacketBuffer::enqueueBack : waiting until buffer is <notfull>")
***************
*** 122,126 ****
      }
      // enqueue
-     ++buffer.size;
      buffer.container.push_back(pPacket);
      DEBUG("PacketBuffer::enqueueBack : put in buffer and signal <notempty>")
--- 118,121 ----
***************
*** 136,141 ****
    pthread_testcancel();
    pthread_mutex_lock(&buffer.lock);
!   if (buffer.size < cMaxBufferSize) {
!     isFull = false;
    }
    pthread_mutex_unlock(&buffer.lock);
--- 131,136 ----
    pthread_testcancel();
    pthread_mutex_lock(&buffer.lock);
!   if (buffer.container.size() < cMaxBufferSize) {
!       isFull = false;
    }
    pthread_mutex_unlock(&buffer.lock);
***************
*** 148,153 ****
    pthread_testcancel();
    pthread_mutex_lock(&buffer.lock);
!   if (buffer.size > 0) {
!     isEmpty = false;
    }
    pthread_mutex_unlock(&buffer.lock);
--- 143,148 ----
    pthread_testcancel();
    pthread_mutex_lock(&buffer.lock);
!   if (buffer.container.size() > 0) {
!       isEmpty = false;
    }
    pthread_mutex_unlock(&buffer.lock);

Index: basecomm.h
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/basecomm.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** basecomm.h	6 Jul 2007 20:29:12 -0000	1.2
--- basecomm.h	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 42,49 ****
  protected:
      /* performs blocking read on fd */
!     virtual int readFD(int fd, char *buffer, int count);
  
      /* performs blocking write on fd */
!     virtual int writeFD(int fd, const char *buffer, int count);
  };
  
--- 42,49 ----
  protected:
      /* performs blocking read on fd */
!     virtual int readFD(int fd, char *buffer, int count, int *err);
  
      /* performs blocking write on fd */
!     virtual int writeFD(int fd, const char *buffer, int count, int *err);
  };
  

Index: basecomm.cpp
===================================================================
RCS file: /cvsroot/tinyos/tinyos-2.x/support/sdk/cpp/sf/basecomm.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** basecomm.cpp	6 Jul 2007 20:29:12 -0000	1.2
--- basecomm.cpp	21 Apr 2008 19:57:47 -0000	1.3
***************
*** 47,51 ****
  
  /* all count bytes must be read before returning - blocking in that way... */
! int BaseComm::readFD(int fd, char *buffer, int count)
  {
      int actual = 0;
--- 47,51 ----
  
  /* all count bytes must be read before returning - blocking in that way... */
! int BaseComm::readFD(int fd, char *buffer, int count, int *err)
  {
      int actual = 0;
***************
*** 55,58 ****
--- 55,59 ----
          if (n == -1)
          {
+             *err = errno;
              return -1;
          }
***************
*** 69,73 ****
  
  /* all count bytes must be written before returning - blocking in that way... */
! int BaseComm::writeFD(int fd, const char *buffer, int count)
  {
      int actual = 0;
--- 70,74 ----
  
  /* all count bytes must be written before returning - blocking in that way... */
! int BaseComm::writeFD(int fd, const char *buffer, int count, int *err)
  {
      int actual = 0;
***************
*** 78,81 ****
--- 79,83 ----
          {
              if(errno != 0) {
+                 *err = errno;
                  return -1;
              }



More information about the Tinyos-2-commits mailing list