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: