Skip to content
Snippets Groups Projects
Select Git revision
  • d48edcd327479e7a230e1a34684f251a5cd47337
  • master default protected
  • 2018ws
  • 2017ws
  • 2016ws
5 results

cube-5.c

Blame
  • Forked from Peter Gerwinski / hp
    Source project has a limited visibility.
    linux-scheduler-0.c 1.26 KiB
    /*
     *  'schedule()' is the scheduler function. This is GOOD CODE! There
     * probably won't be any reason to change this, as it should work well
     * in all circumstances (ie gives IO-bound processes good response etc).
     * The one thing you might take a look at is the signal-handler code here.
     *
     *   NOTE!!  Task 0 is the 'idle' task, which gets called when no other
     * tasks can run. It can not be killed, and it cannot sleep. The 'state'
     * information in task[0] is never used.
     */
    void schedule(void)
    {
    	int i,next,c;
    	struct task_struct ** p;
    
    /* check alarm, wake up any interruptible tasks that have got a signal */
    
    	for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    		if (*p) {
    			if ((*p)->alarm && (*p)->alarm < jiffies) {
    					(*p)->signal |= (1<<(SIGALRM-1));
    					(*p)->alarm = 0;
    				}
    			if ((*p)->signal && (*p)->state==TASK_INTERRUPTIBLE)
    				(*p)->state=TASK_RUNNING;
    		}
    
    /* this is the scheduler proper: */
    
    	while (1) {
    		c = -1;
    		next = 0;
    		i = NR_TASKS;
    		p = &task[NR_TASKS];
    		while (--i) {
    			if (!*--p)
    				continue;
    			if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
    				c = (*p)->counter, next = i;
    		}
    		if (c) break;
    		for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    			if (*p)
    				(*p)->counter = ((*p)->counter >> 1) +
    						(*p)->priority;
    	}
    	switch_to(next);
    }