507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER START
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The contents of this file are subject to the terms of the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Common Development and Distribution License (the "License").
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You may not use this file except in compliance with the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * or http://www.opensolaris.org/os/licensing.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * See the License for the specific language governing permissions
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * and limitations under the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * When distributing Covered Code, include this CDDL HEADER in each
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If applicable, add the following below this CDDL HEADER, with the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * fields enclosed by brackets "[]" replaced with your own identifying
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * information: Portions Copyright [yyyy] [name of copyright owner]
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER END
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Use is subject to license terms.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#pragma ident "%Z%%M% %I% %E% SMI"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/types.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/param.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/debug.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "ghd_queue.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL1_add(L1_t *lp, L1el_t *lep, void *datap)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* init the list element */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lep->le_nextp = NULL;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lep->le_datap = datap;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (!lp->l1_tailp) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* list is empty */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_headp = lep;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf } else {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* add it to the tailend */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_tailp->le_nextp = lep;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_tailp = lep;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * L1Delete()
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Remove a specific entry from a singly-linked list.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL1_delete(L1_t *lp, L1el_t *lep)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf L1el_t *prevp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (lp->l1_headp == lep) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* it's the first entry in the list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((lp->l1_headp = lep->le_nextp) == NULL) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* the list is now empty */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_tailp = NULL;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf for (prevp = lp->l1_headp; prevp != NULL; prevp = prevp->le_nextp) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (prevp->le_nextp == lep) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((prevp->le_nextp = lep->le_nextp) == NULL)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_tailp = prevp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* its not on this list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * L1_remove()
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Remove the entry at the head of the list (if any).
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL1_remove(L1_t *lp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf L1el_t *lep;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* pop the first one off the list head */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((lep = lp->l1_headp) == NULL) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf }
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* if the list is now empty fix the tail pointer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((lp->l1_headp = lep->le_nextp) == NULL)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lp->l1_tailp = NULL;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf lep->le_nextp = NULL;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (lep->le_datap);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL2_add(L2el_t *headp, L2el_t *elementp, void *private)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp != NULL && elementp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp->l2_nextp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp->l2_prevp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_private = private;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp = headp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_prevp = headp->l2_prevp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf headp->l2_prevp->l2_nextp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf headp->l2_prevp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL2_delete(L2el_t *elementp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp->l2_nextp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp->l2_prevp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp->l2_nextp->l2_prevp == elementp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp->l2_prevp->l2_nextp == elementp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_prevp->l2_nextp = elementp->l2_nextp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp->l2_prevp = elementp->l2_prevp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* link it to itself in case someone does a double delete */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_prevp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL2_add_head(L2el_t *headp, L2el_t *elementp, void *private)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp != NULL && elementp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp->l2_nextp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp->l2_prevp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_private = private;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_prevp = headp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp = headp->l2_nextp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf headp->l2_nextp->l2_prevp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf headp->l2_nextp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * L2_remove()
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Remove the entry from the head of the list (if any).
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL2_remove_head(L2el_t *headp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf L2el_t *elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(headp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (L2_EMPTY(headp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp = headp->l2_nextp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf headp->l2_nextp = elementp->l2_nextp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp->l2_prevp = headp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* link it to itself in case someone does a double delete */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_nextp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf elementp->l2_prevp = elementp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (elementp->l2_private);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfL2_next(L2el_t *elementp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf{
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ASSERT(elementp != NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (L2_EMPTY(elementp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (NULL);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (elementp->l2_nextp->l2_private);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}