Home | History | Annotate | Download | only in prstat
      1  0  stevel /*
      2  0  stevel  * CDDL HEADER START
      3  0  stevel  *
      4  0  stevel  * The contents of this file are subject to the terms of the
      5  0  stevel  * Common Development and Distribution License, Version 1.0 only
      6  0  stevel  * (the "License").  You may not use this file except in compliance
      7  0  stevel  * with the License.
      8  0  stevel  *
      9  0  stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  0  stevel  * or http://www.opensolaris.org/os/licensing.
     11  0  stevel  * See the License for the specific language governing permissions
     12  0  stevel  * and limitations under the License.
     13  0  stevel  *
     14  0  stevel  * When distributing Covered Code, include this CDDL HEADER in each
     15  0  stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  0  stevel  * If applicable, add the following below this CDDL HEADER, with the
     17  0  stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     18  0  stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  0  stevel  *
     20  0  stevel  * CDDL HEADER END
     21  0  stevel  */
     22  0  stevel /*
     23  0  stevel  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  0  stevel  * Use is subject to license terms.
     25  0  stevel  */
     26  0  stevel 
     27  0  stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28  0  stevel 
     29  0  stevel #include <libintl.h>
     30  0  stevel #include <stdlib.h>
     31  0  stevel #include <string.h>
     32  0  stevel #include <strings.h>
     33  0  stevel 
     34  0  stevel #include "prstat.h"
     35  0  stevel #include "prutil.h"
     36  0  stevel #include "prsort.h"
     37  0  stevel 
     38  0  stevel void
     39  0  stevel list_alloc(list_t *list, int size)
     40  0  stevel {
     41  0  stevel 	if (size > 0) {
     42  0  stevel 		list->l_size = size;
     43  0  stevel 		list->l_ptrs = Zalloc(sizeof (void *) * (size + 1));
     44  0  stevel 	}
     45  0  stevel }
     46  0  stevel 
     47  0  stevel void
     48  0  stevel list_free(list_t *list)
     49  0  stevel {
     50  0  stevel 	if (list && list->l_ptrs) {
     51  0  stevel 		free(list->l_ptrs);
     52  0  stevel 		list->l_ptrs = NULL;
     53  0  stevel 	}
     54  0  stevel }
     55  0  stevel 
     56  0  stevel /*
     57  0  stevel  * Sorting routines
     58  0  stevel  */
     59  0  stevel static ulong_t
     60  0  stevel get_cpu_from_psinfo(void *lwp)
     61  0  stevel {
     62  0  stevel 	return ((ulong_t)
     63  0  stevel 	    FRC2PCT((((lwp_info_t *)lwp)->li_info.pr_lwp.pr_pctcpu)*1000));
     64  0  stevel }
     65  0  stevel 
     66  0  stevel static ulong_t
     67  0  stevel get_cpu_from_usage(void *lwp)
     68  0  stevel {
     69  0  stevel 	lwp_info_t *p = (lwp_info_t *)lwp;
     70  0  stevel 	float cpu = 0;
     71  0  stevel 	cpu += p->li_usr;
     72  0  stevel 	cpu += p->li_sys;
     73  0  stevel 	cpu *= 1000;
     74  0  stevel 	return ((ulong_t)cpu);
     75  0  stevel }
     76  0  stevel 
     77  0  stevel static ulong_t
     78  0  stevel get_time(void *lwp)
     79  0  stevel {
     80  0  stevel 	return ((ulong_t)TIME2SEC(((lwp_info_t *)lwp)->li_info.pr_lwp.pr_time));
     81  0  stevel }
     82  0  stevel 
     83  0  stevel static ulong_t
     84  0  stevel get_size(void *lwp)
     85  0  stevel {
     86  0  stevel 	return ((ulong_t)((lwp_info_t *)lwp)->li_info.pr_size);
     87  0  stevel }
     88  0  stevel 
     89  0  stevel static ulong_t
     90  0  stevel get_rssize(void *lwp)
     91  0  stevel {
     92  0  stevel 	return ((ulong_t)((lwp_info_t *)lwp)->li_info.pr_rssize);
     93  0  stevel }
     94  0  stevel 
     95  0  stevel static ulong_t
     96  0  stevel get_pri(void *lwp)
     97  0  stevel {
     98  0  stevel 	return ((ulong_t)((lwp_info_t *)lwp)->li_info.pr_lwp.pr_pri);
     99  0  stevel }
    100  0  stevel 
    101  0  stevel static ulong_t
    102  0  stevel get_idkey(void *id)
    103  0  stevel {
    104  0  stevel 	return (((id_info_t *)id)->id_key);
    105  0  stevel }
    106  0  stevel 
    107  0  stevel void
    108  0  stevel list_setkeyfunc(char *arg, optdesc_t *opt, list_t *list, int type)
    109  0  stevel {
    110  0  stevel 	if (list == NULL)
    111  0  stevel 		return;
    112  0  stevel 
    113  0  stevel 	list->l_sortorder = opt->o_sortorder;
    114  0  stevel 	list->l_type = type;
    115  0  stevel 	if (arg == NULL) {	/* special case for id_infos */
    116  0  stevel 		list->l_func = get_idkey;
    117  0  stevel 		return;
    118  0  stevel 	}
    119  0  stevel 	if (strcmp("cpu", arg) == 0) {
    120  0  stevel 		if (opt->o_outpmode & OPT_MSACCT)
    121  0  stevel 			list->l_func = get_cpu_from_usage;
    122  0  stevel 		else
    123  0  stevel 			list->l_func = get_cpu_from_psinfo;
    124  0  stevel 		return;
    125  0  stevel 	}
    126  0  stevel 	if (strcmp("time", arg) == 0) {
    127  0  stevel 		list->l_func = get_time;
    128  0  stevel 		return;
    129  0  stevel 	}
    130  0  stevel 	if (strcmp("size", arg) == 0) {
    131  0  stevel 		list->l_func = get_size;
    132  0  stevel 		return;
    133  0  stevel 	}
    134  0  stevel 	if (strcmp("rss", arg) == 0) {
    135  0  stevel 		list->l_func = get_rssize;
    136  0  stevel 		return;
    137  0  stevel 	}
    138  0  stevel 	if (strcmp("pri", arg) == 0) {
    139  0  stevel 		list->l_func = get_pri;
    140  0  stevel 		return;
    141  0  stevel 	}
    142  0  stevel 	Die(gettext("invalid sort key -- %s\n"), arg);
    143  0  stevel }
    144  0  stevel 
    145  0  stevel ulong_t
    146  0  stevel list_getkeyval(list_t *list, void *ptr)
    147  0  stevel {
    148  0  stevel 	return (list->l_func(ptr));
    149  0  stevel }
    150  0  stevel 
    151  0  stevel static int
    152  0  stevel compare_keys(list_t *list, ulong_t key1, ulong_t key2)
    153  0  stevel {
    154  0  stevel 	if (key1 == key2)
    155  0  stevel 		return (0);
    156  0  stevel 	if (key1 < key2)
    157  0  stevel 		return (1 * list->l_sortorder);
    158  0  stevel 	else
    159  0  stevel 		return (-1 * list->l_sortorder);
    160  0  stevel }
    161  0  stevel 
    162  0  stevel static void
    163  0  stevel list_insert(list_t *list, void *ptr)
    164  0  stevel {
    165  0  stevel 	int i, j;
    166  0  stevel 	long k1, k2;
    167  0  stevel 
    168  0  stevel 	for (i = 0; i < list->l_used; i++) {	/* insert in the middle */
    169  0  stevel 		k1 = list_getkeyval(list, ptr);
    170  0  stevel 		k2 = list_getkeyval(list, list->l_ptrs[i]);
    171  0  stevel 		if (compare_keys(list, k1, k2) >= 0) {
    172  0  stevel 			for (j = list->l_used - 1; j >= i; j--)
    173  0  stevel 				list->l_ptrs[j+1] = list->l_ptrs[j];
    174  0  stevel 			list->l_ptrs[i] = ptr;
    175  0  stevel 			if (list->l_used < list->l_size)
    176  0  stevel 				list->l_used++;
    177  0  stevel 			return;
    178  0  stevel 		}
    179  0  stevel 	}
    180  0  stevel 	if (i + 1 <= list->l_size) {		/* insert at the tail */
    181  0  stevel 		list->l_ptrs[list->l_used] = ptr;
    182  0  stevel 
    183  0  stevel 		list->l_used++;
    184  0  stevel 	}
    185  0  stevel }
    186  0  stevel 
    187  0  stevel static void
    188  0  stevel list_preinsert(list_t *list, void *ptr)
    189  0  stevel {
    190  0  stevel 	ulong_t	k1, k2;
    191  0  stevel 
    192  0  stevel 	if (list->l_used < list->l_size) {	/* just add */
    193  0  stevel 		list_insert(list, ptr);
    194  0  stevel 		return;
    195  0  stevel 	}
    196  0  stevel 	k1 = list_getkeyval(list, list->l_ptrs[list->l_used - 1]);
    197  0  stevel 	k2 = list_getkeyval(list, ptr);
    198  0  stevel 	if (compare_keys(list, k1, k2) >= 0)	/* skip insertion */
    199  0  stevel 		return;
    200  0  stevel 	k1 = list_getkeyval(list, list->l_ptrs[0]);
    201  0  stevel 	if (compare_keys(list, k2, k1) >= 0) {	/* add at the head */
    202  0  stevel 		list_insert(list, ptr);
    203  0  stevel 		return;
    204  0  stevel 	}
    205  0  stevel 	list_insert(list, ptr);
    206  0  stevel }
    207  0  stevel 
    208  0  stevel void
    209  0  stevel list_sort(list_t *list)
    210  0  stevel {
    211  0  stevel 	(void) memset(list->l_ptrs, 0, sizeof (void *) * list->l_size);
    212  0  stevel 	list->l_used = 0;
    213  0  stevel 
    214  0  stevel 	if (list->l_type == LT_LWPS) {
    215  0  stevel 		lwp_info_t *lwp = list->l_head;
    216  0  stevel 
    217  0  stevel 		while (lwp) {
    218  0  stevel 			list_preinsert(list, (void *)lwp);
    219  0  stevel 			lwp = lwp->li_next;
    220  0  stevel 		}
    221  0  stevel 	} else {
    222  0  stevel 		id_info_t *id = list->l_head;
    223  0  stevel 
    224  0  stevel 		while (id) {
    225  0  stevel 			list_preinsert(list, (void *)id);
    226  0  stevel 			id = id->id_next;
    227  0  stevel 		}
    228  0  stevel 	}
    229  0  stevel }
    230