From 8fb7eb8b17ab5d027a896e393b057cc6939dc78c Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 14 Dec 2010 05:11:21 +0000 Subject: [PATCH] Implement support for catching rename and thread priority change events. This lets us keep up to date with thread names, which makes, for example Tracker a bit more tolerable to debug since it employs thread renaming to set the names of its windows. Implements #4430. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39847 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debugger/TeamDebugger.cpp | 42 +++++++++++++++++++ src/apps/debugger/TeamDebugger.h | 4 ++ .../debugger_interface/DebugEvent.cpp | 26 ++++++++++++ .../debugger/debugger_interface/DebugEvent.h | 30 +++++++++++++ .../debugger_interface/DebuggerInterface.cpp | 11 +++++ 5 files changed, 113 insertions(+) diff --git a/src/apps/debugger/TeamDebugger.cpp b/src/apps/debugger/TeamDebugger.cpp index b07f958a32..e269ed206b 100644 --- a/src/apps/debugger/TeamDebugger.cpp +++ b/src/apps/debugger/TeamDebugger.cpp @@ -884,6 +884,25 @@ TeamDebugger::_HandleDebuggerMessage(DebugEvent* event) handled = _HandleThreadCreated(threadEvent); break; } + case B_DEBUGGER_MESSAGE_THREAD_RENAMED: + { + ThreadRenamedEvent* threadEvent + = dynamic_cast(event); + TRACE_EVENTS("B_DEBUGGER_MESSAGE_THREAD_RENAMED: thread: %ld " + "(\"%s\")\n", + threadEvent->RenamedThread(), threadEvent->NewName()); + handled = _HandleThreadRenamed(threadEvent); + break; + } + case B_DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED: + { + ThreadPriorityChangedEvent* threadEvent + = dynamic_cast(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()); @@ -953,6 +972,29 @@ TeamDebugger::_HandleThreadCreated(ThreadCreatedEvent* event) } +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) { diff --git a/src/apps/debugger/TeamDebugger.h b/src/apps/debugger/TeamDebugger.h index ac4181d7d8..ab616c6b7c 100644 --- a/src/apps/debugger/TeamDebugger.h +++ b/src/apps/debugger/TeamDebugger.h @@ -95,6 +95,10 @@ private: bool _HandleThreadCreated( ThreadCreatedEvent* event); + bool _HandleThreadRenamed( + ThreadRenamedEvent* event); + bool _HandleThreadPriorityChanged( + ThreadPriorityChangedEvent* event); bool _HandleThreadDeleted( ThreadDeletedEvent* event); bool _HandleImageCreated( diff --git a/src/apps/debugger/debugger_interface/DebugEvent.cpp b/src/apps/debugger/debugger_interface/DebugEvent.cpp index 0891249d44..c62832e452 100644 --- a/src/apps/debugger/debugger_interface/DebugEvent.cpp +++ b/src/apps/debugger/debugger_interface/DebugEvent.cpp @@ -155,6 +155,32 @@ ThreadCreatedEvent::ThreadCreatedEvent(team_id team, thread_id thread, } +// #pragma mark - ThreadRenamedEvent + + +ThreadRenamedEvent::ThreadRenamedEvent(team_id team, thread_id thread, + thread_id renamedThread, const char* newName) + : + DebugEvent(B_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(B_DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED, team, thread), + fChangedThread(changedThread), + fNewPriority(newPriority) +{ +} + + // #pragma mark - ThreadDeletedEvent diff --git a/src/apps/debugger/debugger_interface/DebugEvent.h b/src/apps/debugger/debugger_interface/DebugEvent.h index f81a5e4ee9..ad673adc1c 100644 --- a/src/apps/debugger/debugger_interface/DebugEvent.h +++ b/src/apps/debugger/debugger_interface/DebugEvent.h @@ -127,6 +127,36 @@ private: }; +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, diff --git a/src/apps/debugger/debugger_interface/DebuggerInterface.cpp b/src/apps/debugger/debugger_interface/DebuggerInterface.cpp index ddcd4f825b..74c2b86ba7 100644 --- a/src/apps/debugger/debugger_interface/DebuggerInterface.cpp +++ b/src/apps/debugger/debugger_interface/DebuggerInterface.cpp @@ -670,6 +670,17 @@ DebuggerInterface::_CreateDebugEvent(int32 messageCode, event = new(std::nothrow) ThreadCreatedEvent(message.origin.team, message.origin.thread, message.thread_created.new_thread); break; + case B_DEBUGGER_MESSAGE_THREAD_RENAMED: + event = new(std::nothrow) ThreadRenamedEvent(message.origin.team, + message.origin.thread, message.thread_renamed.renamed_thread, + message.thread_renamed.name); + break; + case B_DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED: + event = new(std::nothrow) ThreadPriorityChangedEvent( + message.origin.team, message.origin.thread, + message.thread_priority_changed.changed_thread, + message.thread_priority_changed.new_priority); + break; case B_DEBUGGER_MESSAGE_THREAD_DELETED: event = new(std::nothrow) ThreadDeletedEvent(message.origin.team, message.origin.thread);