Lines Matching refs:lp

35 #define	ELEM_TO_NODE(lp, e) \
36 ((uu_list_node_impl_t *)((uintptr_t)(e) + (lp)->ul_offset))
38 #define NODE_TO_ELEM(lp, n) \
39 ((void *)((uintptr_t)(n) - (lp)->ul_offset))
180 uu_list_t *lp, *next, *prev;
196 lp = uu_zalloc(sizeof (*lp));
197 if (lp == NULL) {
202 lp->ul_pool = pp;
203 lp->ul_parent = parent;
204 lp->ul_offset = pp->ulp_nodeoffset;
205 lp->ul_debug = pp->ulp_debug || (flags & UU_LIST_DEBUG);
206 lp->ul_sorted = (flags & UU_LIST_SORTED);
207 lp->ul_numnodes = 0;
208 lp->ul_index = (pp->ulp_last_index = INDEX_NEXT(pp->ulp_last_index));
210 lp->ul_null_node.uln_next = &lp->ul_null_node;
211 lp->ul_null_node.uln_prev = &lp->ul_null_node;
213 lp->ul_null_walk.ulw_next = &lp->ul_null_walk;
214 lp->ul_null_walk.ulw_prev = &lp->ul_null_walk;
219 lp->ul_next = next;
220 lp->ul_prev = prev;
221 next->ul_prev = lp;
222 prev->ul_next = lp;
225 return (lp);
229 uu_list_destroy(uu_list_t *lp)
231 uu_list_pool_t *pp = lp->ul_pool;
233 if (lp->ul_debug) {
234 if (lp->ul_null_node.uln_next != &lp->ul_null_node ||
235 lp->ul_null_node.uln_prev != &lp->ul_null_node) {
237 (void *)lp);
239 if (lp->ul_numnodes != 0) {
241 "but list is empty\n", (void *)lp);
243 if (lp->ul_null_walk.ulw_next != &lp->ul_null_walk ||
244 lp->ul_null_walk.ulw_prev != &lp->ul_null_walk) {
246 (void *)lp);
251 lp->ul_next->ul_prev = lp->ul_prev;
252 lp->ul_prev->ul_next = lp->ul_next;
254 lp->ul_prev = NULL;
255 lp->ul_next = NULL;
256 lp->ul_pool = NULL;
257 uu_free(lp);
261 list_insert(uu_list_t *lp, uu_list_node_impl_t *np, uu_list_node_impl_t *prev,
264 if (lp->ul_debug) {
267 "neighbors\n", (void *)lp, (void *)next,
270 if (np->uln_next != POOL_TO_MARKER(lp->ul_pool) ||
274 (void *)lp, NODE_TO_ELEM(lp, np), (void *)np);
279 lp->ul_index = INDEX_NEXT(lp->ul_index);
286 lp->ul_numnodes++;
290 uu_list_insert(uu_list_t *lp, void *elem, uu_list_index_t idx)
296 np = &lp->ul_null_node;
298 if (lp->ul_debug) {
299 if (!INDEX_VALID(lp, idx))
301 (void *)lp, elem, (void *)idx,
306 "index\n", (void *)lp, elem, (void *)idx);
309 list_insert(lp, ELEM_TO_NODE(lp, elem), np->uln_prev, np);
313 uu_list_find(uu_list_t *lp, void *elem, void *private, uu_list_index_t *out)
315 int sorted = lp->ul_sorted;
316 uu_compare_fn_t *func = lp->ul_pool->ulp_cmp;
325 for (np = lp->ul_null_node.uln_next; np != &lp->ul_null_node;
327 void *ep = NODE_TO_ELEM(lp, np);
331 *out = NODE_TO_INDEX(lp, np);
336 *out = NODE_TO_INDEX(lp, np);
341 *out = NODE_TO_INDEX(lp, 0);
346 uu_list_nearest_next(uu_list_t *lp, uu_list_index_t idx)
351 np = &lp->ul_null_node;
353 if (lp->ul_debug) {
354 if (!INDEX_VALID(lp, idx))
356 (void *)lp, (void *)idx,
361 "index\n", (void *)lp, (void *)idx);
364 if (np == &lp->ul_null_node)
367 return (NODE_TO_ELEM(lp, np));
371 uu_list_nearest_prev(uu_list_t *lp, uu_list_index_t idx)
376 np = &lp->ul_null_node;
378 if (lp->ul_debug) {
379 if (!INDEX_VALID(lp, idx))
381 (void *)lp, (void *)idx, INDEX_CHECK(idx)?
385 "index\n", (void *)lp, (void *)idx);
388 if ((np = np->uln_prev) == &lp->ul_null_node)
391 return (NODE_TO_ELEM(lp, np));
395 list_walk_init(uu_list_walk_t *wp, uu_list_t *lp, uint32_t flags)
403 wp->ulw_list = lp;
407 wp->ulw_next_result = lp->ul_null_node.uln_next;
409 wp->ulw_next_result = lp->ul_null_node.uln_prev;
411 if (lp->ul_debug || robust) {
417 wp->ulw_next = next = &lp->ul_null_walk;
425 list_walk_advance(uu_list_walk_t *wp, uu_list_t *lp)
430 if (np == &lp->ul_null_node)
454 uu_list_walk_start(uu_list_t *lp, uint32_t flags)
469 list_walk_init(wp, lp, flags);
476 uu_list_t *lp = wp->ulw_list;
477 uu_list_node_impl_t *np = list_walk_advance(wp, lp);
482 return (NODE_TO_ELEM(lp, np));
493 uu_list_walk(uu_list_t *lp, uu_walk_fn_t *func, void *private, uint32_t flags)
507 if (lp->ul_debug || robust) {
515 list_walk_init(my_walk, lp, flags);
524 for (np = lp->ul_null_node.uln_next;
525 status == UU_WALK_NEXT && np != &lp->ul_null_node;
527 status = (*func)(NODE_TO_ELEM(lp, np), private);
530 for (np = lp->ul_null_node.uln_prev;
531 status == UU_WALK_NEXT && np != &lp->ul_null_node;
533 status = (*func)(NODE_TO_ELEM(lp, np), private);
544 uu_list_remove(uu_list_t *lp, void *elem)
546 uu_list_node_impl_t *np = ELEM_TO_NODE(lp, elem);
549 if (lp->ul_debug) {
552 (void *)lp, elem);
556 lp->ul_index = INDEX_NEXT(lp->ul_index);
563 for (wp = lp->ul_null_walk.ulw_next; wp != &lp->ul_null_walk;
567 (void) list_walk_advance(wp, lp);
570 "walker\n", (void *)lp, elem);
577 lp->ul_numnodes--;
579 np->uln_next = POOL_TO_MARKER(lp->ul_pool);
584 uu_list_teardown(uu_list_t *lp, void **cookie)
591 if (lp->ul_debug && *cookie != NULL)
593 (void *)lp, (void *)cookie);
595 ep = uu_list_first(lp);
597 uu_list_remove(lp, ep);
602 uu_list_insert_before(uu_list_t *lp, void *target, void *elem)
604 uu_list_node_impl_t *np = ELEM_TO_NODE(lp, target);
607 np = &lp->ul_null_node;
609 if (lp->ul_debug) {
613 (void *)lp, target, elem, target);
615 if (lp->ul_sorted) {
616 if (lp->ul_debug)
618 "UU_LIST_SORTED\n", (void *)lp);
623 list_insert(lp, ELEM_TO_NODE(lp, elem), np->uln_prev, np);
628 uu_list_insert_after(uu_list_t *lp, void *target, void *elem)
630 uu_list_node_impl_t *np = ELEM_TO_NODE(lp, target);
633 np = &lp->ul_null_node;
635 if (lp->ul_debug) {
639 (void *)lp, target, elem, target);
641 if (lp->ul_sorted) {
642 if (lp->ul_debug)
644 "UU_LIST_SORTED\n", (void *)lp);
649 list_insert(lp, ELEM_TO_NODE(lp, elem), np, np->uln_next);
654 uu_list_numnodes(uu_list_t *lp)
656 return (lp->ul_numnodes);
660 uu_list_first(uu_list_t *lp)
662 uu_list_node_impl_t *n = lp->ul_null_node.uln_next;
663 if (n == &lp->ul_null_node)
665 return (NODE_TO_ELEM(lp, n));
669 uu_list_last(uu_list_t *lp)
671 uu_list_node_impl_t *n = lp->ul_null_node.uln_prev;
672 if (n == &lp->ul_null_node)
674 return (NODE_TO_ELEM(lp, n));
678 uu_list_next(uu_list_t *lp, void *elem)
680 uu_list_node_impl_t *n = ELEM_TO_NODE(lp, elem);
683 if (n == &lp->ul_null_node)
685 return (NODE_TO_ELEM(lp, n));
689 uu_list_prev(uu_list_t *lp, void *elem)
691 uu_list_node_impl_t *n = ELEM_TO_NODE(lp, elem);
694 if (n == &lp->ul_null_node)
696 return (NODE_TO_ELEM(lp, n));