[BACK]Return to pool.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / systat

Annotation of src/usr.bin/systat/pool.c, Revision 1.1

1.1     ! canacar     1: /*     $OpenBSD$       */
        !             2: /*
        !             3:  * Copyright (c) 2008 Can Erkin Acar <canacar@openbsd.org>
        !             4:  *
        !             5:  * Permission to use, copy, modify, and distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17:
        !            18: #include <sys/types.h>
        !            19: #include <sys/param.h>
        !            20: #include <sys/sysctl.h>
        !            21: #include <sys/pool.h>
        !            22: #include <errno.h>
        !            23: #include <stdlib.h>
        !            24:
        !            25: #include "systat.h"
        !            26:
        !            27: void print_pool(void);
        !            28: int  read_pool(void);
        !            29: void  sort_pool(void);
        !            30: int  select_pool(void);
        !            31: void showpool(int k);
        !            32:
        !            33: /* qsort callbacks */
        !            34: int sort_name_callback(const void *s1, const void *s2);
        !            35:
        !            36: struct pool_info {
        !            37:        char name[32];
        !            38:        struct pool pool;
        !            39: };
        !            40:
        !            41:
        !            42: int num_pools = 0;
        !            43: struct pool_info *pools = NULL;
        !            44:
        !            45:
        !            46: field_def fields_pool[] = {
        !            47:        {"NAME", 11, 32, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
        !            48:        {"SIZE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            49:        {"REQUESTS", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            50:        {"FAIL", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            51:        {"INUSE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            52:        {"PGREQ", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            53:        {"PGREL", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            54:        {"NPAGE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            55:        {"HIWAT", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            56:        {"MINPG", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            57:        {"MAXPG", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
        !            58:        {"IDLE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}
        !            59: };
        !            60:
        !            61:
        !            62: #define FIELD_ADDR(x) (&fields_pool[x])
        !            63:
        !            64: #define FLD_POOL_NAME  FIELD_ADDR(0)
        !            65: #define FLD_POOL_SIZE  FIELD_ADDR(1)
        !            66: #define FLD_POOL_REQS  FIELD_ADDR(2)
        !            67: #define FLD_POOL_FAIL  FIELD_ADDR(3)
        !            68: #define FLD_POOL_INUSE FIELD_ADDR(4)
        !            69: #define FLD_POOL_PGREQ FIELD_ADDR(5)
        !            70: #define FLD_POOL_PGREL FIELD_ADDR(6)
        !            71: #define FLD_POOL_NPAGE FIELD_ADDR(7)
        !            72: #define FLD_POOL_HIWAT FIELD_ADDR(8)
        !            73: #define FLD_POOL_MINPG FIELD_ADDR(9)
        !            74: #define FLD_POOL_MAXPG FIELD_ADDR(10)
        !            75: #define FLD_POOL_IDLE  FIELD_ADDR(11)
        !            76:
        !            77: /* Define views */
        !            78: field_def *view_pool_0[] = {
        !            79:        FLD_POOL_NAME, FLD_POOL_SIZE, FLD_POOL_REQS, FLD_POOL_FAIL,
        !            80:        FLD_POOL_INUSE, FLD_POOL_PGREQ, FLD_POOL_PGREL, FLD_POOL_NPAGE,
        !            81:        FLD_POOL_HIWAT, FLD_POOL_MINPG, FLD_POOL_MAXPG, FLD_POOL_IDLE, NULL
        !            82: };
        !            83:
        !            84: order_type pool_order_list[] = {
        !            85:        {"name", "name", 0, sort_name_callback},
        !            86:        {NULL, NULL, 0, NULL}
        !            87: };
        !            88:
        !            89: /* Define view managers */
        !            90: struct view_manager pool_mgr = {
        !            91:        "Pool", select_pool, read_pool, sort_pool, print_header,
        !            92:        print_pool, keyboard_callback, pool_order_list, pool_order_list
        !            93: };
        !            94:
        !            95: field_view views_pool[] = {
        !            96:        {view_pool_0, "pool", '5', &pool_mgr},
        !            97:        {NULL, NULL, 0, NULL}
        !            98: };
        !            99:
        !           100:
        !           101: int
        !           102: sort_name_callback(const void *s1, const void *s2)
        !           103: {
        !           104:        struct pool_info *p1, *p2;
        !           105:        p1 = (struct pool_info *)s1;
        !           106:        p2 = (struct pool_info *)s2;
        !           107:
        !           108:        return strcmp(p1->name, p2->name);
        !           109: }
        !           110:
        !           111: void
        !           112: sort_pool(void)
        !           113: {
        !           114:        order_type *ordering;
        !           115:
        !           116:        if (curr_mgr == NULL)
        !           117:                return;
        !           118:
        !           119:        ordering = curr_mgr->order_curr;
        !           120:
        !           121:        if (ordering == NULL)
        !           122:                return;
        !           123:        if (ordering->func == NULL)
        !           124:                return;
        !           125:        if (pools == NULL)
        !           126:                return;
        !           127:        if (num_pools <= 0)
        !           128:                return;
        !           129:
        !           130:        qsort(pools, num_pools, sizeof(struct pool_info), ordering->func);
        !           131: }
        !           132:
        !           133: int
        !           134: select_pool(void)
        !           135: {
        !           136:        num_disp = num_pools;
        !           137:        return (0);
        !           138: }
        !           139:
        !           140: int
        !           141: read_pool(void)
        !           142: {
        !           143:        int mib[4], np, i;
        !           144:        size_t size;
        !           145:
        !           146:        mib[0] = CTL_KERN;
        !           147:        mib[1] = KERN_POOL;
        !           148:        mib[2] = KERN_POOL_NPOOLS;
        !           149:        size = sizeof(np);
        !           150:
        !           151:        if (sysctl(mib, 3, &np, &size, NULL, 0) < 0) {
        !           152:                error("sysctl(npools): %s", strerror(errno));
        !           153:                return (-1);
        !           154:        }
        !           155:
        !           156:        if (np <= 0) {
        !           157:                num_pools = 0;
        !           158:                return (0);
        !           159:        }
        !           160:
        !           161:        if (np > num_pools || pools == NULL) {
        !           162:                struct pool_info *p = realloc(pools, sizeof(*pools) * np);
        !           163:                if (p == NULL) {
        !           164:                        error("realloc: %s", strerror(errno));
        !           165:                        return (-1);
        !           166:                }
        !           167:                pools = p;
        !           168:                num_pools = np;
        !           169:        }
        !           170:
        !           171:        for (i = 0; i < num_pools; i++) {
        !           172:                mib[0] = CTL_KERN;
        !           173:                mib[1] = KERN_POOL;
        !           174:                mib[2] = KERN_POOL_POOL;
        !           175:                mib[3] = i + 1;
        !           176:                size = sizeof(struct pool);
        !           177:                if (sysctl(mib, 4, &pools[i].pool, &size, NULL, 0) < 0) {
        !           178:                        error("sysctl(pool): %s", strerror(errno));
        !           179:                        break;
        !           180:                }
        !           181:                mib[2] = KERN_POOL_NAME;
        !           182:                size = sizeof(pools[i].name);
        !           183:                if (sysctl(mib, 4, &pools[i].name, &size, NULL, 0) < 0) {
        !           184:                        error("sysctl(pool_name): %s", strerror(errno));
        !           185:                        break;
        !           186:                }
        !           187:        }
        !           188:
        !           189:        if (i != num_pools) {
        !           190:                memset(pools, 0, sizeof(*pools) * num_pools);
        !           191:                return (-1);
        !           192:        }
        !           193:
        !           194:        return 0;
        !           195: }
        !           196:
        !           197:
        !           198: void
        !           199: print_pool(void)
        !           200: {
        !           201:        int n, count = 0;
        !           202:
        !           203:        if (pools == NULL)
        !           204:                return;
        !           205:
        !           206:        for (n = dispstart; n < num_disp; n++) {
        !           207:                showpool(n);
        !           208:                count++;
        !           209:                if (maxprint > 0 && count >= maxprint)
        !           210:                        break;
        !           211:        }
        !           212: }
        !           213:
        !           214: int
        !           215: initpool(void)
        !           216: {
        !           217:        field_view *v;
        !           218:
        !           219:        for (v = views_pool; v->name != NULL; v++)
        !           220:                add_view(v);
        !           221:
        !           222:        read_pool();
        !           223:
        !           224:        return(0);
        !           225: }
        !           226:
        !           227: void
        !           228: showpool(int k)
        !           229: {
        !           230:        struct pool_info *p = pools + k;
        !           231:
        !           232:        if (k < 0 || k >= num_pools)
        !           233:                return;
        !           234:
        !           235:        print_fld_str(FLD_POOL_NAME, p->name);
        !           236:        print_fld_uint(FLD_POOL_SIZE, p->pool.pr_size);
        !           237:
        !           238:        print_fld_size(FLD_POOL_REQS, p->pool.pr_nget);
        !           239:        print_fld_size(FLD_POOL_FAIL, p->pool.pr_nfail);
        !           240:        print_fld_ssize(FLD_POOL_INUSE, p->pool.pr_nget - p->pool.pr_nput);
        !           241:        print_fld_size(FLD_POOL_PGREQ, p->pool.pr_npagealloc);
        !           242:        print_fld_size(FLD_POOL_PGREL, p->pool.pr_npagefree);
        !           243:
        !           244:        print_fld_size(FLD_POOL_NPAGE, p->pool.pr_npages);
        !           245:        print_fld_size(FLD_POOL_HIWAT, p->pool.pr_hiwat);
        !           246:        print_fld_size(FLD_POOL_MINPG, p->pool.pr_minpages);
        !           247:
        !           248:        if (p->pool.pr_maxpages == UINT_MAX)
        !           249:                print_fld_str(FLD_POOL_MAXPG, "inf");
        !           250:        else
        !           251:                print_fld_size(FLD_POOL_MAXPG, p->pool.pr_maxpages);
        !           252:
        !           253:        print_fld_size(FLD_POOL_IDLE, p->pool.pr_nidle);
        !           254:
        !           255:        end_line();
        !           256: }