LinuxProcess.c 2.94 KB
Newer Older
1
2
3
4
5
6
7
8
/*
htop - LinuxProcess.c
(C) 2014 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/

#include "Process.h"
Hisham Muhammad's avatar
Hisham Muhammad committed
9
10
11
12
13
14
#include "ProcessList.h"
#include "LinuxProcess.h"
#include "CRT.h"

#include <unistd.h>
#include <sys/syscall.h>
15
16
17

/*{

Hisham Muhammad's avatar
Hisham Muhammad committed
18
19
#include "IOPriority.h"

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
typedef struct LinuxProcess_ {
   Process super;
   IOPriority ioPriority;
} LinuxProcess;

}*/

/*
[1] Note that before kernel 2.6.26 a process that has not asked for
an io priority formally uses "none" as scheduling class, but the
io scheduler will treat such processes as if it were in the best
effort class. The priority within the best effort class will  be
dynamically  derived  from  the  cpu  nice level of the process:
io_priority = (cpu_nice + 20) / 5. -- From ionice(1) man page
*/
Hisham Muhammad's avatar
Hisham Muhammad committed
35
#define LinuxProcess_effectiveIOPriority(p_) (IOPriority_class(p_->ioPriority) == IOPRIO_CLASS_NONE ? IOPriority_tuple(IOPRIO_CLASS_BE, (p_->super.nice + 20) / 5) : p_->ioPriority)
36

Hisham Muhammad's avatar
Hisham Muhammad committed
37
38
IOPriority LinuxProcess_updateIOPriority(LinuxProcess* this) {
   IOPriority ioprio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, this->super.pid);
39
40
41
42
   this->ioPriority = ioprio;
   return ioprio;
}

Hisham Muhammad's avatar
Hisham Muhammad committed
43
44
45
bool LinuxProcess_setIOPriority(LinuxProcess* this, IOPriority ioprio) {
   syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, this->super.pid, ioprio);
   return (LinuxProcess_updateIOPriority(this) == ioprio);
46
47
}

Hisham Muhammad's avatar
Hisham Muhammad committed
48
49
void Process_writeField(Process* this, RichString* str, ProcessField field) {
   LinuxProcess* lp = (LinuxProcess*) this;
Hisham Muhammad's avatar
Hisham Muhammad committed
50
51
52
   char buffer[256]; buffer[255] = '\0';
   int attr = CRT_colors[DEFAULT_COLOR];
   int n = sizeof(buffer) - 1;
53
54
   switch (field) {
   case IO_PRIORITY: {
Hisham Muhammad's avatar
Hisham Muhammad committed
55
      int klass = IOPriority_class(lp->ioPriority);
56
57
      if (klass == IOPRIO_CLASS_NONE) {
         // see note [1] above
Hisham Muhammad's avatar
Hisham Muhammad committed
58
         snprintf(buffer, n, "B%1d ", (int) (this->nice + 20) / 5);
59
      } else if (klass == IOPRIO_CLASS_BE) {
Hisham Muhammad's avatar
Hisham Muhammad committed
60
         snprintf(buffer, n, "B%1d ", IOPriority_data(lp->ioPriority));
61
62
      } else if (klass == IOPRIO_CLASS_RT) {
         attr = CRT_colors[PROCESS_HIGH_PRIORITY];
Hisham Muhammad's avatar
Hisham Muhammad committed
63
64
         snprintf(buffer, n, "R%1d ", IOPriority_data(lp->ioPriority));
      } else if (lp->ioPriority == IOPriority_Idle) {
65
66
67
68
69
70
71
72
         attr = CRT_colors[PROCESS_LOW_PRIORITY]; 
         snprintf(buffer, n, "id ");
      } else {
         snprintf(buffer, n, "?? ");
      }
      break;
   }
   default:
Hisham Muhammad's avatar
Hisham Muhammad committed
73
74
      Process_writeDefaultField(this, str, field);
      return;
75
76
77
78
   }
   RichString_append(str, attr, buffer);
}

Hisham Muhammad's avatar
Hisham Muhammad committed
79
long Process_compare(const void* v1, const void* v2) {
80
   LinuxProcess *p1, *p2;
Hisham Muhammad's avatar
Hisham Muhammad committed
81
82
   Settings *settings = ((Process*)v1)->settings;
   if (settings->direction == 1) {
83
84
85
86
87
88
      p1 = (LinuxProcess*)v1;
      p2 = (LinuxProcess*)v2;
   } else {
      p2 = (LinuxProcess*)v1;
      p1 = (LinuxProcess*)v2;
   }
Hisham Muhammad's avatar
Hisham Muhammad committed
89
   switch (settings->sortKey) {
90
   case IO_PRIORITY:
Hisham Muhammad's avatar
Hisham Muhammad committed
91
      return LinuxProcess_effectiveIOPriority(p1) - LinuxProcess_effectiveIOPriority(p2);
92
   default:
Hisham Muhammad's avatar
Hisham Muhammad committed
93
      return Process_defaultCompare(v1, v2);
94
95
   }
}