/* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The 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, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * TimerElem.c * * From v01.00 04/15/90 mbs * Modified for MP, 1996 by Tuyen Nguyen * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern void DoTimerElem(TimerElemPtr); /* (TimerElemPtr t); * External routine called to * process each one. */ /* * InsertTimerElem * * INPUTS: * qhead Address of ptr to first item in list * t timer element to link in * vbl timer value to use * OUTPUTS: * void */ void InsertTimerElem(qhead, t, val) /* (TimerElemPtr *qhead, TimerElemPtr t, word val) */ TimerElemPtr *qhead, t; int val; { TimerElemPtr p; /* parent pointer */ TimerElemPtr n; /* current */ if (t->onQ) { /* * someone else beat us to the punch and put this * element back on the queue, just return in this case */ return; } p = (TimerElemPtr)qhead; while ((n = p->link)) { if (val <= n->timer) /* Do we go in front of this? */ { n->timer -= val; /* Yes, adjust his delta */ break; /* and go link us in */ } val -= n->timer; /* No, subtract off delta from our value */ p = n; } /* while */ /* It must go after item pointed to by p and in front of item * pointed to by n */ t->onQ = 1; /* we're linked in now */ p->link = t; /* parent points to us */ t->timer = val; /* this is our value */ t->link = n; /* we point to n */ } /* * RemoveTimerElem * * INPUTS: * qhead Address of ptr to first item in list * t timer element to link in * OUTPUTS: * void */ void RemoveTimerElem(qhead, t) /* (TimerElemPtr *qhead, TimerElemPtr t) */ TimerElemPtr *qhead, t; { TimerElemPtr p; /* parent pointer */ TimerElemPtr n; /* current */ if ( !t->onQ) { /* * someone else beat us to the punch and took this * element off of the queue, just return in this case */ return; } p = (TimerElemPtr)qhead; while ((n = p->link)) /* Get next item in queue */ { if (n == t) /* Is it us? */ { if ((p->link = n->link)) /* Link our parent to our child */ { n->link->timer += t->timer; /* and update child's timer */ } n->onQ = 0; /* Not on linked list anymore */ break; } p = n; } /* while */ } /* * TimerQueueTick * * INPUTS: * qhead Address of ptr to first item in list * * OUTPUTS: * void */ void TimerQueueTick(qhead) /* (TimerElemPtr *qhead) */ TimerElemPtr *qhead; { TimerElemPtr p; /* parent pointer */ TimerElemPtr n; /* current */ p = (TimerElemPtr)qhead; if (p->link) { /* Is anything on queue? */ p->link->timer--; /* Yes, decrement by a tick */ while ((n = p->link) && (n->timer == 0)) /* Next guy needs to be serviced */ { p->link = n->link; /* Unlink us */ n->onQ = 0; DoTimerElem(n); p = (TimerElemPtr)qhead; } /* while */ } }