lichao
2021-04-14 fa95ddd1a294ebad47cabf9e149ee7d789271044
src/sendq.cpp
@@ -21,6 +21,11 @@
bool SendQ::TrySend(bhome_shm::ShmMsgQueue &mq)
{
   if (out_.empty()) {
      std::unique_lock<std::mutex> lock(mutex_);
      out_.swap(in_);
   }
   auto FirstNotExpired = [](MsgList &l) {
      auto Less = [](const TimedMsg &msg, const TimePoint &tp) { return msg.expire() < tp; };
      return std::lower_bound(l.begin(), l.end(), Now(), Less);
@@ -36,27 +41,28 @@
         info.msg_.Release(mq.shm());
      }
      //TODO maybe use TrySendAll ?
      while (pos != msg_list.end() && mq.TrySend(*(MQId *) remote.data(), pos->data().msg_)) {
      int n = mq.TrySendAll(*(MQId *) remote.data(), MsgIter(pos), MsgIter(msg_list.end()));
      for (int i = 0; i < n; ++i) {
         auto &msg = pos->data().msg_;
         if (msg.IsCounted()) {
            msg.Release(mq.shm());
         }
         ++pos;
      }
      msg_list.erase(msg_list.begin(), pos);
   };
   if (!store_.empty()) {
      auto rec = store_.begin();
   if (!out_.empty()) {
      auto rec = out_.begin();
      do {
         SendOneRemote(rec->first, rec->second);
         if (rec->second.empty()) {
            rec = store_.erase(rec);
            rec = out_.erase(rec);
         } else {
            ++rec;
         }
      } while (rec != store_.end());
      } while (rec != out_.end());
   }
   return !store_.empty();
   return !out_.empty();
}