Annotation of Gnu-Mach/i386/i386at/gpl/linux/linux_timer.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Linux timers.
                      3:  *
                      4:  * Copyright (C) 1996 The University of Utah and the Computer Systems
                      5:  * Laboratory at the University of Utah (CSL)
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify
                      8:  * it under the terms of the GNU General Public License as published by
                      9:  * the Free Software Foundation; either version 2, or (at your option)
                     10:  * any later version.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful,
                     13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:  * GNU General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with this program; if not, write to the Free Software
                     19:  * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20:  *
                     21:  *      Author: Shantanu Goel, University of Utah CSL
                     22:  */
                     23: 
                     24: /*
                     25:  *  linux/kernel/sched.c
                     26:  *
                     27:  *  Copyright (C) 1991, 1992  Linus Torvalds
                     28:  */
                     29: 
                     30: #include <linux/sched.h>
                     31: #include <linux/timer.h>
                     32: #include <linux/interrupt.h>
                     33: #include <asm/system.h>
                     34: 
                     35: unsigned long volatile jiffies = 0;
                     36: 
                     37: /*
                     38:  * Mask of active timers.
                     39:  */
                     40: unsigned long timer_active = 0;
                     41: 
                     42: /*
                     43:  * List of timeout routines.
                     44:  */
                     45: struct timer_struct timer_table[32];
                     46: 
                     47: /*
                     48:  * The head for the timer-list has a "expires" field of MAX_UINT,
                     49:  * and the sorting routine counts on this..
                     50:  */
                     51: static struct timer_list timer_head =
                     52: {
                     53:   &timer_head, &timer_head, ~0, 0, NULL
                     54: };
                     55: 
                     56: #define SLOW_BUT_DEBUGGING_TIMERS 0
                     57: 
                     58: void
                     59: add_timer(struct timer_list *timer)
                     60: {
                     61:        unsigned long flags;
                     62:        struct timer_list *p;
                     63: 
                     64: #if SLOW_BUT_DEBUGGING_TIMERS
                     65:        if (timer->next || timer->prev) {
                     66:                printk("add_timer() called with non-zero list from %p\n",
                     67:                        __builtin_return_address(0));
                     68:                return;
                     69:        }
                     70: #endif
                     71:        p = &timer_head;
                     72:        save_flags(flags);
                     73:        cli();
                     74:        do {
                     75:                p = p->next;
                     76:        } while (timer->expires > p->expires);
                     77:        timer->next = p;
                     78:        timer->prev = p->prev;
                     79:        p->prev = timer;
                     80:        timer->prev->next = timer;
                     81:        restore_flags(flags);
                     82: }
                     83: 
                     84: int
                     85: del_timer(struct timer_list *timer)
                     86: {
                     87:        unsigned long flags;
                     88: #if SLOW_BUT_DEBUGGING_TIMERS
                     89:        struct timer_list * p;
                     90: 
                     91:        p = &timer_head;
                     92:        save_flags(flags);
                     93:        cli();
                     94:        while ((p = p->next) != &timer_head) {
                     95:                if (p == timer) {
                     96:                        timer->next->prev = timer->prev;
                     97:                        timer->prev->next = timer->next;
                     98:                        timer->next = timer->prev = NULL;
                     99:                        restore_flags(flags);
                    100:                        return 1;
                    101:                }
                    102:        }
                    103:        if (timer->next || timer->prev)
                    104:                printk("del_timer() called from %p with timer not initialized\n",
                    105:                        __builtin_return_address(0));
                    106:        restore_flags(flags);
                    107:        return 0;
                    108: #else
                    109:        struct timer_list * next;
                    110:        int ret = 0;
                    111:        save_flags(flags);
                    112:        cli();
                    113:        if ((next = timer->next) != NULL) {
                    114:                (next->prev = timer->prev)->next = next;
                    115:                timer->next = timer->prev = NULL;
                    116:                ret = 1;
                    117:        }
                    118:        restore_flags(flags);
                    119:        return ret;
                    120: #endif
                    121: }
                    122: 
                    123: /*
                    124:  * Timer software interrupt handler.
                    125:  */
                    126: void
                    127: timer_bh()
                    128: {
                    129:        unsigned long mask;
                    130:        struct timer_struct *tp;
                    131:        struct timer_list * timer;
                    132: 
                    133:        cli();
                    134:        while ((timer = timer_head.next) != &timer_head
                    135:               && timer->expires <= jiffies) {
                    136:                void (*fn)(unsigned long) = timer->function;
                    137:                unsigned long data = timer->data;
                    138: 
                    139:                timer->next->prev = timer->prev;
                    140:                timer->prev->next = timer->next;
                    141:                timer->next = timer->prev = NULL;
                    142:                sti();
                    143:                fn(data);
                    144:                cli();
                    145:        }
                    146:        sti();
                    147: 
                    148:        for (mask = 1, tp = timer_table; mask; tp++, mask <<= 1) {
                    149:                if (mask > timer_active)
                    150:                        break;
                    151:                if ((mask & timer_active)
                    152:                    && tp->expires > jiffies) {
                    153:                        timer_active &= ~mask;
                    154:                        (*tp->fn)();
                    155:                        sti();
                    156:                }
                    157:        }
                    158: }
                    159: 
                    160: int linux_timer_print = 0;
                    161: 
                    162: /*
                    163:  * Timer interrupt handler.
                    164:  */
                    165: void
                    166: linux_timer_intr()
                    167: {
                    168:        unsigned long mask;
                    169:        struct timer_struct *tp;
                    170:        extern int pic_mask[];
                    171: 
                    172:        jiffies++;
                    173: 
                    174:        for (mask = 1, tp = timer_table; mask; tp++, mask += mask) {
                    175:                if (mask > timer_active)
                    176:                        break;
                    177:                if (!(mask & timer_active))
                    178:                        continue;
                    179:                if (tp->expires > jiffies)
                    180:                        continue;
                    181:                mark_bh(TIMER_BH);
                    182:        }
                    183:        if (timer_head.next->expires <= jiffies)
                    184:                mark_bh(TIMER_BH);
                    185:        if (tq_timer != &tq_last)
                    186:                mark_bh(TQUEUE_BH);
                    187:        if (linux_timer_print)
                    188:                printf ("linux_timer_intr: pic_mask[0] %x\n", pic_mask[0]);
                    189: }
                    190: 

unix.superglobalmegacorp.com

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