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 #include <assert.h> 28 29 #include <dt_inttab.h> 30 #include <dt_impl.h> 31 32 dt_inttab_t * 33 dt_inttab_create(dtrace_hdl_t *dtp) 34 { 35 uint_t len = _dtrace_intbuckets; 36 dt_inttab_t *ip; 37 38 assert((len & (len - 1)) == 0); 39 40 if ((ip = dt_zalloc(dtp, sizeof (dt_inttab_t))) == NULL || 41 (ip->int_hash = dt_zalloc(dtp, sizeof (void *) * len)) == NULL) { 42 dt_free(dtp, ip); 43 return (NULL); 44 } 45 46 ip->int_hdl = dtp; 47 ip->int_hashlen = len; 48 49 return (ip); 50 } 51 52 void 53 dt_inttab_destroy(dt_inttab_t *ip) 54 { 55 dt_inthash_t *hp, *np; 56 57 for (hp = ip->int_head; hp != NULL; hp = np) { 58 np = hp->inh_next; 59 dt_free(ip->int_hdl, hp); 60 } 61 62 dt_free(ip->int_hdl, ip->int_hash); 63 dt_free(ip->int_hdl, ip); 64 } 65 66 int 67 dt_inttab_insert(dt_inttab_t *ip, uint64_t value, uint_t flags) 68 { 69 uint_t h = value & (ip->int_hashlen - 1); 70 dt_inthash_t *hp; 71 72 if (flags & DT_INT_SHARED) { 73 for (hp = ip->int_hash[h]; hp != NULL; hp = hp->inh_hash) { 74 if (hp->inh_value == value && hp->inh_flags == flags) 75 return (hp->inh_index); 76 } 77 } 78 79 if ((hp = dt_alloc(ip->int_hdl, sizeof (dt_inthash_t))) == NULL) 80 return (-1); 81 82 hp->inh_hash = ip->int_hash[h]; 83 hp->inh_next = NULL; 84 hp->inh_value = value; 85 hp->inh_index = ip->int_index++; 86 hp->inh_flags = flags; 87 88 ip->int_hash[h] = hp; 89 ip->int_nelems++; 90 91 if (ip->int_head == NULL) 92 ip->int_head = hp; 93 else 94 ip->int_tail->inh_next = hp; 95 96 ip->int_tail = hp; 97 return (hp->inh_index); 98 } 99 100 uint_t 101 dt_inttab_size(const dt_inttab_t *ip) 102 { 103 return (ip->int_nelems); 104 } 105 106 void 107 dt_inttab_write(const dt_inttab_t *ip, uint64_t *dst) 108 { 109 const dt_inthash_t *hp; 110 111 for (hp = ip->int_head; hp != NULL; hp = hp->inh_next) 112 *dst++ = hp->inh_value; 113 } 114