|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * TimerElem.c ! 24: * ! 25: * From v01.00 04/15/90 mbs ! 26: * Modified for MP, 1996 by Tuyen Nguyen ! 27: * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX. ! 28: */ ! 29: ! 30: #include <sys/errno.h> ! 31: #include <sys/types.h> ! 32: #include <sys/param.h> ! 33: #include <machine/spl.h> ! 34: #include <sys/systm.h> ! 35: #include <sys/kernel.h> ! 36: #include <sys/proc.h> ! 37: #include <sys/filedesc.h> ! 38: #include <sys/fcntl.h> ! 39: #include <sys/mbuf.h> ! 40: #include <sys/socket.h> ! 41: ! 42: #include <netat/sysglue.h> ! 43: #include <netat/appletalk.h> ! 44: #include <netat/at_pcb.h> ! 45: #include <netat/debug.h> ! 46: #include <netat/adsp.h> ! 47: #include <netat/adsp_internal.h> ! 48: ! 49: atlock_t adsptmr_lock; ! 50: ! 51: extern void DoTimerElem(); /* (TimerElemPtr t); ! 52: * External routine called to ! 53: * process each one. */ ! 54: ! 55: /* ! 56: * InsertTimerElem ! 57: * ! 58: * INPUTS: ! 59: * qhead Address of ptr to first item in list ! 60: * t timer element to link in ! 61: * vbl timer value to use ! 62: * OUTPUTS: ! 63: * void ! 64: */ ! 65: void InsertTimerElem(qhead, t, val) ! 66: /* (TimerElemPtr *qhead, TimerElemPtr t, word val) */ ! 67: TimerElemPtr *qhead, t; ! 68: int val; ! 69: { ! 70: TimerElemPtr p; /* parent pointer */ ! 71: TimerElemPtr n; /* current */ ! 72: int s; ! 73: ! 74: ATDISABLE(s, adsptmr_lock); ! 75: ! 76: if (t->onQ) { ! 77: /* ! 78: * someone else beat us to the punch and put this ! 79: * element back on the queue, just return in this case ! 80: */ ! 81: ATENABLE(s, adsptmr_lock); ! 82: return; ! 83: } ! 84: p = (TimerElemPtr)qhead; ! 85: ! 86: while (n = p->link) { ! 87: if (val <= n->timer) /* Do we go in front of this? */ ! 88: { ! 89: n->timer -= val; /* Yes, adjust his delta */ ! 90: break; /* and go link us in */ ! 91: } ! 92: val -= n->timer; /* No, subtract off delta from our value */ ! 93: p = n; ! 94: } /* while */ ! 95: ! 96: /* It must go after item pointed to by p and in front of item ! 97: * pointed to by n */ ! 98: ! 99: t->onQ = 1; /* we're linked in now */ ! 100: p->link = t; /* parent points to us */ ! 101: t->timer = val; /* this is our value */ ! 102: t->link = n; /* we point to n */ ! 103: ! 104: ATENABLE(s, adsptmr_lock); ! 105: } ! 106: ! 107: ! 108: /* ! 109: * RemoveTimerElem ! 110: * ! 111: * INPUTS: ! 112: * qhead Address of ptr to first item in list ! 113: * t timer element to link in ! 114: * OUTPUTS: ! 115: * void ! 116: */ ! 117: void RemoveTimerElem(qhead, t) /* (TimerElemPtr *qhead, TimerElemPtr t) */ ! 118: TimerElemPtr *qhead, t; ! 119: { ! 120: TimerElemPtr p; /* parent pointer */ ! 121: TimerElemPtr n; /* current */ ! 122: int s; ! 123: ! 124: ATDISABLE(s, adsptmr_lock); ! 125: ! 126: if ( !t->onQ) { ! 127: /* ! 128: * someone else beat us to the punch and took this ! 129: * element off of the queue, just return in this case ! 130: */ ! 131: ATENABLE(s, adsptmr_lock); ! 132: return; ! 133: } ! 134: p = (TimerElemPtr)qhead; ! 135: ! 136: while (n = p->link) /* Get next item in queue */ ! 137: { ! 138: if (n == t) /* Is it us? */ ! 139: { ! 140: if (p->link = n->link) /* Link our parent to our child */ ! 141: { ! 142: n->link->timer += t->timer; /* and update child's timer */ ! 143: } ! 144: n->onQ = 0; /* Not on linked list anymore */ ! 145: break; ! 146: } ! 147: p = n; ! 148: } /* while */ ! 149: ! 150: ATENABLE(s, adsptmr_lock); ! 151: } ! 152: ! 153: ! 154: /* ! 155: * TimerQueueTick ! 156: * ! 157: * INPUTS: ! 158: * qhead Address of ptr to first item in list ! 159: * ! 160: * OUTPUTS: ! 161: * void ! 162: */ ! 163: void TimerQueueTick(qhead) /* (TimerElemPtr *qhead) */ ! 164: TimerElemPtr *qhead; ! 165: { ! 166: TimerElemPtr p; /* parent pointer */ ! 167: TimerElemPtr n; /* current */ ! 168: int s; ! 169: ! 170: ATDISABLE(s, adsptmr_lock); ! 171: ! 172: p = (TimerElemPtr)qhead; ! 173: if (p->link) /* Is anything on queue? */ ! 174: p->link->timer--; /* Yes, decrement by a tick */ ! 175: else ! 176: goto done; /* No, we're outta' here */ ! 177: ! 178: while ((n = p->link) && ! 179: (n->timer == 0)) /* Next guy needs to be serviced */ ! 180: { ! 181: p->link = n->link; /* Unlink us */ ! 182: n->onQ = 0; ! 183: ! 184: ATENABLE(s, adsptmr_lock); ! 185: DoTimerElem(n); ! 186: ATDISABLE(s, adsptmr_lock); ! 187: ! 188: p = (TimerElemPtr)qhead; ! 189: } /* while */ ! 190: ! 191: done: ! 192: ATENABLE(s, adsptmr_lock); ! 193: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.