Author: anevilyak Date: 2010-12-16 05:19:53 +0100 (Thu, 16 Dec 2010) New Revision: 39866 Changeset: http://dev.haiku-os.org/changeset/39866 Modified: haiku/trunk/src/apps/debugger/TeamDebugger.cpp haiku/trunk/src/apps/debugger/TeamDebugger.h haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.cpp haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.h haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h Log: Re-implement watching for thread name changes via the new thread property change notification interface. Modified: haiku/trunk/src/apps/debugger/TeamDebugger.cpp =================================================================== --- haiku/trunk/src/apps/debugger/TeamDebugger.cpp 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/TeamDebugger.cpp 2010-12-16 04:19:53 UTC (rev 39866) @@ -799,7 +799,7 @@ void TeamDebugger::_HandleDebuggerMessage(DebugEvent* event) { - TRACE_EVENTS("TeamDebugger::_HandleDebuggerMessage(): %d\n", + TRACE_EVENTS("TeamDebugger::_HandleDebuggerMessage(): %ld\n", event->EventType()); bool handled = false; @@ -884,6 +884,25 @@ handled = _HandleThreadCreated(threadEvent); break; } + case DEBUGGER_MESSAGE_THREAD_RENAMED: + { + ThreadRenamedEvent* threadEvent + = dynamic_cast<ThreadRenamedEvent*>(event); + TRACE_EVENTS("DEBUGGER_MESSAGE_THREAD_RENAMED: thread: %ld " + "(\"%s\")\n", + threadEvent->RenamedThread(), threadEvent->NewName()); + handled = _HandleThreadRenamed(threadEvent); + break; + } + case DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED: + { + ThreadPriorityChangedEvent* threadEvent + = dynamic_cast<ThreadPriorityChangedEvent*>(event); + TRACE_EVENTS("B_DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED: thread:" + " %ld\n", threadEvent->ChangedThread()); + handled = _HandleThreadPriorityChanged(threadEvent); + break; + } case B_DEBUGGER_MESSAGE_THREAD_DELETED: TRACE_EVENTS("B_DEBUGGER_MESSAGE_THREAD_DELETED: thread: %ld\n", event->Thread()); @@ -919,7 +938,7 @@ break; default: WARNING("TeamDebugger for team %ld: unknown event type: " - "%d\n", fTeamID, event->EventType()); + "%ld\n", fTeamID, event->EventType()); break; } @@ -954,6 +973,29 @@ bool +TeamDebugger::_HandleThreadRenamed(ThreadRenamedEvent* event) +{ + AutoLocker< ::Team> locker(fTeam); + + ::Thread* thread = fTeam->ThreadByID(event->RenamedThread()); + + if (thread != NULL) + thread->SetName(event->NewName()); + + return false; +} + + +bool +TeamDebugger::_HandleThreadPriorityChanged(ThreadPriorityChangedEvent*) +{ + // TODO: implement once we actually track thread priorities + + return false; +} + + +bool TeamDebugger::_HandleThreadDeleted(ThreadDeletedEvent* event) { AutoLocker< ::Team> locker(fTeam); Modified: haiku/trunk/src/apps/debugger/TeamDebugger.h =================================================================== --- haiku/trunk/src/apps/debugger/TeamDebugger.h 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/TeamDebugger.h 2010-12-16 04:19:53 UTC (rev 39866) @@ -95,6 +95,10 @@ bool _HandleThreadCreated( ThreadCreatedEvent* event); + bool _HandleThreadRenamed( + ThreadRenamedEvent* event); + bool _HandleThreadPriorityChanged( + ThreadPriorityChangedEvent* event); bool _HandleThreadDeleted( ThreadDeletedEvent* event); bool _HandleImageCreated( Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.cpp =================================================================== --- haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.cpp 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.cpp 2010-12-16 04:19:53 UTC (rev 39866) @@ -11,7 +11,7 @@ // #pragma mark - DebugEvent -DebugEvent::DebugEvent(debug_debugger_message eventType, team_id team, +DebugEvent::DebugEvent(int32 eventType, team_id team, thread_id thread) : fEventType(eventType), @@ -155,6 +155,32 @@ } +// #pragma mark - ThreadRenamedEvent + + +ThreadRenamedEvent::ThreadRenamedEvent(team_id team, thread_id thread, + thread_id renamedThread, const char* newName) + : + DebugEvent(DEBUGGER_MESSAGE_THREAD_RENAMED, team, thread), + fRenamedThread(renamedThread) +{ + strlcpy(fName, newName, sizeof(fName)); +} + + +// #pragma mark - ThreadPriorityChangedEvent + + +ThreadPriorityChangedEvent::ThreadPriorityChangedEvent(team_id team, + thread_id thread, thread_id changedThread, int32 newPriority) + : + DebugEvent(DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED, team, thread), + fChangedThread(changedThread), + fNewPriority(newPriority) +{ +} + + // #pragma mark - ThreadDeletedEvent Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.h =================================================================== --- haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.h 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/debugger_interface/DebugEvent.h 2010-12-16 04:19:53 UTC (rev 39866) @@ -14,13 +14,21 @@ class CpuState; +// constants for synthetic events generated via the +// start_system_watching() interface +enum { + DEBUGGER_MESSAGE_THREAD_RENAMED = 'dmtr', + DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED = 'dmpc' +}; + + class DebugEvent { public: - DebugEvent(debug_debugger_message eventType, + DebugEvent(int32 eventType, team_id team, thread_id thread); virtual ~DebugEvent(); - debug_debugger_message EventType() const { return fEventType; } + int32 EventType() const { return fEventType; } team_id Team() const { return fTeam; } thread_id Thread() const { return fThread; } @@ -28,7 +36,7 @@ void SetThreadStopped(bool stopped); private: - debug_debugger_message fEventType; + int32 fEventType; team_id fTeam; thread_id fThread; bool fThreadStopped; @@ -127,6 +135,36 @@ }; +class ThreadRenamedEvent : public DebugEvent { +public: + ThreadRenamedEvent(team_id team, + thread_id thread, thread_id renamedThread, + const char* name); + + thread_id RenamedThread() const { return fRenamedThread; } + const char* NewName() const { return fName; } + +private: + thread_id fRenamedThread; + char fName[B_OS_NAME_LENGTH]; +}; + + +class ThreadPriorityChangedEvent : public DebugEvent { +public: + ThreadPriorityChangedEvent(team_id team, + thread_id thread, thread_id changedThread, + int32 newPriority); + + thread_id ChangedThread() const { return fChangedThread; } + int32 NewPriority() const { return fNewPriority; } + +private: + thread_id fChangedThread; + int32 fNewPriority; +}; + + class ThreadDeletedEvent : public DebugEvent { public: ThreadDeletedEvent(team_id team, Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp =================================================================== --- haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.cpp 2010-12-16 04:19:53 UTC (rev 39866) @@ -13,7 +13,10 @@ #include <AutoLocker.h> #include <commpage_defs.h> +#include <OS.h> +#include <system_info.h> #include <util/DoublyLinkedList.h> +#include <util/KMessage.h> #include "debug_utils.h" @@ -227,6 +230,7 @@ fTeamID(teamID), fDebuggerPort(-1), fNubPort(-1), + fSystemWatchPort(-1), fDebugContextPool(NULL), fArchitecture(NULL) { @@ -272,6 +276,16 @@ if (fNubPort < 0) return fNubPort; + snprintf(buffer, sizeof(buffer), "team %ld debug system watcher", fTeamID); + fSystemWatchPort = create_port(100, buffer); + if (fSystemWatchPort < 0) + return fSystemWatchPort; + + error = start_system_watching(fTeamID, B_WATCH_SYSTEM_THREAD_PROPERTIES, + fSystemWatchPort, 0); + if (error != B_OK) + return error; + // create debug context pool fDebugContextPool = new(std::nothrow) DebugContextPool(fTeamID, fNubPort); if (fDebugContextPool == NULL) @@ -295,6 +309,9 @@ if (fDebuggerPort >= 0) delete_port(fDebuggerPort); + + if (fSystemWatchPort >= 0) + delete_port(fSystemWatchPort); } @@ -304,11 +321,32 @@ while (true) { debug_debugger_message_data message; int32 messageCode; - ssize_t size = read_port(fDebuggerPort, &messageCode, &message, + + object_wait_info infos[2]; + infos[0].object = fDebuggerPort; + infos[0].type = B_OBJECT_TYPE_PORT; + infos[0].events = B_EVENT_READ; + infos[1].object = fSystemWatchPort; + infos[1].type = B_OBJECT_TYPE_PORT; + infos[1].events = B_EVENT_READ; + + ssize_t size = wait_for_objects(infos, 2); + if (size < 0) { + if (size == B_INTERRUPTED) + continue; + + return size; + } + + 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; } @@ -719,3 +757,66 @@ return B_OK; } + + +status_t +DebuggerInterface::_GetNextSystemWatchEvent(DebugEvent*& _event) +{ + while (true) { + char buffer[1024]; + int32 messageCode; + ssize_t bytesRead = read_port(fSystemWatchPort, &messageCode, + buffer, sizeof(buffer)); + + if (bytesRead < 0) { + if (bytesRead == B_INTERRUPTED) + continue; + + return bytesRead; + } + + KMessage message; + status_t error = message.SetTo((const void *)buffer, bytesRead); + if (error != B_OK) + return error; + if (message.What() != B_SYSTEM_OBJECT_UPDATE) + return B_BAD_DATA; + + int32 opcode = 0; + if (message.FindInt32("opcode", &opcode) != B_OK) + return B_BAD_DATA; + + DebugEvent* event = NULL; + switch (opcode) + { + case B_THREAD_NAME_CHANGED: + { + int32 threadID = -1; + if (message.FindInt32("thread", &threadID) != B_OK) + break; + + thread_info info; + error = get_thread_info(threadID, &info); + if (error != B_OK) + break; + + event = new(std::nothrow) ThreadRenamedEvent(fTeamID, + threadID, threadID, info.name); + break; + } + + default: + { + error = B_BAD_DATA; + break; + } + } + + if (event != NULL) + _event = event; + + return error; + } + + return B_OK; +} Modified: haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h =================================================================== --- haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h 2010-12-16 04:15:39 UTC (rev 39865) +++ haiku/trunk/src/apps/debugger/debugger_interface/DebuggerInterface.h 2010-12-16 04:19:53 UTC (rev 39866) @@ -73,10 +73,13 @@ const debug_debugger_message_data& message, bool& _ignore, DebugEvent*& _event); + status_t _GetNextSystemWatchEvent(DebugEvent*& _event); + private: team_id fTeamID; port_id fDebuggerPort; port_id fNubPort; + port_id fSystemWatchPort; DebugContextPool* fDebugContextPool; Architecture* fArchitecture; };