Annotation of kernel/bsd/netat/adsp_TimerElem.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.