소스 검색

Improve BeefCon cpu usage

Brian Fiete 7 달 전
부모
커밋
d5024964c8
2개의 변경된 파일17개의 추가작업 그리고 2개의 파일을 삭제
  1. 1 1
      BeefTools/BeefCon/src/Program.bf
  2. 16 1
      IDE/src/util/ConsoleProvider.bf

+ 1 - 1
BeefTools/BeefCon/src/Program.bf

@@ -48,7 +48,7 @@ class Program
 	{
 		while (true)
 		{
-			switch (mPipe.ReadMessage(-1))
+			switch (mPipe.ReadMessage(20))
 			{
 			case .Ok(let msg):
 				uint8* ptr = msg.Ptr + 1;

+ 16 - 1
IDE/src/util/ConsoleProvider.bf

@@ -903,6 +903,7 @@ class BeefConConsoleProvider : ConsoleProvider
 		public bool mConnected;
 		public Thread mThread ~ delete _;
 		public Monitor mDataMonitor = new .() ~ delete _;
+		public WaitEvent mDataEvent = new .() ~ delete _;
 		public int mPendingReadClear;
 		public bool mExiting;
 
@@ -949,6 +950,7 @@ class BeefConConsoleProvider : ConsoleProvider
 					using (mDataMonitor.Enter())
 					{
 						mRecvStream.TryWrite(.(&data, len));
+						mDataEvent.Set(true);
 					}
 				case .Err(let err):
 					if ((err == .PipeListening) && (!mConnected))
@@ -1022,7 +1024,7 @@ class BeefConConsoleProvider : ConsoleProvider
 			}
 		}
 
-		public Result<Span<uint8>> ReadMessage(int timeoutMS)
+		Result<Span<uint8>> DoReadMessage()
 		{
 			using (mDataMonitor.Enter())
 			{
@@ -1044,6 +1046,19 @@ class BeefConConsoleProvider : ConsoleProvider
 				return .Ok(.(mRecvStream.Memory.Ptr + 4, wantTotalLen - 4));
 			}
 		}
+
+		public Result<Span<uint8>> ReadMessage(int timeoutMS)
+		{
+			if (timeoutMS != 0)
+				mDataEvent.WaitFor(timeoutMS);
+			using (mDataMonitor.Enter())
+			{
+				var result = DoReadMessage();
+				if (result case .Err)
+					mDataEvent.Reset();
+				return result;
+			}
+		}
 	}
 
 	public static int sConId = 0;