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