From c64c54d8e75b9354dc49a7b6b2d326e7dd59eb37 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期四, 15 四月 2021 19:32:16 +0800
Subject: [PATCH] add api; fix send, socknode mem leak.

---
 src/socket.h |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/socket.h b/src/socket.h
index 0b0b880..96af6e7 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -36,7 +36,7 @@
 
 class ShmSocket : private boost::noncopyable
 {
-	bool SendImpl(const void *valid_remote, const MsgI &imsg, SendQ::OnMsgEvent onExpire = SendQ::OnMsgEvent())
+	bool SendImpl(const void *valid_remote, MsgI const &imsg, SendQ::OnMsgEvent onExpire = SendQ::OnMsgEvent())
 	{
 		// if (!mq().TrySend(*(MQId *) valid_remote, imsg)) {
 		send_buffer_.Append(*static_cast<const MQId *>(valid_remote), imsg, onExpire);
@@ -69,7 +69,11 @@
 	bool Send(const void *valid_remote, const BHMsgHead &head, const Body &body)
 	{
 		MsgI msg;
-		return msg.Make(shm(), head, body) && SendImpl(valid_remote, msg);
+		if (msg.Make(shm(), head, body)) {
+			DEFER1(if (msg.IsCounted()) { msg.Release(shm()); });
+			return SendImpl(valid_remote, msg);
+		}
+		return false;
 	}
 
 	template <class Body>
@@ -78,6 +82,7 @@
 		//TODO send_buffer_ need flag, and remove callback on expire.
 		MsgI msg;
 		if (msg.Make(shm(), head, body)) {
+			DEFER1(if (msg.IsCounted()) { msg.Release(shm()); });
 			std::string msg_id(head.msg_id());
 			per_msg_cbs_->Add(msg_id, cb);
 			auto onExpireRemoveCB = [this, msg_id](MsgI const &msg) {
@@ -85,6 +90,8 @@
 				per_msg_cbs_->Find(msg_id, cb_no_use);
 			};
 			return SendImpl(valid_remote, msg, onExpireRemoveCB);
+		} else {
+			printf("out of mem?, avail: %ld\n", shm().get_free_memory());
 		}
 		return false;
 	}

--
Gitblit v1.8.0