diff --git a/src/bin/ps.c b/src/bin/ps.c index ca545abf60..b20b3549df 100644 --- a/src/bin/ps.c +++ b/src/bin/ps.c @@ -5,29 +5,102 @@ * Authors: * Francois Revol (mmu_man) * Salvatore Benedetto + * Bjoern Herzig (xRaich[o]2x) */ #include +#include #include #include #define SNOOZE_TIME 100000 +char *states[] = {"run", "rdy", "msg", "zzz", "sus", "wait" }; -int -main(int argc, char **argv) +void printTeamThreads(team_info *teamInfo, bool printSemaphoreInfo); +void printTeamInfo(team_info *teamInfo, bool printHeader); + +void printTeamInfo(team_info *teamInfo, bool printHeader) { - team_info teamInfo; - thread_info threadInfo; - uint32 teamCookie = 0; + // Print team info + if (printHeader) + printf("%-49s %5s %8s %4s %4s\n", "Team", "Id", "#Threads", "Gid", "Uid"); + + printf("%-49s %5ld %8ld %4d %4d\n", teamInfo->args, teamInfo->team, + teamInfo->thread_count, teamInfo->uid, teamInfo->gid); +} + +void printTeamThreads(team_info *teamInfo, bool printSemaphoreInfo) { + char *threadState; uint32 threadCookie = 0; sem_info semaphoreInfo; - char *threadState; - char *states[] = {"run", "rdy", "msg", "zzz", "sus", "wait" }; + thread_info threadInfo; + + // Print all info about its threads too + while (get_next_thread_info(teamInfo->team, &threadCookie, &threadInfo) + >= B_OK) { + if (threadInfo.state < B_THREAD_RUNNING + || threadInfo.state > B_THREAD_WAITING) + // This should never happen + threadState = "???"; + else + threadState = states[threadInfo.state - 1]; + + printf("%-29s %5ld %8s %4ld %8llu %8llu ", + threadInfo.name, threadInfo.thread, threadState, + threadInfo.priority, (threadInfo.user_time / 1000), + (threadInfo.kernel_time / 1000)); + + if (printSemaphoreInfo) { + if (threadInfo.state == B_THREAD_WAITING && threadInfo.sem != -1) { + status_t status = get_sem_info(threadInfo.sem, &semaphoreInfo); + if (status == B_OK) + printf("%s(%ld)\n", semaphoreInfo.name, semaphoreInfo.sem); + else + printf("%s(%ld)\n", strerror(status), threadInfo.sem); + } else + puts(""); + } + else + puts(""); + } +} + +int main(int argc, char **argv) +{ + team_info teamInfo; + uint32 teamCookie = 0; system_info systemInfo; - bool printSystemInfo = true; + bool printSystemInfo = false; + bool printThreads = false; + bool printHeader = true; + bool printSemaphoreInfo = false; // match this in team name char *string_to_match; + + int c; + + while ((c = getopt(argc, argv,"ihas")) != EOF) { + switch(c) { + case 'i': + printSystemInfo = true; + break; + case 'h': + printf( "usage: ps [-hais] [team]\n" + "-h : show help\n" + "-i : show system info\n" + "-s : show semaphore info\n" + "-a : show threads too (by default only teams are displayed)\n"); + return 0; + break; + case 'a': + printThreads = true; + break; + case 's': + printSemaphoreInfo = true; + break; + } + } // TODO: parse command line // Possible command line options: @@ -38,11 +111,27 @@ main(int argc, char **argv) // -a show threads too (by default only teams are displayed) // -s show semaphore info // -i show system info - string_to_match = (argc == 2) ? argv[1] : NULL; - - printf("%-50s %4s %8s %4s %4s\n", "Team", "Id", "#Threads", "Gid", "Uid"); - while (get_next_team_info(&teamCookie, &teamInfo) >= B_OK) { - if (string_to_match) { + + if (argc == 2 && (printSystemInfo||printThreads)) + string_to_match = NULL; + else + string_to_match = (argc >= 2) ? argv[argc-1] : NULL; + + if (!string_to_match) { + while (get_next_team_info(&teamCookie, &teamInfo) >= B_OK) { + + printTeamInfo(&teamInfo,printHeader); + printHeader = false; + if (printThreads) { + printf("\n%-29s %5s %8s %4s %8s %8s\n", "Thread", "Id", "State","Prio", "UTime", "KTime"); + printTeamThreads(&teamInfo,printSemaphoreInfo); + printf("--------------------------------------------------------------------------\n"); + printHeader = true; + } + } + } + else { + while (get_next_team_info(&teamCookie, &teamInfo) >= B_OK) { char *p; p = teamInfo.args; if ((p = strchr(p, ' '))) @@ -52,41 +141,9 @@ main(int argc, char **argv) p = teamInfo.args; if (strstr(p, string_to_match) == NULL) continue; - // Print team info - printf("%-50s %4ld %8ld %4d %4d\n\n", teamInfo.args, teamInfo.team, - teamInfo.thread_count, teamInfo.uid, teamInfo.gid); - - printf("%-30s %4s %8s %4s %8s %8s\n", "Thread", "Id", "State", - "Prio", "UTime", "KTime"); - // Print all info about its threads too - while (get_next_thread_info(teamInfo.team, &threadCookie, &threadInfo) - >= B_OK) { - if (threadInfo.state < B_THREAD_RUNNING - || threadInfo.state > B_THREAD_WAITING) - // This should never happen - threadState = "???"; - else - threadState = states[threadInfo.state - 1]; - - printf("%-30s %4ld %8s %4ld %8llu %8llu ", - threadInfo.name, threadInfo.thread, threadState, - threadInfo.priority, (threadInfo.user_time / 1000), - (threadInfo.kernel_time / 1000)); - - if (threadInfo.state == B_THREAD_WAITING && threadInfo.sem != -1) { - status_t status = get_sem_info(threadInfo.sem, &semaphoreInfo); - if (status == B_OK) - printf("%s(%ld)\n", semaphoreInfo.name, semaphoreInfo.sem); - else - printf("%s(%ld)\n", strerror(status), threadInfo.sem); - } else - puts(""); - } - break; - - } else { - printf("%-50s %4ld %8ld %4d %4d\n", teamInfo.args, teamInfo.team, - teamInfo.thread_count, teamInfo.uid, teamInfo.gid); + printTeamInfo(&teamInfo,true); + printf("\n%-29s %5s %8s %4s %8s %8s\n", "Thread", "Id", "State","Prio", "UTime", "KTime"); + printTeamThreads(&teamInfo,printSemaphoreInfo); } }