Home | History | Annotate | Line # | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include <assert.h>
     30 
     31 #include <dt_inttab.h>
     32 #include <dt_impl.h>
     33 
     34 dt_inttab_t *
     35 dt_inttab_create(dtrace_hdl_t *dtp)
     36 {
     37 	uint_t len = _dtrace_intbuckets;
     38 	dt_inttab_t *ip;
     39 
     40 	assert((len & (len - 1)) == 0);
     41 
     42 	if ((ip = dt_zalloc(dtp, sizeof (dt_inttab_t))) == NULL ||
     43 	    (ip->int_hash = dt_zalloc(dtp, sizeof (void *) * len)) == NULL) {
     44 		dt_free(dtp, ip);
     45 		return (NULL);
     46 	}
     47 
     48 	ip->int_hdl = dtp;
     49 	ip->int_hashlen = len;
     50 
     51 	return (ip);
     52 }
     53 
     54 void
     55 dt_inttab_destroy(dt_inttab_t *ip)
     56 {
     57 	dt_inthash_t *hp, *np;
     58 
     59 	for (hp = ip->int_head; hp != NULL; hp = np) {
     60 		np = hp->inh_next;
     61 		dt_free(ip->int_hdl, hp);
     62 	}
     63 
     64 	dt_free(ip->int_hdl, ip->int_hash);
     65 	dt_free(ip->int_hdl, ip);
     66 }
     67 
     68 int
     69 dt_inttab_insert(dt_inttab_t *ip, uint64_t value, uint_t flags)
     70 {
     71 	uint_t h = value & (ip->int_hashlen - 1);
     72 	dt_inthash_t *hp;
     73 
     74 	if (flags & DT_INT_SHARED) {
     75 		for (hp = ip->int_hash[h]; hp != NULL; hp = hp->inh_hash) {
     76 			if (hp->inh_value == value && hp->inh_flags == flags)
     77 				return (hp->inh_index);
     78 		}
     79 	}
     80 
     81 	if ((hp = dt_alloc(ip->int_hdl, sizeof (dt_inthash_t))) == NULL)
     82 		return (-1);
     83 
     84 	hp->inh_hash = ip->int_hash[h];
     85 	hp->inh_next = NULL;
     86 	hp->inh_value = value;
     87 	hp->inh_index = ip->int_index++;
     88 	hp->inh_flags = flags;
     89 
     90 	ip->int_hash[h] = hp;
     91 	ip->int_nelems++;
     92 
     93 	if (ip->int_head == NULL)
     94 		ip->int_head = hp;
     95 	else
     96 		ip->int_tail->inh_next = hp;
     97 
     98 	ip->int_tail = hp;
     99 	return (hp->inh_index);
    100 }
    101 
    102 uint_t
    103 dt_inttab_size(const dt_inttab_t *ip)
    104 {
    105 	return (ip->int_nelems);
    106 }
    107 
    108 void
    109 dt_inttab_write(const dt_inttab_t *ip, uint64_t *dst)
    110 {
    111 	const dt_inthash_t *hp;
    112 
    113 	for (hp = ip->int_head; hp != NULL; hp = hp->inh_next)
    114 		*dst++ = hp->inh_value;
    115 }
    116