void MemoryBarMenu::Pulse() { system_info sinfo; get_system_info(&sinfo); int committedMemory = int(sinfo.used_pages * B_PAGE_SIZE / 1024); int cachedMemory = int(sinfo.cached_pages * B_PAGE_SIZE / 1024); Window()->BeginViewTransaction(); // create the list of items to remove, for their team is gone. Update the old teams. int lastRecycle = 0; int firstRecycle = 0; int k; MemoryBarMenuItem* item; int total = 0; for (k = 1; (item = (MemoryBarMenuItem*)ItemAt(k)) != NULL; k++) { int m = item->UpdateSituation(committedMemory); if (m < 0) { if (lastRecycle == fRecycleCount) { fRecycleCount += EXTRA; fRecycleList = (MRecycleItem*)realloc(fRecycleList, sizeof(MRecycleItem) * fRecycleCount); } fRecycleList[lastRecycle].index = k; fRecycleList[lastRecycle++].item = item; } else { if (lastRecycle > 0) { RemoveItems(fRecycleList[0].index, lastRecycle, true); k -= lastRecycle; lastRecycle = 0; } total += m; } } // Look new teams that have appeared. Create an item for them, or recycle from the list. int32 cookie = 0; info_pack infos; item = NULL; while (get_next_team_info(&cookie, &infos.team_info) == B_OK) { int j = 0; while (j < fTeamCount && infos.team_info.team != fTeamList[j]) { j++; } if (infos.team_info.team != fTeamList[j]) { // new team team_info info; j = 0; while (j < fTeamCount && fTeamList[j] != -1) { if (get_team_info(fTeamList[j], &info) != B_OK) fTeamList[j] = -1; else j++; } if (j == fTeamCount) { fTeamCount += 10; fTeamList = (team_id*)realloc(fTeamList, sizeof(team_id) * fTeamCount); } fTeamList[j] = infos.team_info.team; if (!get_team_name_and_icon(infos, true)) { // the team is already gone! delete infos.team_icon; fTeamList[j] = -1; } else { if (!item && firstRecycle < lastRecycle) item = fRecycleList[firstRecycle++].item; if (item) item->Reset(infos.team_name, infos.team_info.team, infos.team_icon, true); else { AddItem(item = new MemoryBarMenuItem(infos.team_name, infos.team_info.team, infos.team_icon, true, NULL)); } int m = item->UpdateSituation(committedMemory); if (m >= 0) { total += m; item = NULL; } else fTeamList[j] = -1; } } } if (item) { RemoveItem(item); delete item; } // Delete the items that haven't been recycled. if (firstRecycle < lastRecycle) { RemoveItems(IndexOf(fRecycleList[firstRecycle].item), lastRecycle - firstRecycle, true); } fLastTotalTime = system_time(); KernelMemoryBarMenuItem *kernelItem; if ((kernelItem = (KernelMemoryBarMenuItem*)ItemAt(0)) != NULL) kernelItem->UpdateSituation(committedMemory, cachedMemory); Window()->EndViewTransaction(); Window()->Flush(); }
status_t thread_debug_thread(void *arg) { Tdebug_thead_param* param = (Tdebug_thead_param*) arg; #ifdef __HAIKU__ debug_thread(param->thread); #else // !__HAIKU__ thread_info thinfo; get_thread_info(param->thread, &thinfo); char text[4096]; sprintf(text, "db %d", int(param->thread)); system(text); if (param->sem >= 0 && thinfo.state == B_THREAD_WAITING && param->sem == thinfo.sem) { snooze(1000000); get_thread_info(param->thread, &thinfo); if (thinfo.state == B_THREAD_WAITING && param->sem == thinfo.sem && param->totalTime == thinfo.user_time + thinfo.kernel_time) { // the thread has been waiting for this semaphore since the before // the alert, not doing anything... Let's push it out of there! sem_info sinfo; thread_info thinfo; info_pack infos; if (get_sem_info(param->sem, &sinfo) == B_OK && get_thread_info(param->thread, &thinfo) == B_OK && get_team_info(thinfo.team, &infos.team_info) == B_OK) { sprintf (text, "This thread is waiting for the " "semaphore called \"%s\". As long as it waits for this " "semaphore, you won't be able to debug that thread.\n", sinfo.name); if (sinfo.team == thinfo.team) strcat(text, "This semaphore belongs to the " "thread's team.\n\nShould I release this semaphore?\n"); else { get_team_name_and_icon(infos); char moreText[1024]; sprintf(moreText, "\nWARNING! This semaphore " "belongs to the team \"%s\"!\n\nShould I release this " "semaphore anyway?\n", infos.team_name); strcat(text, moreText); } BAlert* alert = new BAlert("", text, "Cancel", "Release", NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); if (alert->Go()) { get_thread_info (param->thread, &thinfo); if (thinfo.state == B_THREAD_WAITING && param->sem == thinfo.sem && param->totalTime == thinfo.user_time + thinfo.kernel_time) release_sem(param->sem); else { alert = new BAlert("", "The semaphore wasn't released, " "because it wasn't necessary anymore!", "OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); } } } } } #endif // !__HAIKU__ delete param; return B_OK; }
status_t thread_popup(void *arg) { Tpopup_param* param = (Tpopup_param*) arg; int32 mcookie, hcookie; unsigned long m; long h; BMenuItem* item; bool top = param->top; system_info systemInfo; get_system_info(&systemInfo); info_pack* infos = new info_pack[systemInfo.used_teams]; // TODO: this doesn't necessarily get all teams for (m = 0, mcookie = 0; m < systemInfo.used_teams; m++) { infos[m].team_icon = NULL; infos[m].team_name[0] = 0; infos[m].thread_info = NULL; if (get_next_team_info(&mcookie, &infos[m].team_info) == B_OK) { infos[m].thread_info = new thread_info[infos[m].team_info.thread_count]; for (h = 0, hcookie = 0; h < infos[m].team_info.thread_count; h++) { if (get_next_thread_info(infos[m].team_info.team, &hcookie, &infos[m].thread_info[h]) != B_OK) infos[m].thread_info[h].thread = -1; } get_team_name_and_icon(infos[m], true); } else { systemInfo.used_teams = m; infos[m].team_info.team = -1; } } BPopUpMenu* popup = new BPopUpMenu("Global Popup", false, false); popup->SetFont(be_plain_font); // Quit section BMenu* QuitPopup = new QuitMenu(B_TRANSLATE("Quit an application"), infos, systemInfo.used_teams); QuitPopup->SetFont(be_plain_font); popup->AddItem(QuitPopup); // Memory Usage section MemoryBarMenu* MemoryPopup = new MemoryBarMenu(B_TRANSLATE("Memory usage"), infos, systemInfo); int64 committedMemory = (int64)systemInfo.used_pages * B_PAGE_SIZE / 1024; for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { MemoryBarMenuItem* memoryItem = new MemoryBarMenuItem(infos[m].team_name, infos[m].team_info.team, infos[m].team_icon, false, NULL); MemoryPopup->AddItem(memoryItem); memoryItem->UpdateSituation(committedMemory); } } addtopbottom(MemoryPopup); // CPU Load section TeamBarMenu* CPUPopup = new TeamBarMenu(B_TRANSLATE("Threads and CPU " "usage"), infos, systemInfo.used_teams); for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { ThreadBarMenu* TeamPopup = new ThreadBarMenu(infos[m].team_name, infos[m].team_info.team, infos[m].team_info.thread_count); BMessage* kill_team = new BMessage('KlTm'); kill_team->AddInt32("team", infos[m].team_info.team); TeamBarMenuItem* item = new TeamBarMenuItem(TeamPopup, kill_team, infos[m].team_info.team, infos[m].team_icon, false); item->SetTarget(gPCView); CPUPopup->AddItem(item); } } addtopbottom(CPUPopup); addtopbottom(new BSeparatorItem()); // CPU on/off section if (gCPUcount > 1) { for (unsigned int i = 0; i < gCPUcount; i++) { char item_name[32]; sprintf (item_name, B_TRANSLATE("Processor %d"), i + 1); BMessage* m = new BMessage ('CPU '); m->AddInt32 ("cpu", i); item = new IconMenuItem (gPCView->fProcessorIcon, item_name, m); if (_kern_cpu_enabled(i)) item->SetMarked (true); item->SetTarget(gPCView); addtopbottom(item); } addtopbottom (new BSeparatorItem ()); } // Scheduler modes static const char* schedulerModes[] = { B_TRANSLATE_MARK("Low latency"), B_TRANSLATE_MARK("Power saving") }; unsigned int modesCount = sizeof(schedulerModes) / sizeof(const char*); int32 currentMode = get_scheduler_mode(); for (unsigned int i = 0; i < modesCount; i++) { BMessage* m = new BMessage('Schd'); m->AddInt32("mode", i); item = new BMenuItem(B_TRANSLATE(schedulerModes[i]), m); if ((uint32)currentMode == i) item->SetMarked(true); item->SetTarget(gPCView); addtopbottom(item); } addtopbottom(new BSeparatorItem()); if (!be_roster->IsRunning(kTrackerSig)) { item = new IconMenuItem(gPCView->fTrackerIcon, B_TRANSLATE("Restart Tracker"), new BMessage('Trac')); item->SetTarget(gPCView); addtopbottom(item); } if (!be_roster->IsRunning(kDeskbarSig)) { item = new IconMenuItem(gPCView->fDeskbarIcon, B_TRANSLATE("Restart Deskbar"), new BMessage('Dbar')); item->SetTarget(gPCView); addtopbottom(item); } item = new IconMenuItem(gPCView->fTerminalIcon, B_TRANSLATE("New Terminal"), new BMessage('Term')); item->SetTarget(gPCView); addtopbottom(item); addtopbottom(new BSeparatorItem()); bool showLiveInDeskbarItem = gInDeskbar; if (!showLiveInDeskbarItem) { int32 cookie = 0; image_info info; while (get_next_image_info(B_CURRENT_TEAM, &cookie, &info) == B_OK) { if (info.type == B_APP_IMAGE) { // only show the Live in Deskbar item if a) we're running in // deskbar itself, or b) we're running in PC's team. if (strstr(info.name, "ProcessController") != NULL) { showLiveInDeskbarItem = true; break; } } } } if (showLiveInDeskbarItem && be_roster->IsRunning(kDeskbarSig)) { item = new BMenuItem(B_TRANSLATE("Live in the Deskbar"), new BMessage('AlDb')); BDeskbar deskbar; item->SetMarked(gInDeskbar || deskbar.HasItem(kDeskbarItemName)); item->SetTarget(gPCView); addtopbottom(item); addtopbottom(new BSeparatorItem ()); } item = new IconMenuItem(gPCView->fProcessControllerIcon, B_TRANSLATE("About ProcessController" B_UTF8_ELLIPSIS), new BMessage(B_ABOUT_REQUESTED)); item->SetTarget(gPCView); addtopbottom(item); param->where.x -= 5; param->where.y -= 8; popup->Go(param->where, true, true, param->clickToOpenRect); delete popup; for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { delete[] infos[m].thread_info; delete infos[m].team_icon; } } delete[] infos; delete param; atomic_add (&gPopupFlag, -1); gPopupThreadID = 0; return B_OK; }
void ProcessController::MessageReceived(BMessage *message) { team_id team; thread_id thread; BAlert *alert; char question[1000]; switch (message->what) { case 'Puls': Update (); DoDraw (false); break; case 'QtTm': if (message->FindInt32("team", &team) == B_OK) { resume_thread(spawn_thread(thread_quit_application, B_TRANSLATE("Quit application"), B_NORMAL_PRIORITY, (void*)(addr_t)team)); } break; case 'KlTm': if (message->FindInt32("team", &team) == B_OK) { info_pack infos; if (get_team_info(team, &infos.team_info) == B_OK) { get_team_name_and_icon(infos); snprintf(question, sizeof(question), B_TRANSLATE("What do you want to do with the team \"%s\"?"), infos.team_name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Debug this team!"), B_TRANSLATE("Kill this team!"), B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); int result = alert->Go(); switch (result) { case 1: _HandleDebugRequest(team, -1); break; case 2: kill_team(team); break; default: break; } } else { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This team is already gone" B_UTF8_ELLIPSIS), B_TRANSLATE("Ok!"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); } } break; case 'KlTh': if (message->FindInt32("thread", &thread) == B_OK) { thread_info thinfo; if (get_thread_info(thread, &thinfo) == B_OK) { #if DEBUG_THREADS snprintf(question, sizeof(question), B_TRANSLATE("What do you want to do " "with the thread \"%s\"?"), thinfo.name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Debug this thread!"), B_TRANSLATE("Kill this thread!"), B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); #define KILL 2 #else snprintf(question, sizeof(question), B_TRANSLATE("Are you sure you want " "to kill the thread \"%s\"?"), thinfo.name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Kill this thread!"), NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); #define KILL 1 #endif alert->SetShortcut(0, B_ESCAPE); int r = alert->Go(); if (r == KILL) kill_thread(thread); #if DEBUG_THREADS else if (r == 1) _HandleDebugRequest(thinfo.team, thinfo.thread); #endif } else { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This thread is already gone" B_UTF8_ELLIPSIS), B_TRANSLATE("Ok!"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); } } break; case 'PrTh': if (message->FindInt32("thread", &thread) == B_OK) { int32 new_priority; if (message->FindInt32("priority", &new_priority) == B_OK) set_thread_priority(thread, new_priority); } break; case 'Trac': { BPath trackerPath; if (find_directory(B_SYSTEM_DIRECTORY, &trackerPath) == B_OK && trackerPath.Append("Tracker") == B_OK) { launch(kTrackerSig, trackerPath.Path()); } break; } case 'Dbar': { BPath deskbarPath; if (find_directory(B_SYSTEM_DIRECTORY, &deskbarPath) == B_OK && deskbarPath.Append("Deskbar") == B_OK) { launch(kDeskbarSig, deskbarPath.Path()); } break; } case 'Term': { BPath terminalPath; if (find_directory(B_SYSTEM_APPS_DIRECTORY, &terminalPath) == B_OK && terminalPath.Append("Terminal") == B_OK) { launch(kTerminalSig, terminalPath.Path()); } break; } case 'AlDb': { if (!be_roster->IsRunning(kDeskbarSig)) { BPath deskbarPath; if (find_directory(B_SYSTEM_DIRECTORY, &deskbarPath) == B_OK && deskbarPath.Append("Deskbar") == B_OK) { launch(kDeskbarSig, deskbarPath.Path()); } } BDeskbar deskbar; if (gInDeskbar || deskbar.HasItem (kDeskbarItemName)) deskbar.RemoveItem (kDeskbarItemName); else move_to_deskbar(deskbar); break; } case 'CPU ': { uint32 cpu; if (message->FindInt32("cpu", (int32*)&cpu) == B_OK) { bool last = true; for (unsigned int p = 0; p < gCPUcount; p++) { if (p != cpu && _kern_cpu_enabled(p)) { last = false; break; } } if (last) { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This is the last active processor...\n" "You can't turn it off!"), B_TRANSLATE("That's no Fun!"), NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); } else _kern_set_cpu_enabled(cpu, !_kern_cpu_enabled(cpu)); } break; } case 'Schd': { int32 mode; if (message->FindInt32 ("mode", &mode) == B_OK) set_scheduler_mode(mode); break; } case B_ABOUT_REQUESTED: AboutRequested(); break; default: BView::MessageReceived(message); } }
long thread_popup(void *arg) { Tpopup_param* param = (Tpopup_param*) arg; int32 mcookie, hcookie; long m, h; BMenuItem* item; bool top = param->top; system_info systemInfo; get_system_info(&systemInfo); info_pack* infos = new info_pack[systemInfo.used_teams]; // TODO: this doesn't necessarily get all teams for (m = 0, mcookie = 0; m < systemInfo.used_teams; m++) { infos[m].team_icon = NULL; infos[m].team_name[0] = 0; infos[m].thread_info = NULL; if (get_next_team_info(&mcookie, &infos[m].team_info) == B_OK) { infos[m].thread_info = new thread_info[infos[m].team_info.thread_count]; for (h = 0, hcookie = 0; h < infos[m].team_info.thread_count; h++) { if (get_next_thread_info(infos[m].team_info.team, &hcookie, &infos[m].thread_info[h]) != B_OK) infos[m].thread_info[h].thread = -1; } get_team_name_and_icon(infos[m], true); } else { systemInfo.used_teams = m; infos[m].team_info.team = -1; } } BPopUpMenu* popup = new BPopUpMenu("Global Popup", false, false); popup->SetFont(be_plain_font); // Quit section BMenu* QuitPopup = new QuitMenu(B_TRANSLATE("Quit an application"), infos, systemInfo.used_teams); QuitPopup->SetFont(be_plain_font); popup->AddItem(QuitPopup); // Memory Usage section MemoryBarMenu* MemoryPopup = new MemoryBarMenu(B_TRANSLATE("Memory usage"), infos, systemInfo); int commitedMemory = int(systemInfo.used_pages * B_PAGE_SIZE / 1024); for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { MemoryBarMenuItem* memoryItem = new MemoryBarMenuItem(infos[m].team_name, infos[m].team_info.team, infos[m].team_icon, false, NULL); MemoryPopup->AddItem(memoryItem); memoryItem->UpdateSituation(commitedMemory); } } addtopbottom(MemoryPopup); // CPU Load section TeamBarMenu* CPUPopup = new TeamBarMenu(B_TRANSLATE("Threads and CPU " "usage"), infos, systemInfo.used_teams); for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { ThreadBarMenu* TeamPopup = new ThreadBarMenu(infos[m].team_name, infos[m].team_info.team, infos[m].team_info.thread_count); BMessage* kill_team = new BMessage('KlTm'); kill_team->AddInt32("team", infos[m].team_info.team); TeamBarMenuItem* item = new TeamBarMenuItem(TeamPopup, kill_team, infos[m].team_info.team, infos[m].team_icon, false); item->SetTarget(gPCView); CPUPopup->AddItem(item); } } addtopbottom(CPUPopup); addtopbottom(new BSeparatorItem()); // CPU on/off section if (gCPUcount > 1) { for (int i = 0; i < gCPUcount; i++) { char item_name[32]; sprintf (item_name, B_TRANSLATE("Processor %d"), i + 1); BMessage* m = new BMessage ('CPU '); m->AddInt32 ("cpu", i); item = new IconMenuItem (gPCView->fProcessorIcon, item_name, m); if (_kern_cpu_enabled(i)) item->SetMarked (true); item->SetTarget(gPCView); addtopbottom(item); } addtopbottom (new BSeparatorItem ()); } if (!be_roster->IsRunning(kTrackerSig)) { item = new IconMenuItem(gPCView->fTrackerIcon, B_TRANSLATE("Restart Tracker"), new BMessage('Trac')); item->SetTarget(gPCView); addtopbottom(item); } if (!be_roster->IsRunning(kDeskbarSig)) { item = new IconMenuItem(gPCView->fDeskbarIcon, B_TRANSLATE("Restart Deskbar"), new BMessage('Dbar')); item->SetTarget(gPCView); addtopbottom(item); } item = new IconMenuItem(gPCView->fTerminalIcon, B_TRANSLATE("New Terminal"), new BMessage('Term')); item->SetTarget(gPCView); addtopbottom(item); addtopbottom(new BSeparatorItem()); if (be_roster->IsRunning(kDeskbarSig)) { item = new BMenuItem(B_TRANSLATE("Live in the Deskbar"), new BMessage('AlDb')); BDeskbar deskbar; item->SetMarked(gInDeskbar || deskbar.HasItem(kDeskbarItemName)); item->SetTarget(gPCView); addtopbottom(item); addtopbottom(new BSeparatorItem ()); } item = new IconMenuItem(gPCView->fProcessControllerIcon, B_TRANSLATE("About ProcessController"B_UTF8_ELLIPSIS), new BMessage(B_ABOUT_REQUESTED)); item->SetTarget(gPCView); addtopbottom(item); param->where.x -= 5; param->where.y -= 8; popup->Go(param->where, true, true, param->clickToOpenRect); delete popup; for (m = 0; m < systemInfo.used_teams; m++) { if (infos[m].team_info.team >= 0) { delete[] infos[m].thread_info; delete infos[m].team_icon; } } delete[] infos; delete param; atomic_add (&gPopupFlag, -1); gPopupThreadID = 0; return B_OK; }
void ProcessController::MessageReceived(BMessage *message) { team_id team; thread_id thread; BAlert *alert; char question[1000]; switch (message->what) { case 'Puls': Update (); DoDraw (false); break; case 'QtTm': if (message->FindInt32("team", &team) == B_OK) { resume_thread(spawn_thread(thread_quit_application, B_TRANSLATE("Quit application"), B_NORMAL_PRIORITY, (void*) team)); } break; case 'KlTm': if (message->FindInt32("team", &team) == B_OK) { info_pack infos; if (get_team_info(team, &infos.team_info) == B_OK) { get_team_name_and_icon(infos); snprintf(question, sizeof(question), B_TRANSLATE("Do you really want to kill the team \"%s\"?"), infos.team_name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Yes, kill this team!"), NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); if (alert->Go()) kill_team(team); } else { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This team is already gone"B_UTF8_ELLIPSIS), B_TRANSLATE("Ok!"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); alert->Go(); } } break; case 'KlTh': if (message->FindInt32("thread", &thread) == B_OK) { thread_info thinfo; if (get_thread_info(thread, &thinfo) == B_OK) { #if DEBUG_THREADS snprintf(question, sizeof(question), B_TRANSLATE("What do you want to do " "with the thread \"%s\"?"), thinfo.name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Debug this thread!"), B_TRANSLATE("Kill this thread!"), B_WIDTH_AS_USUAL, B_STOP_ALERT); #define KILL 2 #else snprintf(question, sizeof(question), B_TRANSLATE("Are you sure you want " "to kill the thread \"%s\"?"), thinfo.name); alert = new BAlert(B_TRANSLATE("Please confirm"), question, B_TRANSLATE("Cancel"), B_TRANSLATE("Kill this thread!"), NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); #define KILL 1 #endif alert->SetShortcut(0, B_ESCAPE); int r = alert->Go(); if (r == KILL) kill_thread(thread); #if DEBUG_THREADS else if (r == 1) { Tdebug_thead_param* param = new Tdebug_thead_param; param->thread = thread; if (thinfo.state == B_THREAD_WAITING) param->sem = thinfo.sem; else param->sem = -1; param->totalTime = thinfo.user_time+thinfo.kernel_time; resume_thread(spawn_thread(thread_debug_thread, B_TRANSLATE("Debug thread"), B_NORMAL_PRIORITY, param)); } #endif } else { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This thread is already gone"B_UTF8_ELLIPSIS), B_TRANSLATE("Ok!"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetShortcut(0, B_ESCAPE); alert->Go(); } } break; case 'PrTh': if (message->FindInt32("thread", &thread) == B_OK) { long new_priority; if (message->FindInt32("priority", &new_priority) == B_OK) set_thread_priority(thread, new_priority); } break; case 'Trac': launch(kTrackerSig, "/boot/system/Tracker"); break; case 'Dbar': launch(kDeskbarSig, "/boot/system/Deskbar"); break; case 'Term': launch(kTerminalSig, "/boot/system/apps/Terminal"); break; case 'AlDb': { if (!be_roster->IsRunning(kDeskbarSig)) launch(kDeskbarSig, "/boot/system/Deskbar"); BDeskbar deskbar; if (gInDeskbar || deskbar.HasItem (kDeskbarItemName)) deskbar.RemoveItem (kDeskbarItemName); else move_to_deskbar(deskbar); break; } case 'CPU ': { int32 cpu; if (message->FindInt32 ("cpu", &cpu) == B_OK) { bool last = true; for (int p = 0; p < gCPUcount; p++) { if (p != cpu && _kern_cpu_enabled(p)) { last = false; break; } } if (last) { alert = new BAlert(B_TRANSLATE("Info"), B_TRANSLATE("This is the last active processor...\n" "You can't turn it off!"), B_TRANSLATE("That's no Fun!"), NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT); alert->SetShortcut(0, B_ESCAPE); alert->Go(); } else _kern_set_cpu_enabled(cpu, !_kern_cpu_enabled(cpu)); } break; } case B_ABOUT_REQUESTED: AboutRequested(); break; default: BView::MessageReceived(message); } }