| 440 | } |
| 441 | |
| 442 | MessagePost_t FasterMessage(const MessageHandler_t& _handlerid, const Message& _message, const MessageTiming& _timing) { |
| 443 | ScopedLock lock(sg_messagequeue_map_mutex); |
| 444 | const MessageQueue_t& id = _handlerid.queue; |
| 445 | |
| 446 | std::map<MessageQueue_t, MessageQueueContent>::iterator pos = sg_messagequeue_map.find(id); |
| 447 | if (sg_messagequeue_map.end() == pos) return KNullPost; |
| 448 | |
| 449 | MessageQueueContent& content = pos->second; |
| 450 | |
| 451 | MessageWrapper* messagewrapper = new MessageWrapper(_handlerid, _message, _timing, __MakeSeq()); |
| 452 | |
| 453 | for (std::list<MessageWrapper*>::iterator it = content.lst_message.begin(); it != content.lst_message.end(); ++it) { |
| 454 | if ((*it)->postid.reg == _handlerid && (*it)->message == _message) { |
| 455 | if (__ComputerWaitTime(**it) < __ComputerWaitTime(*messagewrapper)) { |
| 456 | delete messagewrapper; |
| 457 | return (*it)->postid; |
| 458 | } |
| 459 | |
| 460 | messagewrapper->postid = (*it)->postid; |
| 461 | delete(*it); |
| 462 | content.lst_message.erase(it); |
| 463 | break; |
| 464 | } |
| 465 | } |
| 466 | |
| 467 | if(content.lst_message.size() >= MAX_MQ_SIZE) { |
| 468 | xwarn2(TSF"%_", DumpMessage(content.lst_message)); |
| 469 | ASSERT2(false, "Over MAX_MQ_SIZE"); |
| 470 | delete messagewrapper; |
| 471 | return KNullPost; |
| 472 | } |
| 473 | content.lst_message.push_back(messagewrapper); |
| 474 | content.breaker->Notify(lock); |
| 475 | return messagewrapper->postid; |
| 476 | } |
| 477 | |
| 478 | bool WaitMessage(const MessagePost_t& _message, long _timeoutInMs) { |
| 479 | bool is_in_mq = Handler2Queue(Post2Handler(_message)) == CurrentThreadMessageQueue(); |
no test coverage detected