nmeter: convert field list to bit list
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 15 Mar 2016 14:52:40 +0000 (15:52 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 15 Mar 2016 14:52:40 +0000 (15:52 +0100)
function                                             old     new   delta
rdval                                                 34     157    +123
collect_int                                          123     122      -1
collect_thread_nr                                     65      62      -3
collect_blk                                          559     552      -7
collect_if                                           207     199      -8
collect_fork                                         119     111      -8
collect_ctx                                          119     111      -8
collect_fd                                            81      71     -10
collect_swp                                          120     107     -13
collect_cpu                                          623     610     -13
collect_mem                                          371     339     -32
rdval_loadavg                                         38       -     -38
vrdval                                               170       -    -170
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/10 up/down: 123/-311)        Total: -188 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
procps/nmeter.c

index 8fe39c43b27ed716e5b6f1a1787ccd2f74955e34..d6222af6bb64893c0c0f0fc4bbdcc4afcfc862f5 100644 (file)
@@ -208,67 +208,50 @@ static ullong read_after_slash(const char *p)
        return strtoull(p+1, NULL, 10);
 }
 
-enum conv_type { conv_decimal, conv_slash };
+enum conv_type {
+       conv_decimal = 0,
+       conv_slash = 1
+};
 
 // Reads decimal values from line. Values start after key, for example:
 // "cpu  649369 0 341297 4336769..." - key is "cpu" here.
