diff --git a/Process.c b/Process.c index ed49bace..ef97451a 100644 --- a/Process.c +++ b/Process.c @@ -42,7 +42,7 @@ typedef enum ProcessField_ { STIME, CUTIME, CSTIME, PRIORITY, NICE, ITREALVALUE, STARTTIME, VSIZE, RSS, RLIM, STARTCODE, ENDCODE, STARTSTACK, KSTKESP, KSTKEIP, SIGNAL, BLOCKED, SSIGIGNORE, SIGCATCH, WCHAN, NSWAP, CNSWAP, EXIT_SIGNAL, PROCESSOR, M_SIZE, M_RESIDENT, M_SHARE, M_TRS, M_DRS, M_LRS, M_DT, ST_UID, PERCENT_CPU, PERCENT_MEM, - USER, TIME, NLWP, TGID + USER, TIME, NLWP, TGID, #ifdef HAVE_OPENVZ VEID, VPID, #endif @@ -187,12 +187,13 @@ void Process_toggleTag(Process* this) { this->tag = this->tag == true ? false : true; } -void Process_setPriority(Process* this, int priority) { +bool Process_setPriority(Process* this, int priority) { int old_prio = getpriority(PRIO_PROCESS, this->pid); int err = setpriority(PRIO_PROCESS, this->pid, priority); if (err == 0 && old_prio != getpriority(PRIO_PROCESS, this->pid)) { this->nice = priority; } + return (err == 0); } unsigned long Process_getAffinity(Process* this) { @@ -201,8 +202,8 @@ unsigned long Process_getAffinity(Process* this) { return mask; } -void Process_setAffinity(Process* this, unsigned long mask) { - sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask); +bool Process_setAffinity(Process* this, unsigned long mask) { + return (sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask) == 0); } void Process_sendSignal(Process* this, int signal) { diff --git a/Process.h b/Process.h index 778d4644..a1783305 100644 --- a/Process.h +++ b/Process.h @@ -141,11 +141,11 @@ void Process_display(Object* cast, RichString* out); void Process_toggleTag(Process* this); -void Process_setPriority(Process* this, int priority); +bool Process_setPriority(Process* this, int priority); unsigned long Process_getAffinity(Process* this); -void Process_setAffinity(Process* this, unsigned long mask); +bool Process_setAffinity(Process* this, unsigned long mask); void Process_sendSignal(Process* this, int signal); diff --git a/htop.c b/htop.c index 15e3c3e9..274f61a2 100644 --- a/htop.c +++ b/htop.c @@ -1,6 +1,6 @@ /* htop - htop.c -(C) 2004-2006 Hisham H. Muhammad +(C) 2004-2007 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ @@ -36,14 +36,14 @@ in the source distribution for its full text. void printVersionFlag() { clear(); - printf("htop " VERSION " - (C) 2004-2006 Hisham Muhammad.\n"); + printf("htop " VERSION " - (C) 2004-2007 Hisham Muhammad.\n"); printf("Released under the GNU GPL.\n\n"); exit(0); } void printHelpFlag() { clear(); - printf("htop " VERSION " - (C) 2004-2006 Hisham Muhammad.\n"); + printf("htop " VERSION " - (C) 2004-2007 Hisham Muhammad.\n"); printf("Released under the GNU GPL.\n\n"); printf("-d DELAY Delay between updates, in tenths of seconds\n\n"); printf("-u USERNAME Show only processes of a given user\n\n"); @@ -56,7 +56,7 @@ void printHelpFlag() { void showHelp(ProcessList* pl) { clear(); attrset(CRT_colors[HELP_BOLD]); - mvaddstr(0, 0, "htop " VERSION " - (C) 2004-2006 Hisham Muhammad."); + mvaddstr(0, 0, "htop " VERSION " - (C) 2004-2007 Hisham Muhammad."); mvaddstr(1, 0, "Released under the GNU GPL. See 'man' page for more info."); attrset(CRT_colors[DEFAULT_COLOR]); @@ -151,18 +151,21 @@ static void Setup_run(Settings* settings, int headerHeight) { } static bool changePriority(Panel* panel, int delta) { + bool ok = true; bool anyTagged = false; for (int i = 0; i < Panel_getSize(panel); i++) { Process* p = (Process*) Panel_get(panel, i); if (p->tag) { - Process_setPriority(p, p->nice + delta); + ok = Process_setPriority(p, p->nice + delta) && ok; anyTagged = true; } } if (!anyTagged) { Process* p = (Process*) Panel_getSelected(panel); - Process_setPriority(p, p->nice + delta); + ok = Process_setPriority(p, p->nice + delta) && ok; } + if (!ok) + beep(); return anyTagged; } @@ -608,20 +611,25 @@ int main(int argc, char** argv) { Panel* affinityPanel = AffinityPanel_new(pl->processorCount, curr); - char* fuFunctions[2] = {"Toggle ", "Done "}; - pickFromList(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar); - unsigned long new = AffinityPanel_getAffinity(affinityPanel); - bool anyTagged = false; - for (int i = 0; i < Panel_getSize(panel); i++) { - Process* p = (Process*) Panel_get(panel, i); - if (p->tag) { - Process_setAffinity(p, new); - anyTagged = true; + char* fuFunctions[2] = {"Set ", "Cancel "}; + void* set = pickFromList(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar); + if (set) { + unsigned long new = AffinityPanel_getAffinity(affinityPanel); + bool anyTagged = false; + bool ok = true; + for (int i = 0; i < Panel_getSize(panel); i++) { + Process* p = (Process*) Panel_get(panel, i); + if (p->tag) { + ok = Process_setAffinity(p, new) && ok; + anyTagged = true; + } } - } - if (!anyTagged) { - Process* p = (Process*) Panel_getSelected(panel); - Process_setAffinity(p, new); + if (!anyTagged) { + Process* p = (Process*) Panel_getSelected(panel); + ok = Process_setAffinity(p, new) && ok; + } + if (!ok) + beep(); } ((Object*)affinityPanel)->delete((Object*)affinityPanel); Panel_setRichHeader(panel, ProcessList_printHeader(pl));