Annotation of Gnu-Mach/i386/i386at/gpl/linux/linux_sched.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Linux scheduling support.
        !             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 <sys/types.h>
        !            31: 
        !            32: #include <mach/boolean.h>
        !            33: 
        !            34: #include <kern/thread.h>
        !            35: #include <kern/sched_prim.h>
        !            36: 
        !            37: #include <i386at/gpl/linux/linux_emul.h>
        !            38: 
        !            39: #define MACH_INCLUDE
        !            40: #include <linux/sched.h>
        !            41: #include <linux/fs.h>
        !            42: #include <linux/blkdev.h>
        !            43: 
        !            44: #include <asm/system.h>
        !            45: 
        !            46: struct tq_struct tq_last =
        !            47: {
        !            48:   &tq_last, 0, 0, 0
        !            49: };
        !            50: 
        !            51: DECLARE_TASK_QUEUE(tq_timer);
        !            52: 
        !            53: static struct wait_queue **auto_config_queue;
        !            54: 
        !            55: void
        !            56: tqueue_bh (void *unused)
        !            57: {
        !            58:   run_task_queue(&tq_timer);
        !            59: }
        !            60: 
        !            61: void
        !            62: add_wait_queue (struct wait_queue **q, struct wait_queue *wait)
        !            63: {
        !            64:   unsigned long flags;
        !            65: 
        !            66:   if (! linux_auto_config)
        !            67:     {
        !            68:       save_flags (flags);
        !            69:       cli ();
        !            70:       assert_wait ((event_t) q, FALSE);
        !            71:       restore_flags (flags);
        !            72:       return;
        !            73:     }
        !            74: 
        !            75:   if (auto_config_queue)
        !            76:     printf ("add_wait_queue: queue not empty\n");
        !            77:   auto_config_queue = q;
        !            78: }
        !            79: 
        !            80: void
        !            81: remove_wait_queue (struct wait_queue **q, struct wait_queue *wait)
        !            82: {
        !            83:   unsigned long flags;
        !            84: 
        !            85:   if (! linux_auto_config)
        !            86:     {
        !            87:       save_flags (flags);
        !            88:       thread_wakeup ((event_t) q);
        !            89:       restore_flags (flags);
        !            90:       return;
        !            91:     }
        !            92: 
        !            93:   auto_config_queue = NULL;
        !            94: }
        !            95: 
        !            96: void
        !            97: __down (struct semaphore *sem)
        !            98: {
        !            99:   int s;
        !           100:   unsigned long flags;
        !           101: 
        !           102:   if (! linux_auto_config)
        !           103:     {
        !           104:       save_flags (flags);
        !           105:       s = splhigh ();
        !           106:       while (sem->count <= 0)
        !           107:        {
        !           108:          assert_wait ((event_t) &sem->wait, FALSE);
        !           109:          splx (s);
        !           110:          thread_block (0);
        !           111:          s = splhigh ();
        !           112:        }
        !           113:       splx (s);
        !           114:       restore_flags (flags);
        !           115:       return;
        !           116:     }
        !           117: 
        !           118:   while (sem->count <= 0)
        !           119:     barrier ();
        !           120: }
        !           121: 
        !           122: void
        !           123: __sleep_on (struct wait_queue **q, int interruptible)
        !           124: {
        !           125:   unsigned long flags;
        !           126: 
        !           127:   if (! q)
        !           128:     return;
        !           129:   save_flags (flags);
        !           130:   if (! linux_auto_config)
        !           131:     {
        !           132:       assert_wait ((event_t) q, interruptible);
        !           133:       sti ();
        !           134:       thread_block (0);
        !           135:       restore_flags (flags);
        !           136:       return;
        !           137:     }
        !           138: 
        !           139:   add_wait_queue (q, NULL);
        !           140:   sti ();
        !           141:   while (auto_config_queue)
        !           142:     barrier ();
        !           143:   restore_flags (flags);
        !           144: }
        !           145: 
        !           146: void
        !           147: sleep_on (struct wait_queue **q)
        !           148: {
        !           149:   __sleep_on (q, FALSE);
        !           150: }
        !           151: 
        !           152: void
        !           153: interruptible_sleep_on (struct wait_queue **q)
        !           154: {
        !           155:   __sleep_on (q, TRUE);
        !           156: }
        !           157: 
        !           158: void
        !           159: wake_up (struct wait_queue **q)
        !           160: {
        !           161:   unsigned long flags;
        !           162: 
        !           163:   if (! linux_auto_config)
        !           164:     {
        !           165:       if (q != &wait_for_request)
        !           166:        {
        !           167:          save_flags (flags);
        !           168:          thread_wakeup ((event_t) q);
        !           169:          restore_flags (flags);
        !           170:        }
        !           171:       return;
        !           172:     }
        !           173: 
        !           174:   if (auto_config_queue == q)
        !           175:     auto_config_queue = NULL;
        !           176: }
        !           177: 
        !           178: void
        !           179: __wait_on_buffer (struct buffer_head *bh)
        !           180: {
        !           181:   unsigned long flags;
        !           182: 
        !           183:   save_flags (flags);
        !           184:   if (! linux_auto_config)
        !           185:     {
        !           186:       while (1)
        !           187:        {
        !           188:          cli ();
        !           189:          if (! buffer_locked (bh))
        !           190:            break;
        !           191:          bh->b_wait = (struct wait_queue *) 1;
        !           192:          assert_wait ((event_t) bh, FALSE);
        !           193:          sti ();
        !           194:          thread_block (0);
        !           195:        }
        !           196:       restore_flags (flags);
        !           197:       return;
        !           198:     }
        !           199: 
        !           200:   sti ();
        !           201:   while (buffer_locked (bh))
        !           202:     barrier ();
        !           203:   restore_flags (flags);
        !           204: }
        !           205: 
        !           206: void
        !           207: unlock_buffer (struct buffer_head *bh)
        !           208: {
        !           209:   unsigned long flags;
        !           210: 
        !           211:   save_flags (flags);
        !           212:   cli ();
        !           213:   clear_bit (BH_Lock, &bh->b_state);
        !           214:   if (bh->b_wait && ! linux_auto_config)
        !           215:     {
        !           216:       bh->b_wait = NULL;
        !           217:       thread_wakeup ((event_t) bh);
        !           218:     }
        !           219:   restore_flags (flags);
        !           220: }
        !           221: 
        !           222: void
        !           223: schedule ()
        !           224: {
        !           225:   if (! linux_auto_config)
        !           226:     thread_block (0);
        !           227: }
        !           228: 
        !           229: void
        !           230: cdrom_sleep (int t)
        !           231: {
        !           232:   int xxx;
        !           233: 
        !           234:   assert_wait ((event_t) &xxx, TRUE);
        !           235:   thread_set_timeout (t);
        !           236:   thread_block (0);
        !           237: }

unix.superglobalmegacorp.com

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