Author: bonefish Date: 2010-02-23 21:37:36 +0100 (Tue, 23 Feb 2010) New Revision: 35591 Changeset: http://dev.haiku-os.org/changeset/35591/haiku Modified: haiku/trunk/src/bin/debug/profile/Team.h haiku/trunk/src/bin/debug/profile/Thread.cpp haiku/trunk/src/bin/debug/profile/profile.cpp Log: Made Team BReferenceable. Since teams are usually destroyed before their main thread, we were accessing already destroyed Team objects. Modified: haiku/trunk/src/bin/debug/profile/Team.h =================================================================== --- haiku/trunk/src/bin/debug/profile/Team.h 2010-02-23 19:18:17 UTC (rev 35590) +++ haiku/trunk/src/bin/debug/profile/Team.h 2010-02-23 20:37:36 UTC (rev 35591) @@ -9,6 +9,7 @@ #include <debug_support.h> #include <ObjectList.h> +#include <Referenceable.h> #include <util/DoublyLinkedList.h> #include "Thread.h" @@ -19,7 +20,7 @@ struct system_profiler_team_added; -class Team { +class Team : public BReferenceable { public: Team(); ~Team(); Modified: haiku/trunk/src/bin/debug/profile/Thread.cpp =================================================================== --- haiku/trunk/src/bin/debug/profile/Thread.cpp 2010-02-23 19:18:17 UTC (rev 35590) +++ haiku/trunk/src/bin/debug/profile/Thread.cpp 2010-02-23 20:37:36 UTC (rev 35591) @@ -51,6 +51,7 @@ fProfileResult(NULL), fLazyImages(true) { + fTeam->AcquireReference(); } @@ -66,6 +67,8 @@ delete image; while (ThreadImage* image = fOldImages.RemoveHead()) delete image; + + fTeam->ReleaseReference(); } Modified: haiku/trunk/src/bin/debug/profile/profile.cpp =================================================================== --- haiku/trunk/src/bin/debug/profile/profile.cpp 2010-02-23 19:18:17 UTC (rev 35590) +++ haiku/trunk/src/bin/debug/profile/profile.cpp 2010-02-23 20:37:36 UTC (rev 35591) @@ -101,7 +101,7 @@ public: ThreadManager(port_id debuggerPort) : - fTeams(20, true), + fTeams(20), fThreads(20, true), fKernelTeam(NULL), fDebuggerPort(debuggerPort), @@ -117,6 +117,9 @@ if (fSummaryProfileResult != NULL) fSummaryProfileResult->ReleaseReference(); + + for (int32 i = 0; Team* team = fTeams.ItemAt(i); i++) + team->ReleaseReference(); } status_t Init() @@ -193,7 +196,8 @@ if (Team* team = FindTeam(teamID)) { if (team == fKernelTeam) fKernelTeam = NULL; - fTeams.RemoveItem(team, true); + fTeams.RemoveItem(team); + team->ReleaseReference(); } } @@ -308,7 +312,7 @@ ? _InitUndebuggedTeam(team, addedInfo) : _InitDebuggedTeam(team, teamID); if (error != B_OK) { - delete team; + team->ReleaseReference(); return error; }