126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* This file contains the main program of the SCHED scheduler. It will sit idle
 | 
						|
 * until asked, by PM, to take over scheduling a particular process.
 | 
						|
 */
 | 
						|
 | 
						|
/* The _MAIN def indicates that we want the schedproc structs to be created
 | 
						|
 * here. Used from within schedproc.h */
 | 
						|
#define _MAIN
 | 
						|
 | 
						|
#include "sched.h"
 | 
						|
#include "schedproc.h"
 | 
						|
 | 
						|
/* Declare some local functions. */
 | 
						|
static void reply(endpoint_t whom, message *m_ptr);
 | 
						|
static void sef_local_startup(void);
 | 
						|
 | 
						|
struct machine machine;		/* machine info */
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				main					     *
 | 
						|
 *===========================================================================*/
 | 
						|
int main(void)
 | 
						|
{
 | 
						|
	/* Main routine of the scheduler. */
 | 
						|
	message m_in;	/* the incoming message itself is kept here. */
 | 
						|
	int call_nr;	/* system call number */
 | 
						|
	int who_e;	/* caller's endpoint */
 | 
						|
	int result;	/* result to system call */
 | 
						|
	int rv;
 | 
						|
	int s;
 | 
						|
 | 
						|
	/* SEF local startup. */
 | 
						|
	sef_local_startup();
 | 
						|
 | 
						|
	if (OK != (s=sys_getmachine(&machine)))
 | 
						|
		panic("couldn't get machine info: %d", s);
 | 
						|
	/* Initialize scheduling timers, used for running balance_queues */
 | 
						|
	init_scheduling();
 | 
						|
 | 
						|
	/* This is SCHED's main loop - get work and do it, forever and forever. */
 | 
						|
	while (TRUE) {
 | 
						|
		int ipc_status;
 | 
						|
 | 
						|
		/* Wait for the next message and extract useful information from it. */
 | 
						|
		if (sef_receive_status(ANY, &m_in, &ipc_status) != OK)
 | 
						|
			panic("SCHED sef_receive error");
 | 
						|
		who_e = m_in.m_source;	/* who sent the message */
 | 
						|
		call_nr = m_in.m_type;	/* system call number */
 | 
						|
 | 
						|
		/* Check for system notifications first. Special cases. */
 | 
						|
		if (is_ipc_notify(ipc_status)) {
 | 
						|
			switch(who_e) {
 | 
						|
				case CLOCK:
 | 
						|
					expire_timers(m_in.NOTIFY_TIMESTAMP);
 | 
						|
					continue;	/* don't reply */
 | 
						|
				default :
 | 
						|
					result = ENOSYS;
 | 
						|
			}
 | 
						|
 | 
						|
			goto sendreply;
 | 
						|
		}
 | 
						|
 | 
						|
		switch(call_nr) {
 | 
						|
		case SCHEDULING_INHERIT:
 | 
						|
		case SCHEDULING_START:
 | 
						|
			result = do_start_scheduling(&m_in);
 | 
						|
			break;
 | 
						|
		case SCHEDULING_STOP:
 | 
						|
			result = do_stop_scheduling(&m_in);
 | 
						|
			break;
 | 
						|
		case SCHEDULING_SET_NICE:
 | 
						|
			result = do_nice(&m_in);
 | 
						|
			break;
 | 
						|
		case SCHEDULING_NO_QUANTUM:
 | 
						|
			/* This message was sent from the kernel, don't reply */
 | 
						|
			if (IPC_STATUS_FLAGS_TEST(ipc_status,
 | 
						|
				IPC_FLG_MSG_FROM_KERNEL)) {
 | 
						|
				if ((rv = do_noquantum(&m_in)) != (OK)) {
 | 
						|
					printf("SCHED: Warning, do_noquantum "
 | 
						|
						"failed with %d\n", rv);
 | 
						|
				}
 | 
						|
				continue; /* Don't reply */
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				printf("SCHED: process %d faked "
 | 
						|
					"SCHEDULING_NO_QUANTUM message!\n",
 | 
						|
						who_e);
 | 
						|
				result = EPERM;
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			result = no_sys(who_e, call_nr);
 | 
						|
		}
 | 
						|
 | 
						|
sendreply:
 | 
						|
		/* Send reply. */
 | 
						|
		if (result != SUSPEND) {
 | 
						|
			m_in.m_type = result;  		/* build reply message */
 | 
						|
			reply(who_e, &m_in);		/* send it away */
 | 
						|
		}
 | 
						|
 	}
 | 
						|
	return(OK);
 | 
						|
}
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				reply					     *
 | 
						|
 *===========================================================================*/
 | 
						|
static void reply(endpoint_t who_e, message *m_ptr)
 | 
						|
{
 | 
						|
	int s = send(who_e, m_ptr);    /* send the message */
 | 
						|
	if (OK != s)
 | 
						|
		printf("SCHED: unable to send reply to %d: %d\n", who_e, s);
 | 
						|
}
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *			       sef_local_startup			     *
 | 
						|
 *===========================================================================*/
 | 
						|
static void sef_local_startup(void)
 | 
						|
{
 | 
						|
	/* No init callbacks for now. */
 | 
						|
	/* No live update support for now. */
 | 
						|
	/* No signal callbacks for now. */
 | 
						|
 | 
						|
	/* Let SEF perform startup. */
 | 
						|
	sef_startup();
 | 
						|
}
 |