root/src/apps/debugger/user_interface/cli/commands/CliThreadsCommand.cpp
/*
 * Copyright 2012, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include "CliThreadsCommand.h"

#include <stdio.h>

#include <AutoLocker.h>

#include "CliContext.h"
#include "Team.h"
#include "UiUtils.h"


CliThreadsCommand::CliThreadsCommand()
        :
        CliCommand("list the team's threads",
                "%s\n"
                "Lists the team's threads.")
{
}


void
CliThreadsCommand::Execute(int argc, const char* const* argv,
        CliContext& context)
{
        Team* team = context.GetTeam();
        AutoLocker<Team> teamLocker(team);

        printf("        ID  state      name\n");
        printf("----------------------------\n");

        for (ThreadList::ConstIterator it = team->Threads().GetIterator();
                        Thread* thread = it.Next();) {
                const char* stateString = UiUtils::ThreadStateToString(
                        thread->State(), thread->StoppedReason());
                printf("%10" B_PRId32 "  %-9s  \"%s\"", thread->ID(), stateString,
                        thread->Name());

                const BString& stoppedReason = thread->StoppedReasonInfo();
                if (thread->State() == THREAD_STATE_STOPPED
                        && !stoppedReason.IsEmpty()) {
                        printf(" (Reason: \"%s\")", stoppedReason.String());
                }
                printf("\n");
        }
}