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
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.
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]
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #pragma ident "%Z%%M% %I% %E% SMI"
31 #include <dt_inttab.h>
35 dt_inttab_create(dtrace_hdl_t
*dtp
)
37 uint_t len
= _dtrace_intbuckets
;
40 assert((len
& (len
- 1)) == 0);
42 if ((ip
= dt_zalloc(dtp
, sizeof (dt_inttab_t
))) == NULL
||
43 (ip
->int_hash
= dt_zalloc(dtp
, sizeof (void *) * len
)) == NULL
) {
49 ip
->int_hashlen
= len
;
55 dt_inttab_destroy(dt_inttab_t
*ip
)
57 dt_inthash_t
*hp
, *np
;
59 for (hp
= ip
->int_head
; hp
!= NULL
; hp
= np
) {
61 dt_free(ip
->int_hdl
, hp
);
64 dt_free(ip
->int_hdl
, ip
->int_hash
);
65 dt_free(ip
->int_hdl
, ip
);
69 dt_inttab_insert(dt_inttab_t
*ip
, uint64_t value
, uint_t flags
)
71 uint_t h
= value
& (ip
->int_hashlen
- 1);
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
);
81 if ((hp
= dt_alloc(ip
->int_hdl
, sizeof (dt_inthash_t
))) == NULL
)
84 hp
->inh_hash
= ip
->int_hash
[h
];
86 hp
->inh_value
= value
;
87 hp
->inh_index
= ip
->int_index
++;
88 hp
->inh_flags
= flags
;
93 if (ip
->int_head
== NULL
)
96 ip
->int_tail
->inh_next
= hp
;
99 return (hp
->inh_index
);
103 dt_inttab_size(const dt_inttab_t
*ip
)
105 return (ip
->int_nelems
);
109 dt_inttab_write(const dt_inttab_t
*ip
, uint64_t *dst
)
111 const dt_inthash_t
*hp
;
113 for (hp
= ip
->int_head
; hp
!= NULL
; hp
= hp
->inh_next
)
114 *dst
++ = hp
->inh_value
;