cec: moved the timed ping to a separate thread. bugzid: 654
authorLars Op den Kamp <lars@opdenkamp.eu>
Wed, 11 Apr 2012 15:04:16 +0000 (17:04 +0200)
committerLars Op den Kamp <lars@opdenkamp.eu>
Wed, 11 Apr 2012 15:48:25 +0000 (17:48 +0200)
src/lib/adapter/USBCECAdapterCommunication.cpp
src/lib/adapter/USBCECAdapterCommunication.h

index fb6f26707ab06c53f5bd5c5600dd433b0b10ef0d..ab26d84550f30f010113f12a0228cc55cb330219 100644 (file)
@@ -51,7 +51,8 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo
     m_lastDestination(CECDEVICE_UNKNOWN),
     m_bNextIsEscaped(false),
     m_bGotStart(false),
-    m_bInitialised(false)
+    m_bInitialised(false),
+    m_pingThread(NULL)
 {
   for (unsigned int iPtr = 0; iPtr < 15; iPtr++)
     m_bWaitingForAck[iPtr] = false;
@@ -187,7 +188,8 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
   }
   else if (bStartListening)
   {
-    if (CreateThread())
+    m_pingThread = new CAdapterPingThread(this, CEC_ADAPTER_PING_TIMEOUT);
+    if (CreateThread() && m_pingThread->CreateThread())
     {
       CLibCEC::AddLog(CEC_LOG_DEBUG, "communication thread started");
       return true;
@@ -211,6 +213,10 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
 
 void CUSBCECAdapterCommunication::Close(void)
 {
+  if (m_pingThread)
+    m_pingThread->StopThread(0);
+  delete m_pingThread;
+  m_pingThread = NULL;
   StopThread(0);
 }
 
@@ -219,7 +225,6 @@ void *CUSBCECAdapterCommunication::Process(void)
   cec_command command;
   command.Clear();
   bool bCommandReceived(false);
-  CTimeout pingTimeout(CEC_ADAPTER_PING_TIMEOUT);
   while (!IsStopped())
   {
     {
@@ -232,12 +237,7 @@ void *CUSBCECAdapterCommunication::Process(void)
     if (!IsStopped() && bCommandReceived)
       m_callback->OnCommandReceived(command);
 
-    /* ping the adapter every 15 seconds */
-    if (pingTimeout.TimeLeft() == 0)
-    {
-      pingTimeout.Init(CEC_ADAPTER_PING_TIMEOUT);
-      PingAdapter();
-    }
+    Sleep(5);
   }
 
   /* set the ackmask to 0 before closing the connection */
@@ -297,7 +297,6 @@ bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data)
 {
   data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT;
   SendMessageToAdapter(data);
-  data->event.Wait(5000);
 
   if ((data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT_ACKED) ||
       (!data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT))
@@ -373,7 +372,6 @@ bool CUSBCECAdapterCommunication::StartBootloader(void)
 
 bool CUSBCECAdapterCommunication::PingAdapter(void)
 {
-  CLockObject lock(m_mutex);
   CLibCEC::AddLog(CEC_LOG_DEBUG, "sending ping");
 
   CCECAdapterMessage params;
@@ -951,7 +949,6 @@ void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg)
         CLibCEC::AddLog(CEC_LOG_DEBUG, "did not receive ack");
     }
   }
-  msg->event.Signal();
 }
 
 CStdString CUSBCECAdapterCommunication::GetPortName(void)
@@ -1030,3 +1027,18 @@ cec_datapacket CUSBCECAdapterCommunication::GetSetting(cec_adapter_messagecode m
 
   return retVal;
 }
+
+void *CAdapterPingThread::Process(void)
+{
+  while (!IsStopped())
+  {
+    if (m_timeout.TimeLeft() == 0)
+    {
+      m_timeout.Init(CEC_ADAPTER_PING_TIMEOUT);
+      m_com->PingAdapter();
+    }
+
+    Sleep(500);
+  }
+  return NULL;
+}
index 73057043d8a0e169481db1e63ace9b8f95e66d04..4ca8e87e1810c794c088dc4a15a7c053422e129c 100644 (file)
@@ -45,6 +45,7 @@ namespace PLATFORM
 namespace CEC
 {
   class CCECProcessor;
+  class CAdapterPingThread;
 
   class CUSBCECAdapterCommunication : public IAdapterCommunication, private PLATFORM::CThread
   {
@@ -126,5 +127,20 @@ namespace CEC
     IAdapterCommunicationCallback *              m_callback;
     bool                                         m_bInitialised;
     bool                                         m_bWaitingForAck[15];
+    CAdapterPingThread *                         m_pingThread;
+  };
+
+  class CAdapterPingThread : public PLATFORM::CThread
+  {
+  public:
+    CAdapterPingThread(CUSBCECAdapterCommunication *com, uint32_t iTimeout) :
+        m_com(com),
+        m_timeout(iTimeout){}
+    virtual ~CAdapterPingThread(void) {}
+
+    virtual void* Process(void);
+  private:
+    CUSBCECAdapterCommunication *m_com;
+    PLATFORM::CTimeout           m_timeout;
   };
 };