X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterMessageQueue.cpp;h=a270a78235792a39a81a6fd746088c7155cea175;hb=466925f5c43536e5fd96632615810da783b78096;hp=64f9f00de0f6bf0dcd8bce9aa1c2166b9070f575;hpb=a8559e01ffc0239556097fbbe99f88f663f3fd6f;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterMessageQueue.cpp b/src/lib/adapter/USBCECAdapterMessageQueue.cpp index 64f9f00..a270a78 100644 --- a/src/lib/adapter/USBCECAdapterMessageQueue.cpp +++ b/src/lib/adapter/USBCECAdapterMessageQueue.cpp @@ -39,6 +39,8 @@ using namespace CEC; using namespace PLATFORM; using namespace std; +#define MESSAGE_QUEUE_SIGNAL_WAIT_TIME 1000 + CCECAdapterMessageQueueEntry::CCECAdapterMessageQueueEntry(CCECAdapterMessage *message) : m_message(message), m_iPacketsLeft(message->IsTranmission() ? message->Size() / 4 : 1), @@ -230,11 +232,15 @@ void *CCECAdapterMessageQueue::Process(void) while (!IsStopped()) { /* wait for a new message */ - if (m_writeQueue.Pop(message, 1000)) + if (m_writeQueue.Pop(message, MESSAGE_QUEUE_SIGNAL_WAIT_TIME) && message) { /* write this message */ - m_com->WriteToDevice(message->m_message); - if (message->m_message->state == ADAPTER_MESSAGE_STATE_ERROR) + { + CLockObject lock(m_mutex); + m_com->WriteToDevice(message->m_message); + } + if (message->m_message->state == ADAPTER_MESSAGE_STATE_ERROR || + message->m_message->Message() == MSGCODE_START_BOOTLOADER) { message->Signal(); Clear(); @@ -306,13 +312,12 @@ bool CCECAdapterMessageQueue::Write(CCECAdapterMessage *msg) m_com->SetLineTimeout(msg->lineTimeout); } - CCECAdapterMessageQueueEntry *entry(NULL); + CCECAdapterMessageQueueEntry *entry = new CCECAdapterMessageQueueEntry(msg); uint64_t iEntryId(0); /* add to the wait for ack queue */ if (msg->Message() != MSGCODE_START_BOOTLOADER) { CLockObject lock(m_mutex); - entry = new CCECAdapterMessageQueueEntry(msg); iEntryId = m_iNextMessage++; m_messages.insert(make_pair(iEntryId, entry)); } @@ -330,8 +335,11 @@ bool CCECAdapterMessageQueue::Write(CCECAdapterMessage *msg) bReturn = false; } - CLockObject lock(m_mutex); - m_messages.erase(iEntryId); + if (msg->Message() != MSGCODE_START_BOOTLOADER) + { + CLockObject lock(m_mutex); + m_messages.erase(iEntryId); + } delete entry; }