9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MODULE: dapl_llist.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Manage doubly linked lists within the DAPL Reference Implementation
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * A link list head points to the first member of a linked list, but
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is itself not a member of the list.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * +---------------------------------------------+
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * | entry entry entry |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HEAD -> | +-------+ +-------+ +-------+ |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * +--> | flink | --> | flink | --> | flink | >--+
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * | data | | data | | data |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * +--< | blink | <-- | blink | <-- | blink | <--|
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * | +-------+ +-------+ +-------+ |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * | |
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * +---------------------------------------------+
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Note: Each of the remove functions takes an assertion failure if
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * an element cannot be removed from the list.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_llist.c,v 1.9 2003/06/13 12:21:11 sjs2 Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_init_head()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: initialize a linked list head
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_init_head(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_init_entry()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: initialize a linked list entry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_init_entry(DAPL_LLIST_ENTRY *entry)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->data = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->list_head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_is_empty()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: returns TRUE if the linked list is empty
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_BOOLEAN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_is_empty(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (*head == NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_add_head()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Add an entry to the head of a linked list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_add_head(DAPL_LLIST_HEAD *head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *data)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* deal with empty list */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_llist_is_empty(head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = first->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->blink->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->blink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->data = data;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->list_head = head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_add_tail()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Add an entry to the tail of a linked list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_add_tail(DAPL_LLIST_HEAD *head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *data)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *last;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* deal with empty list */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_llist_is_empty(head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last = (*head)->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = last->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = last;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->flink->blink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->data = data;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->list_head = head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_add_entry()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Add an entry before an element in the list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_add_entry(DAPL_LLIST_HEAD * head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY * entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY * new_entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void * data)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *last;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* deal with empty list */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (dapl_llist_is_empty(head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last = entry->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = new_entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->flink = new_entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_entry->flink = entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_entry->blink = last;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_entry->data = data;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor new_entry->list_head = head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_remove_head()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Remove the first entry of a linked list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_remove_head(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(!dapl_llist_is_empty(head));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = first->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->flink->blink = first->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->blink->flink = first->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (first->flink == first) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* clean up the links for good measure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->flink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->blink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->list_head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (first->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_remove_tail()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Remove the last entry of a linked list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_remove_tail(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *last;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(!dapl_llist_is_empty(head));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last = (*head)->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->blink->flink = last->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->flink->blink = last->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (last->flink == last) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* clean up the links for good measure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->flink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->blink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor last->list_head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (last->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_remove_entry()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Remove the specified entry from a linked list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_remove_entry(DAPL_LLIST_HEAD *head, DAPL_LLIST_ENTRY *entry)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(!dapl_llist_is_empty(head));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if it's the first entry, pull it off */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (first == entry) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (*head) = first->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if it was the only entry, kill the list */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (first->flink == first) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (*head) = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef VERIFY_LINKED_LIST
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *try_entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor try_entry = first->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (;;) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (try_entry == first) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * not finding the element on the list
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is a BAD thing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (try_entry == entry) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor break;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor try_entry = try_entry->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* VERIFY_LINKED_LIST */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(entry->list_head == head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->list_head = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink->blink = entry->blink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink->flink = entry->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (entry->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_peek_head
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_peek_head(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(!dapl_llist_is_empty(head));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (first->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_next_entry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Obtain the next entry in the list, return NULL when we get to the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * head
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_next_entry(IN DAPL_LLIST_HEAD *head,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_LLIST_ENTRY *cur_ent)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY *next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_assert(!dapl_llist_is_empty(head));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cur_ent == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor next = cur_ent->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (next == *head) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (next->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_llist_debug_print_list()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Purpose: Prints the linked list for debugging
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_llist_debug_print_list(DAPL_LLIST_HEAD *head)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY * entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LLIST_ENTRY * first;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first = *head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!first) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_RTN, "EMPTY_LIST\n");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_RTN, "HEAD %p\n", *head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_RTN, "Entry %p %p %p %p\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->flink,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->blink,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor first->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry = first->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (entry != first) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_RTN, "Entry %p %p %p %p\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->flink,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->blink,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry->data);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry = entry->flink;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}