Skip to content
Snippets Groups Projects
Select Git revision
  • f318369a6a0067d03b5079b9cb9502b661a5868b
  • master default
  • feature_scripts
  • develop
  • feature_without_logging
  • feature_opc_server
  • feature_seperate_apps
  • fix_raspi_cmake
  • ss19 protected
  • ss20
10 results

opc_server.cpp

Blame
  • 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);
    }