-// Values are stored in vec[]. arg_ptr has list of positions
-// we are interested in: for example: 1,2,5 - we want 1st, 2nd and 5th value.
-static int vrdval(const char* p, const char* key,
-       enum conv_type conv, ullong *vec, va_list arg_ptr)
+// Values are stored in vec[].
+// posbits is a bit lit of positions we are interested in.
+// for example: 00100110 - we want 1st, 2nd and 5th value.
+// posbits.bit0 encodes conversion type.
+static int rdval(const char* p, const char* key, ullong *vec, long posbits)
 {
-       int indexline;
-       int indexnext;
+       unsigned curpos;
 
        p = strstr(p, key);
        if (!p) return 1;
 
        p += strlen(key);
-       indexline = 1;
-       indexnext = va_arg(arg_ptr, int);
+       curpos = 1 << 1;
        while (1) {
                while (*p == ' ' || *p == '\t') p++;
                if (*p == '\n' || *p == '\0') break;
 
-               if (indexline == indexnext) { // read this value
-                       *vec++ = conv==conv_decimal ?
+               if (curpos & posbits) { // read this value
+                       *vec++ = (posbits & 1) == conv_decimal ?
                                strtoull(p, NULL, 10) :
                                read_after_slash(p);
-                       indexnext = va_arg(arg_ptr, int);
-                       if (!indexnext)
+                       posbits -= curpos;
+                       if (posbits <= 1)
                                return 0;
                }
-               while (*p > ' ') p++; // skip over value
-               indexline++;
+               while (*p > ' ') // skip over the value
+                       p++;
+               curpos <<= 1;
        }
        return 0;
 }
 
-// Parses files with lines like "cpu0 21727 0 15718 1813856 9461 10485 0 0":
-// rdval(file_contents, "string_to_find", result_vector, value#, value#...)
-// value# start with 1
-static int rdval(const char* p, const char* key, ullong *vec, ...)
-{
-       va_list arg_ptr;
-       int result;
-
-       va_start(arg_ptr, vec);
-       result = vrdval(p, key, conv_decimal, vec, arg_ptr);
-       va_end(arg_ptr);
-
-       return result;
-}
-
 // Parses files with lines like "... ... ... 3/148 ...."
-static int rdval_loadavg(const char* p, ullong *vec, ...)
+static int rdval_loadavg(const char* p, ullong *vec, long posbits)
 {
-       va_list arg_ptr;
        int result;
-
-       va_start(arg_ptr, vec);
-       result = vrdval(p, "", conv_slash, vec, arg_ptr);
-       va_end(arg_ptr);
-
+       result = rdval(p, "", vec, posbits | conv_slash);
        return result;
 }
 
@@ -397,7 +380,15 @@ static void FAST_FUNC collect_cpu(cpu_stat *s)
        char *bar = s->bar;
        int i;
 
-       if (rdval(get_file(&proc_stat), "cpu ", data, 1, 2, 3, 4, 5, 6, 7, 0)) {
+       if (rdval(get_file(&proc_stat), "cpu ", data, 0
+           | (1 << 1)
+           | (1 << 2)
+           | (1 << 3)
+           | (1 << 4)
+           | (1 << 5)
+           | (1 << 6)
+           | (1 << 7))
+       ) {
                put_question_marks(bar_sz);
                return;
        }
@@ -466,7 +457,7 @@ static void FAST_FUNC collect_int(int_stat *s)
        ullong data[1];
        ullong old;
 
-       if (rdval(get_file(&proc_stat), "intr", data, s->no, 0)) {
+       if (rdval(get_file(&proc_stat), "intr", data, 1 << s->no)) {
                put_question_marks(4);
                return;
        }
@@ -500,7 +491,7 @@ static void FAST_FUNC collect_ctx(ctx_stat *s)
        ullong data[1];
        ullong old;
 
-       if (rdval(get_file(&proc_stat), "ctxt", data, 1, 0)) {
+       if (rdval(get_file(&proc_stat), "ctxt", data, 1 << 1)) {
                put_question_marks(4);
                return;
        }
@@ -532,7 +523,10 @@ static void FAST_FUNC collect_blk(blk_stat *s)
        if (is26) {
                i = rdval_diskstats(get_file(&proc_diskstats), data);
        } else {
-               i = rdval(get_file(&proc_stat), s->lookfor, data, 1, 2, 0);
+               i = rdval(get_file(&proc_stat), s->lookfor, data, 0
+                               | (1 << 1)
+                               | (1 << 2)
+               );
                // Linux 2.4 reports bio in Kbytes, convert to sectors:
                data[0] *= 2;
                data[1] *= 2;
@@ -570,7 +564,7 @@ static void FAST_FUNC collect_thread_nr(fork_stat *s UNUSED_PARAM)
 {
        ullong data[1];
 
-       if (rdval_loadavg(get_file(&proc_loadavg), data, 4, 0)) {
+       if (rdval_loadavg(get_file(&proc_loadavg), data, 1 << 4)) {
                put_question_marks(4);
                return;
        }
@@ -582,7 +576,7 @@ static void FAST_FUNC collect_fork(fork_stat *s)
        ullong data[1];
        ullong old;
 
-       if (rdval(get_file(&proc_stat), "processes", data, 1, 0)) {
+       if (rdval(get_file(&proc_stat), "processes", data, 1 << 1)) {
                put_question_marks(4);
                return;
        }
@@ -616,7 +610,12 @@ static void FAST_FUNC collect_if(if_stat *s)
        ullong data[4];
        int i;
 
-       if (rdval(get_file(&proc_net_dev), s->device_colon, data, 1, 3, 9, 11, 0)) {
+       if (rdval(get_file(&proc_net_dev), s->device_colon, data, 0
+           | (1 << 1)
+           | (1 << 3)
+           | (1 << 9)
+           | (1 << 11))
+       ) {
                put_question_marks(10);
                return;
        }
@@ -694,7 +693,7 @@ static void FAST_FUNC collect_mem(mem_stat *s)
        ullong m_cached = 0;
        ullong m_slab = 0;
 
-       if (rdval(get_file(&proc_meminfo), "MemTotal:", &m_total, 1, 0)) {
+       if (rdval(get_file(&proc_meminfo), "MemTotal:", &m_total, 1 << 1)) {
                put_question_marks(4);
                return;
        }
@@ -703,10 +702,10 @@ static void FAST_FUNC collect_mem(mem_stat *s)
                return;
        }
 
-       if (rdval(proc_meminfo.file, "MemFree:", &m_free  , 1, 0)
-        || rdval(proc_meminfo.file, "Buffers:", &m_bufs  , 1, 0)
-        || rdval(proc_meminfo.file, "Cached:",  &m_cached, 1, 0)
-        || rdval(proc_meminfo.file, "Slab:",    &m_slab  , 1, 0)
+       if (rdval(proc_meminfo.file, "MemFree:", &m_free  , 1 << 1)
+        || rdval(proc_meminfo.file, "Buffers:", &m_bufs  , 1 << 1)
+        || rdval(proc_meminfo.file, "Cached:",  &m_cached, 1 << 1)
+        || rdval(proc_meminfo.file, "Slab:",    &m_slab  , 1 << 1)
        ) {
                put_question_marks(4);
                return;
@@ -737,8 +736,8 @@ static void FAST_FUNC collect_swp(swp_stat *s UNUSED_PARAM)
 {
        ullong s_total[1];
        ullong s_free[1];
-       if (rdval(get_file(&proc_meminfo), "SwapTotal:", s_total, 1, 0)
-        || rdval(proc_meminfo.file,       "SwapFree:" , s_free,  1, 0)
+       if (rdval(get_file(&proc_meminfo), "SwapTotal:", s_total, 1 << 1)
+        || rdval(proc_meminfo.file,       "SwapFree:" , s_free,  1 << 1)
        ) {
                put_question_marks(4);
                return;
@@ -761,7 +760,10 @@ static void FAST_FUNC collect_fd(fd_stat *s UNUSED_PARAM)
 {
        ullong data[2];
 
-       if (rdval(get_file(&proc_sys_fs_filenr), "", data, 1, 2, 0)) {
+       if (rdval(get_file(&proc_sys_fs_filenr), "", data, 0
+           | (1 << 1)
+           | (1 << 2))
+       ) {
                put_question_marks(4);
                return;
        }