dt_inttab.c
来自「Sun Solaris 10 中的 DTrace 组件的源代码。请参看: htt」· C语言 代码 · 共 99 行
C
99 行
/* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only. * See the file usr/src/LICENSING.NOTICE in this distribution or * http://www.opensolaris.org/license/ for details. */#pragma ident "@(#)dt_inttab.c 1.1 04/11/13 SMI"#include <assert.h>#include <dt_inttab.h>#include <dt_impl.h>dt_inttab_t *dt_inttab_create(dtrace_hdl_t *dtp){ uint_t len = _dtrace_intbuckets; dt_inttab_t *ip; assert((len & (len - 1)) == 0); if ((ip = dt_zalloc(dtp, sizeof (dt_inttab_t))) == NULL || (ip->int_hash = dt_zalloc(dtp, sizeof (void *) * len)) == NULL) { dt_free(dtp, ip); return (NULL); } ip->int_hdl = dtp; ip->int_hashlen = len; return (ip);}voiddt_inttab_destroy(dt_inttab_t *ip){ dt_inthash_t *hp, *np; for (hp = ip->int_head; hp != NULL; hp = np) { np = hp->inh_next; dt_free(ip->int_hdl, hp); } dt_free(ip->int_hdl, ip->int_hash); dt_free(ip->int_hdl, ip);}intdt_inttab_insert(dt_inttab_t *ip, uint64_t value, uint_t flags){ uint_t h = value & (ip->int_hashlen - 1); dt_inthash_t *hp; if (flags & DT_INT_SHARED) { for (hp = ip->int_hash[h]; hp != NULL; hp = hp->inh_hash) { if (hp->inh_value == value && hp->inh_flags == flags) return (hp->inh_index); } } if ((hp = dt_alloc(ip->int_hdl, sizeof (dt_inthash_t))) == NULL) return (-1); hp->inh_hash = ip->int_hash[h]; hp->inh_next = NULL; hp->inh_value = value; hp->inh_index = ip->int_index++; hp->inh_flags = flags; ip->int_hash[h] = hp; ip->int_nelems++; if (ip->int_head == NULL) ip->int_head = hp; else ip->int_tail->inh_next = hp; ip->int_tail = hp; return (hp->inh_index);}uint_tdt_inttab_size(const dt_inttab_t *ip){ return (ip->int_nelems);}voiddt_inttab_write(const dt_inttab_t *ip, uint64_t *dst){ const dt_inthash_t *hp; for (hp = ip->int_head; hp != NULL; hp = hp->inh_next) *dst++ = hp->inh_value;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?