From 6b96ee857e366af317ab9dc1b6b4f9c22576e83b Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期四, 20 五月 2021 17:12:34 +0800
Subject: [PATCH] add sleeper, to reduce cpu usage.

---
 src/fib.h          |   43 +++++++++++++++++++++
 src/shm_socket.cpp |    8 +++
 utest/api_test.cpp |    2 
 src/shm_queue.h    |    5 +-
 src/sleeper.h      |   23 +++++++++++
 src/topic_node.cpp |   10 ++--
 6 files changed, 81 insertions(+), 10 deletions(-)

diff --git a/src/fib.h b/src/fib.h
new file mode 100755
index 0000000..d848e12
--- /dev/null
+++ b/src/fib.h
@@ -0,0 +1,43 @@
+#ifndef FIB_COLLJGBP
+#define FIB_COLLJGBP
+
+// fibonacci sequence.
+// 0,1,1,2,3,5,8,13,21,34,...
+class FibSeq
+{
+public:
+	typedef uint64_t int_type;
+	FibSeq(int_type limit) :
+	    m_limit(limit), m_cur(0), m_next(1) {}
+
+	void Reset()
+	{
+		m_cur = 0;
+		m_next = 1;
+	}
+	void ResetLimit(const int_type v)
+	{
+		m_limit = v;
+		Reset();
+	}
+
+	int_type Limit() const { return m_limit; }
+	int_type Cur() const { return m_cur; }
+	int_type Inc()
+	{
+		if (m_next < m_limit) {
+			m_next = m_next + m_cur;
+			m_cur = m_next - m_cur;
+		} else {
+			m_cur = m_limit;
+		}
+		return Cur();
+	}
+
+private:
+	int_type m_limit;
+	int_type m_cur;
+	int_type m_next;
+};
+
+#endif // end of include guard: FIB_COLLJGBP
diff --git a/src/shm_queue.h b/src/shm_queue.h
index 7871fe0..3a2cea6 100644
--- a/src/shm_queue.h
+++ b/src/shm_queue.h
@@ -46,7 +46,7 @@
 			if (TryRead(d)) {
 				return true;
 			} else {
-				robust::QuickSleep();
+				std::this_thread::sleep_for(1ms);
 			}
 		} while (steady_clock::now() < end_time);
 		return false;
@@ -75,7 +75,6 @@
 
 private:
 	Circular<D> queue_;
-	// bhome_shm::Mutex mutex_;
 };
 
 template <int Power = 4>
@@ -96,7 +95,7 @@
 					return true;
 				}
 			}
-			robust::QuickSleep();
+			std::this_thread::sleep_for(1ms);
 		} while (steady_clock::now() < end_time);
 		return false;
 	}
diff --git a/src/shm_socket.cpp b/src/shm_socket.cpp
index 4b687d5..f177b87 100644
--- a/src/shm_socket.cpp
+++ b/src/shm_socket.cpp
@@ -20,7 +20,9 @@
 #include "bh_util.h"
 #include "defs.h"
 #include "msg.h"
+#include "sleeper.h"
 #include <chrono>
+
 using namespace std::chrono;
 using namespace std::chrono_literals;
 
@@ -90,11 +92,15 @@
 		};
 
 		try {
+			thread_local FibUSleeper sleeper(1000 * 10);
+
 			bool more_to_send = DoSend();
 			bool more_to_recv = DoRecv();
 			if (onIdle) { onIdle(*this); }
 			if (!more_to_send && !more_to_recv) {
-				robust::QuickSleep();
+				sleeper.Sleep();
+			} else {
+				sleeper.Reset();
 			}
 		} catch (...) {
 		}
diff --git a/src/sleeper.h b/src/sleeper.h
new file mode 100755
index 0000000..d15d50a
--- /dev/null
+++ b/src/sleeper.h
@@ -0,0 +1,23 @@
+#ifndef SLEEPER_BWPGKQCV
+#define SLEEPER_BWPGKQCV
+
+#include "fib.h"
+#include <chrono>
+#include <thread>
+
+class FibUSleeper : private FibSeq
+{
+public:
+	FibUSleeper(int_type limit) :
+	    FibSeq(limit) {}
+	void Sleep() { std::this_thread::sleep_for(std::chrono::microseconds(Inc())); }
+	using FibSeq::Cur;
+	using FibSeq::Limit;
+	using FibSeq::Reset;
+	using FibSeq::ResetLimit;
+
+protected:
+	using FibSeq::Inc;
+};
+
+#endif // end of include guard: SLEEPER_BWPGKQCV
diff --git a/src/topic_node.cpp b/src/topic_node.cpp
index 8bbb929..6ed7713 100644
--- a/src/topic_node.cpp
+++ b/src/topic_node.cpp
@@ -17,6 +17,7 @@
  */
 #include "topic_node.h"
 #include "bh_util.h"
+#include "sleeper.h"
 #include <chrono>
 #include <list>
 
@@ -51,7 +52,6 @@
 
 TopicNode::~TopicNode()
 {
-	LOG_DEBUG() << "~TopicNode()";
 	Stop();
 }
 
@@ -140,9 +140,7 @@
 }
 void TopicNode::Stop()
 {
-	LOG_DEBUG() << "Node Stopping";
 	for (auto &p : sockets_) { p->Stop(); }
-	LOG_INFO() << "Node Stopped";
 }
 
 bool TopicNode::Register(ProcInfo &proc, MsgCommonReply &reply_body, const int timeout_ms)
@@ -399,10 +397,11 @@
 	}
 	BHMsgHead head;
 	std::string body;
+	FibUSleeper sleeper(1000 * 10);
 	auto end_time = steady_clock::now() + milliseconds(timeout_ms);
 	while (!server_buffer_->Read(head, body)) {
 		if (steady_clock::now() < end_time) {
-			robust::QuickSleep();
+			sleeper.Sleep();
 		} else {
 			return false;
 		}
@@ -677,10 +676,11 @@
 
 	BHMsgHead head;
 	std::string body;
+	FibUSleeper sleeper(1000 * 10);
 	auto end_time = steady_clock::now() + milliseconds(timeout_ms);
 	while (!sub_buffer_->Read(head, body)) {
 		if (steady_clock::now() < end_time) {
-			robust::QuickSleep();
+			sleeper.Sleep();
 		} else {
 			return false;
 		}
diff --git a/utest/api_test.cpp b/utest/api_test.cpp
index e597533..e278e29 100644
--- a/utest/api_test.cpp
+++ b/utest/api_test.cpp
@@ -372,7 +372,7 @@
 	threads.Launch(hb, &run);
 	threads.Launch(showStatus, &run);
 	int ncli = 10;
-	const int64_t nreq = 1; //000 * 100;
+	const int64_t nreq = 1000 * 100;
 
 	for (int i = 0; i < 10; ++i) {
 		SyncRequest(i);

--
Gitblit v1.8.0