Source to bsd/netat/adsp_misc.c
/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/param.h>
#include <machine/spl.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/fcntl.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <netat/sysglue.h>
#include <netat/appletalk.h>
#include <netat/at_pcb.h>
#include <netat/debug.h>
#include <netat/adsp.h>
#include <netat/adsp_internal.h>
/*
* These function replace the Mk68 assembly routines found in qAddToEnd.s and
* q????.s
* Modified for MP, 1996 by Tuyen Nguyen
* Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
*/
extern atlock_t adspgen_lock;
struct qlink {
struct qlink *qlinkp;
};
/* ----------------------------------------------------------------------
* void qAddToEnd(void *qhead, void *qelem)
*
* INPUTS:
* Ptr to ptr to 1st item in queue
* Ptr to item to add to end of queue
* OUTPUTS:
* none
*
* Assumptions: The link field is the FIRST field of the qelem structure.
* ----------------------------------------------------------------------
*/
int qAddToEnd(qhead, qelem)
struct qlink **qhead;
struct qlink *qelem;
{
/* define our own type to access the next field. NOTE THAT THE "NEXT"
* FIELD IS ASSUMED TO BE THE FIRST FIELD OF THE STRUCTURE
*/
register struct qlink *q;
/* Scan the linked list to the end and update the previous
* element next field. (do that protocted).
*/
q = *qhead;
if (q) {
while (q->qlinkp) {
/* are we about to link to ourself */
if (q == qelem)
goto breakit;
q = q->qlinkp;
}
q->qlinkp = qelem;
}
else {
*qhead = qelem;
}
qelem->qlinkp = (struct qlink *) 0;
breakit:
#ifdef NOTDEF
DPRINTF("%s: qhead=%x added elem=%x\n","qAddToEnd", qhead, qelem);
#endif
return 0;
}
/* ----------------------------------------------------------------------
* qfind_m
* void* qfind_m(void *qhead, void NPTR match, ProcPtr compare_fnx)
*
* Hunt down a linked list of queue elements calling the compare
* function on each item. When the compare function returns true,
* return ptr to the queue element.
*
*
* INPUTS:
* qhead Address of ptr to first item in queue
* match
* compare_fnx
* OUTPUTS:
* D0 & A0 Ptr to queue element or NIL
* REGISTERS:
* D0,D1,A0,A1
* ----------------------------------------------------------------------
*/
void* qfind_m(qhead, match, compare_fnx)
CCBPtr qhead;
void *match;
ProcPtr compare_fnx;
{
int s;
CCBPtr queue_item = qhead;
ATDISABLE(s, adspgen_lock);
while (queue_item) {
if ((*compare_fnx)(queue_item,match))
break;
queue_item = queue_item->ccbLink;
}
ATENABLE(s, adspgen_lock);
return (queue_item);
}