[haiku-commits] r39867 - haiku/trunk/src/apps/debugger/debugger_interface

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 16 Dec 2010 05:48:29 +0100 (CET)

Author: anevilyak
Date: 2010-12-16 05:48:29 +0100 (Thu, 16 Dec 2010)
New Revision: 39867
Changeset: http://dev.haiku-os.org/changeset/39867

Modified:
   haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp
   haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h
Log:
Slight refactoring. Also, always process all waiting debugger events before any
system watch events, since otherwise there's a potential race where we might
try to process a thread rename before having processed the notification for
that thread's creation.



Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp      
2010-12-16 04:19:53 UTC (rev 39866)
+++ haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp      
2010-12-16 04:48:29 UTC (rev 39867)
@@ -1,5 +1,6 @@
 /*
  * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Copyright 2010, Rene Gollent, rene@xxxxxxxxxxxx
  * Distributed under the terms of the MIT License.
  */
 
@@ -319,9 +320,6 @@
 DebuggerInterface::GetNextDebugEvent(DebugEvent*& _event)
 {
        while (true) {
-               debug_debugger_message_data message;
-               int32 messageCode;
-
                object_wait_info infos[2];
                infos[0].object = fDebuggerPort;
                infos[0].type = B_OBJECT_TYPE_PORT;
@@ -338,35 +336,13 @@
                        return size;
                }
 
-               if (infos[1].events & B_EVENT_READ)
+               if (infos[0].events & B_EVENT_READ)
+                       return _GetNextDebuggerEvent(_event);
+               else if (infos[1].events & B_EVENT_READ)
                        return _GetNextSystemWatchEvent(_event);
+       }
 
-               size = read_port(fDebuggerPort, &messageCode, &message,
-                       sizeof(message));
-               if (size < 0) {
-                       if (size == B_INTERRUPTED)
-                               continue;
-
-                       return size;
-               }
-
-               if (message.origin.team != fTeamID)
-                       continue;
-
-               bool ignore = false;
-               status_t error = _CreateDebugEvent(messageCode, message, ignore,
-                       _event);
-               if (error != B_OK)
-                       return error;
-
-               if (ignore) {
-                       if (message.origin.thread >= 0 && 
message.origin.nub_port >= 0)
-                               continue_thread(message.origin.nub_port, 
message.origin.thread);
-                       continue;
-               }
-
-               return B_OK;
-       }
+       return B_OK;
 }
 
 
@@ -760,6 +736,43 @@
 
 
 status_t
+DebuggerInterface::_GetNextDebuggerEvent(DebugEvent*& _event)
+{
+       while (true) {
+               debug_debugger_message_data message;
+               int32 messageCode;
+               ssize_t size = read_port(fDebuggerPort, &messageCode, &message,
+                       sizeof(message));
+               if (size < 0) {
+                       if (size == B_INTERRUPTED)
+                               continue;
+
+                       return size;
+               }
+
+               if (message.origin.team != fTeamID)
+                       continue;
+
+               bool ignore = false;
+               status_t error = _CreateDebugEvent(messageCode, message, ignore,
+                       _event);
+               if (error != B_OK)
+                       return error;
+
+               if (ignore) {
+                       if (message.origin.thread >= 0 && 
message.origin.nub_port >= 0)
+                               continue_thread(message.origin.nub_port, 
message.origin.thread);
+                       continue;
+               }
+
+               return B_OK;
+       }
+
+       return B_OK;
+}
+
+
+status_t
 DebuggerInterface::_GetNextSystemWatchEvent(DebugEvent*& _event)
 {
        while (true) {

Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h
===================================================================
--- haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h        
2010-12-16 04:19:53 UTC (rev 39866)
+++ haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h        
2010-12-16 04:48:29 UTC (rev 39867)
@@ -1,5 +1,6 @@
 /*
  * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Copyright 2010, Rene Gollent, rene@xxxxxxxxxxxx
  * Distributed under the terms of the MIT License.
  */
 #ifndef DEBUGGER_INTERFACE_H
@@ -73,6 +74,7 @@
                                                                        const 
debug_debugger_message_data& message,
                                                                        bool& 
_ignore, DebugEvent*& _event);
 
+                       status_t                        
_GetNextDebuggerEvent(DebugEvent*& _event);
                        status_t                        
_GetNextSystemWatchEvent(DebugEvent*& _event);
 
 private:


Other related posts: