003 File Manager
Current Path:
/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common
usr
/
src
/
cddl
/
contrib
/
opensolaris
/
lib
/
libdtrace
/
common
/
📁
..
📄
drti.c
(5.62 KB)
📄
dt_aggregate.c
(51.43 KB)
📄
dt_as.c
(13.49 KB)
📄
dt_as.h
(1.89 KB)
📄
dt_buf.c
(4.12 KB)
📄
dt_buf.h
(2.01 KB)
📄
dt_cc.c
(71.28 KB)
📄
dt_cg.c
(61.79 KB)
📄
dt_consume.c
(74.05 KB)
📄
dt_decl.c
(30.71 KB)
📄
dt_decl.h
(4.45 KB)
📄
dt_dis.c
(14.65 KB)
📄
dt_dof.c
(28.19 KB)
📄
dt_dof.h
(2.06 KB)
📄
dt_error.c
(8.15 KB)
📄
dt_errtags.h
(13.26 KB)
📄
dt_grammar.y
(23.18 KB)
📄
dt_handle.c
(11.62 KB)
📄
dt_ident.c
(26.34 KB)
📄
dt_ident.h
(7.79 KB)
📄
dt_impl.h
(32.49 KB)
📄
dt_inttab.c
(2.56 KB)
📄
dt_inttab.h
(2.28 KB)
📄
dt_lex.l
(23.64 KB)
📄
dt_link.c
(49.01 KB)
📄
dt_list.c
(2.67 KB)
📄
dt_list.h
(1.52 KB)
📄
dt_map.c
(10.91 KB)
📄
dt_module.c
(45.28 KB)
📄
dt_module.h
(2.1 KB)
📄
dt_open.c
(61.61 KB)
📄
dt_options.c
(25.04 KB)
📄
dt_parser.c
(144.81 KB)
📄
dt_parser.h
(11.64 KB)
📄
dt_pcb.c
(5.56 KB)
📄
dt_pcb.h
(4.38 KB)
📄
dt_pid.c
(24.9 KB)
📄
dt_pid.h
(2.03 KB)
📄
dt_pq.c
(2.83 KB)
📄
dt_pq.h
(1.26 KB)
📄
dt_pragma.c
(15.55 KB)
📄
dt_print.c
(18.57 KB)
📄
dt_printf.c
(55.53 KB)
📄
dt_printf.h
(4.87 KB)
📄
dt_proc.c
(36.39 KB)
📄
dt_proc.h
(4.54 KB)
📄
dt_program.c
(14.32 KB)
📄
dt_program.h
(1.86 KB)
📄
dt_provider.c
(22.95 KB)
📄
dt_provider.h
(4.37 KB)
📄
dt_regset.c
(2.88 KB)
📄
dt_regset.h
(1.57 KB)
📄
dt_string.c
(5.75 KB)
📄
dt_string.h
(1.31 KB)
📄
dt_strtab.c
(5.74 KB)
📄
dt_strtab.h
(2.42 KB)
📄
dt_subr.c
(22.59 KB)
📄
dt_sugar.c
(13.71 KB)
📄
dt_work.c
(8.12 KB)
📄
dt_xlator.c
(11.3 KB)
📄
dt_xlator.h
(3.09 KB)
📄
dtrace.h
(23.64 KB)
📄
mkerrno.sh
(1.2 KB)
📄
mkerrtags.sh
(1.4 KB)
📄
mknames.sh
(1.33 KB)
📄
mksignal.sh
(1.22 KB)
Editing: dt_pq.c
/* * CDDL HEADER START * * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. * * CDDL HEADER END */ /* * Copyright (c) 2012 by Delphix. All rights reserved. */ #include <dtrace.h> #include <dt_impl.h> #include <dt_pq.h> #include <assert.h> /* * Create a new priority queue. * * size is the maximum number of items that will be stored in the priority * queue at one time. */ dt_pq_t * dt_pq_init(dtrace_hdl_t *dtp, uint_t size, dt_pq_value_f value_cb, void *cb_arg) { dt_pq_t *p; assert(size > 1); if ((p = dt_zalloc(dtp, sizeof (dt_pq_t))) == NULL) return (NULL); p->dtpq_items = dt_zalloc(dtp, size * sizeof (p->dtpq_items[0])); if (p->dtpq_items == NULL) { dt_free(dtp, p); return (NULL); } p->dtpq_hdl = dtp; p->dtpq_size = size; p->dtpq_last = 1; p->dtpq_value = value_cb; p->dtpq_arg = cb_arg; return (p); } void dt_pq_fini(dt_pq_t *p) { dtrace_hdl_t *dtp = p->dtpq_hdl; dt_free(dtp, p->dtpq_items); dt_free(dtp, p); } static uint64_t dt_pq_getvalue(dt_pq_t *p, uint_t index) { void *item = p->dtpq_items[index]; return (p->dtpq_value(item, p->dtpq_arg)); } void dt_pq_insert(dt_pq_t *p, void *item) { uint_t i; assert(p->dtpq_last < p->dtpq_size); i = p->dtpq_last++; p->dtpq_items[i] = item; while (i > 1 && dt_pq_getvalue(p, i) < dt_pq_getvalue(p, i / 2)) { void *tmp = p->dtpq_items[i]; p->dtpq_items[i] = p->dtpq_items[i / 2]; p->dtpq_items[i / 2] = tmp; i /= 2; } } /* * Return elements from the priority queue. *cookie should be zero when first * called. Returns NULL when there are no more elements. */ void * dt_pq_walk(dt_pq_t *p, uint_t *cookie) { (*cookie)++; if (*cookie >= p->dtpq_last) return (NULL); return (p->dtpq_items[*cookie]); } void * dt_pq_pop(dt_pq_t *p) { uint_t i = 1; void *ret; assert(p->dtpq_last > 0); if (p->dtpq_last == 1) return (NULL); ret = p->dtpq_items[1]; p->dtpq_last--; p->dtpq_items[1] = p->dtpq_items[p->dtpq_last]; p->dtpq_items[p->dtpq_last] = NULL; for (;;) { uint_t lc = i * 2; uint_t rc = i * 2 + 1; uint_t c; uint64_t v; void *tmp; if (lc >= p->dtpq_last) break; if (rc >= p->dtpq_last) { c = lc; v = dt_pq_getvalue(p, lc); } else { uint64_t lv = dt_pq_getvalue(p, lc); uint64_t rv = dt_pq_getvalue(p, rc); if (lv < rv) { c = lc; v = lv; } else { c = rc; v = rv; } } if (v >= dt_pq_getvalue(p, i)) break; tmp = p->dtpq_items[i]; p->dtpq_items[i] = p->dtpq_items[c]; p->dtpq_items[c] = tmp; i = c; } return (ret); }
Upload File
Create Folder