cec: mutex in CSerialPort
authorLars Op den Kamp <lars@opdenkamp.eu>
Tue, 4 Oct 2011 18:48:02 +0000 (20:48 +0200)
committerLars Op den Kamp <lars@opdenkamp.eu>
Tue, 4 Oct 2011 18:48:02 +0000 (20:48 +0200)
include/CECExportsCpp.h
src/lib/platform/linux/serialport.cpp
src/lib/platform/serialport.h

index 54dbcbfe3770e16eb027451f1b6970cf814fc066..f052592b5d034688d376cdd5ac81f23e1e34392e 100644 (file)
@@ -183,6 +183,7 @@ inline CEC::ICECAdapter *LoadLibCec(const char *strName, CEC::cec_logical_addres
  */
 inline void UnloadLibCec(CEC::ICECAdapter *device)
 {
+  device->Close();
   delete device;
 };
 #endif
index e6bfafab44a611397e445f090ffe5669ae21ff3d..1877b0eec97c04a9813eb03351a04af427626163 100644 (file)
@@ -38,7 +38,8 @@ CSerialPort::~CSerialPort()
 int CSerialPort::Write(uint8_t* data, int len)
 {
   fd_set port;
-  
+
+  CLockObject lock(&m_mutex);
   if (m_fd == -1)
   {
     m_error = "port closed";
@@ -87,6 +88,7 @@ int CSerialPort::Read(uint8_t* data, int len, int iTimeoutMs /*= -1*/)
   int64_t now, target;
   int     bytesread = 0;
 
+  CLockObject lock(&m_mutex);
   if (m_fd == -1)
   {
     m_error = "port closed";
@@ -157,7 +159,8 @@ bool CSerialPort::Open(string name, int baudrate, int databits/* = 8*/, int stop
 {
   m_name = name;
   m_error = strerror(errno);
-  
+  CLockObject lock(&m_mutex);
+
   if (databits < 5 || databits > 8)
   {
     m_error = "Databits has to be between 5 and 8";
@@ -244,6 +247,7 @@ bool CSerialPort::Open(string name, int baudrate, int databits/* = 8*/, int stop
 
 void CSerialPort::Close()
 {
+  CLockObject lock(&m_mutex);
   if (m_fd != -1)
   {
     close(m_fd);
@@ -286,7 +290,8 @@ bool CSerialPort::SetBaudRate(int baudrate)
   return true;
 }
 
-bool CSerialPort::IsOpen() const
+bool CSerialPort::IsOpen()
 {
+  CLockObject lock(&m_mutex);
   return m_fd != -1;
 }
index c7e0e6c5dbc551ee06094a98ab3bc226d5f48eca..2cdc10890c9c49396dcdcea56435c5b51bcc0e01 100644 (file)
 #include <string>
 #include <vector>
 #include <stdint.h>
+#include "../platform/threads.h"
 
 #ifndef __WINDOWS__
 #include <termios.h>
 #else
-#include "../util/threads.h"
 #include "../util/buffer.h"
 #endif
 
@@ -44,8 +44,7 @@ namespace CEC
       virtual ~CSerialPort();
 
       bool Open(std::string name, int baudrate, int databits = 8, int stopbits = 1, int parity = PAR_NONE);
-      bool SetBaudRate(int baudrate);
-      bool IsOpen() const;
+      bool IsOpen();
       void Close();
 
       int  Write(std::vector<uint8_t> data)
@@ -59,8 +58,11 @@ namespace CEC
       std::string GetName() { return m_name; }
 
   private:
+      bool SetBaudRate(int baudrate);
+
       std::string     m_error;
       std::string     m_name;
+      CMutex          m_mutex;
 
   #ifdef __WINDOWS__
       bool SetTimeouts(bool bBlocking);