From fa95ddd1a294ebad47cabf9e149ee7d789271044 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期三, 14 四月 2021 19:45:09 +0800
Subject: [PATCH] use 2 buf to speed up sendq; socket auto start.

---
 src/sendq.cpp |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/sendq.cpp b/src/sendq.cpp
index 290e9d1..4b1f947 100644
--- a/src/sendq.cpp
+++ b/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();
 }
\ No newline at end of file

--
Gitblit v1.8.0