Experimental feature: beep on permission failures.

Update dates.
This commit is contained in:
Hisham Muhammad 2007-12-17 05:57:28 +00:00
parent a839c3f2ca
commit cf7fdcd1d6
3 changed files with 34 additions and 25 deletions

View File

@ -42,7 +42,7 @@ typedef enum ProcessField_ {
STIME, CUTIME, CSTIME, PRIORITY, NICE, ITREALVALUE, STARTTIME, VSIZE, RSS, RLIM, STARTCODE, ENDCODE, STIME, CUTIME, CSTIME, PRIORITY, NICE, ITREALVALUE, STARTTIME, VSIZE, RSS, RLIM, STARTCODE, ENDCODE,
STARTSTACK, KSTKESP, KSTKEIP, SIGNAL, BLOCKED, SSIGIGNORE, SIGCATCH, WCHAN, NSWAP, CNSWAP, EXIT_SIGNAL, 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, 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 #ifdef HAVE_OPENVZ
VEID, VPID, VEID, VPID,
#endif #endif
@ -187,12 +187,13 @@ void Process_toggleTag(Process* this) {
this->tag = this->tag == true ? false : true; 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 old_prio = getpriority(PRIO_PROCESS, this->pid);
int err = setpriority(PRIO_PROCESS, this->pid, priority); int err = setpriority(PRIO_PROCESS, this->pid, priority);
if (err == 0 && old_prio != getpriority(PRIO_PROCESS, this->pid)) { if (err == 0 && old_prio != getpriority(PRIO_PROCESS, this->pid)) {
this->nice = priority; this->nice = priority;
} }
return (err == 0);
} }
unsigned long Process_getAffinity(Process* this) { unsigned long Process_getAffinity(Process* this) {
@ -201,8 +202,8 @@ unsigned long Process_getAffinity(Process* this) {
return mask; return mask;
} }
void Process_setAffinity(Process* this, unsigned long mask) { bool Process_setAffinity(Process* this, unsigned long mask) {
sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask); return (sched_setaffinity(this->pid, sizeof(unsigned long), (cpu_set_t*) &mask) == 0);
} }
void Process_sendSignal(Process* this, int signal) { void Process_sendSignal(Process* this, int signal) {

View File

@ -141,11 +141,11 @@ void Process_display(Object* cast, RichString* out);
void Process_toggleTag(Process* this); 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); 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); void Process_sendSignal(Process* this, int signal);

46
htop.c
View File

@ -1,6 +1,6 @@
/* /*
htop - htop.c htop - htop.c
(C) 2004-2006 Hisham H. Muhammad (C) 2004-2007 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file Released under the GNU GPL, see the COPYING file
in the source distribution for its full text. in the source distribution for its full text.
*/ */
@ -36,14 +36,14 @@ in the source distribution for its full text.
void printVersionFlag() { void printVersionFlag() {
clear(); 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("Released under the GNU GPL.\n\n");
exit(0); exit(0);
} }
void printHelpFlag() { void printHelpFlag() {
clear(); 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("Released under the GNU GPL.\n\n");
printf("-d DELAY Delay between updates, in tenths of seconds\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"); printf("-u USERNAME Show only processes of a given user\n\n");
@ -56,7 +56,7 @@ void printHelpFlag() {
void showHelp(ProcessList* pl) { void showHelp(ProcessList* pl) {
clear(); clear();
attrset(CRT_colors[HELP_BOLD]); 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."); mvaddstr(1, 0, "Released under the GNU GPL. See 'man' page for more info.");
attrset(CRT_colors[DEFAULT_COLOR]); attrset(CRT_colors[DEFAULT_COLOR]);
@ -151,18 +151,21 @@ static void Setup_run(Settings* settings, int headerHeight) {
} }
static bool changePriority(Panel* panel, int delta) { static bool changePriority(Panel* panel, int delta) {
bool ok = true;
bool anyTagged = false; bool anyTagged = false;
for (int i = 0; i < Panel_getSize(panel); i++) { for (int i = 0; i < Panel_getSize(panel); i++) {
Process* p = (Process*) Panel_get(panel, i); Process* p = (Process*) Panel_get(panel, i);
if (p->tag) { if (p->tag) {
Process_setPriority(p, p->nice + delta); ok = Process_setPriority(p, p->nice + delta) && ok;
anyTagged = true; anyTagged = true;
} }
} }
if (!anyTagged) { if (!anyTagged) {
Process* p = (Process*) Panel_getSelected(panel); 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; return anyTagged;
} }
@ -608,20 +611,25 @@ int main(int argc, char** argv) {
Panel* affinityPanel = AffinityPanel_new(pl->processorCount, curr); Panel* affinityPanel = AffinityPanel_new(pl->processorCount, curr);
char* fuFunctions[2] = {"Toggle ", "Done "}; char* fuFunctions[2] = {"Set ", "Cancel "};
pickFromList(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar); void* set = pickFromList(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar);
unsigned long new = AffinityPanel_getAffinity(affinityPanel); if (set) {
bool anyTagged = false; unsigned long new = AffinityPanel_getAffinity(affinityPanel);
for (int i = 0; i < Panel_getSize(panel); i++) { bool anyTagged = false;
Process* p = (Process*) Panel_get(panel, i); bool ok = true;
if (p->tag) { for (int i = 0; i < Panel_getSize(panel); i++) {
Process_setAffinity(p, new); Process* p = (Process*) Panel_get(panel, i);
anyTagged = true; if (p->tag) {
ok = Process_setAffinity(p, new) && ok;
anyTagged = true;
}
} }
} if (!anyTagged) {
if (!anyTagged) { Process* p = (Process*) Panel_getSelected(panel);
Process* p = (Process*) Panel_getSelected(panel); ok = Process_setAffinity(p, new) && ok;
Process_setAffinity(p, new); }
if (!ok)
beep();
} }
((Object*)affinityPanel)->delete((Object*)affinityPanel); ((Object*)affinityPanel)->delete((Object*)affinityPanel);
Panel_setRichHeader(panel, ProcessList_printHeader(pl)); Panel_setRichHeader(panel, ProcessList_printHeader(pl));