/*------------------------------------------------------------------------
 * chprio  --  change the scheduling priority of a process
 *------------------------------------------------------------------------
 */
SYSCALL
chprio(int pid, unsigned newprio)
{
	STATWORD ps;    
	int	oldprio;
	struct	pentry	*pptr;

	disable(ps);
	if (isbadpid(pid) ||
	    (pptr = &proctab[pid])->pstate == PRFREE) {
		restore(ps);
		return SYSERR;
	}
	oldprio = pptr->pprio;
	pptr->pprio = newprio;
	switch (pptr->pstate) {
	case PRREADY:
		insert( dequeue(pid), rdyhead, newprio);
	case PRCURR:
		resched();
	default:
		break;
	}
	restore(ps);
	return oldprio;
}
Exemple #2
0
/*------------------------------------------------------------------------
 * chprio  --  change the scheduling priority of a process
 *------------------------------------------------------------------------
 */
SYSCALL chprio(int pid, int newprio)
{
	STATWORD ps;    
	struct	pentry	*pptr;

	disable(ps);
	if (isbadpid(pid) || newprio<=0 ||
	    (pptr = &proctab[pid])->pstate == PRFREE) {
		restore(ps);
		return(SYSERR);
	}
	pptr->pprio = newprio;
	// If we are currently using the aging scheduler...
	if (getschedclass() == AGINGSCHED) {
		// We want to updated the queue priority now
		// (the linux-like scheduler will do that itself)
		q[pid].qkey = newprio;
		// If this priority is in the ready queue...
		if (isinqueue(pid, rdyhead)) {
			// Then we need to remove it from the queue
			dequeue(pid);
			// And put it back in so that the queue
			// will remain sorted
			insert(pid, rdyhead, newprio);
		}
	}
	restore(ps);
	return(newprio);
}
Exemple #3
0
/*------------------------------------------------------------------------
 *  suspend  --  suspend a process, placing it in hibernation
 *------------------------------------------------------------------------
 */
SYSCALL	suspend(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;		/* pointer to proc. tab. entry	*/
	int	prio;			/* priority returned		*/
	unsigned long stime = ctr1000;

	UPDATE_SCALL_FREQ(currpid, SCALL_SUSPEND);
	disable(ps);
	if (isbadpid(pid) || pid==NULLPROC ||
	 ((pptr= &proctab[pid])->pstate!=PRCURR && pptr->pstate!=PRREADY)) {
		restore(ps);
		UPDATE_SCALL_TIME(currpid, SCALL_SUSPEND, stime);
		return(SYSERR);
	}
	if (pptr->pstate == PRREADY) {
		pptr->pstate = PRSUSP;
		dequeue(pid);
	}
	else {
		pptr->pstate = PRSUSP;
		resched();
	}
	prio = pptr->pprio;
	restore(ps);
	UPDATE_SCALL_TIME(currpid, SCALL_SUSPEND, stime);
	return(prio);
}
Exemple #4
0
/*------------------------------------------------------------------------
 * unsleep  --  remove  process from the sleep queue prematurely
 *------------------------------------------------------------------------
 */
SYSCALL	unsleep(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;
	struct	qent	*qptr;
	int	remain;
	int	next;
	unsigned long stime = ctr1000;

	UPDATE_SCALL_FREQ(currpid, SCALL_UNSLEEP);
        disable(ps);
	if (isbadpid(pid) ||
	    ( (pptr = &proctab[pid])->pstate != PRSLEEP &&
	     pptr->pstate != PRTRECV) ) {
		restore(ps);
		UPDATE_SCALL_TIME(currpid, SCALL_UNSLEEP, stime);
		return(SYSERR);
	}
	qptr = &q[pid];
	remain = qptr->qkey;
	if ( (next=qptr->qnext) < NPROC)
		q[next].qkey += remain;
	dequeue(pid);
	if ( (next=q[clockq].qnext) < NPROC)
		sltop = (int *) & q[next].qkey;
	else
		slnempty = FALSE;
        restore(ps);
	UPDATE_SCALL_TIME(currpid, SCALL_UNSLEEP, stime);
	return(OK);
}
/*------------------------------------------------------------------------
 * chprio  --  change the scheduling priority of a process
 *------------------------------------------------------------------------
 */
SYSCALL chprio(int pid, int newprio)
{
        int start_time;
        int curridx = 1;
        if(syscall_trace_on == 1) {
                syscall_used[currpid] = 1;
                syscall_cnt[currpid][curridx]++;
                start_time = ctr1000;
        }
	STATWORD ps;    
	struct	pentry	*pptr;

	disable(ps);
	if (isbadpid(pid) || newprio<=0 ||
	    (pptr = &proctab[pid])->pstate == PRFREE) {
		restore(ps);
        	if(syscall_trace_on == 1) {
                	syscall_time[currpid][curridx] += ctr1000 - start_time;
        	}
		return(SYSERR);
	}
	pptr->pprio = newprio;
	restore(ps);

        if(syscall_trace_on == 1) {
                syscall_time[currpid][curridx] += ctr1000 - start_time;
        }
	return(newprio);
}
Exemple #6
0
/*------------------------------------------------------------------------
 * unsleep  --  remove  process from the sleep queue prematurely
 *------------------------------------------------------------------------
 */
SYSCALL	unsleep(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;
	struct	qent	*qptr;
	int	remain;
	int	next;

	disable(ps);
	if (isbadpid(pid) ||
	    ( (pptr = &proctab[pid])->pstate != PRSLEEP &&
	     pptr->pstate != PRTRECV) ) {
		restore(ps);
		return(SYSERR);
	}
	qptr = &q[pid];
	remain = qptr->qkey;
	if ( (next=qptr->qnext) < NPROC)
		q[next].qkey += remain;
	dequeue(pid);
	if ( (next=q[clockq].qnext) < NPROC)
		sltop = (int *) & q[next].qkey;
	else
		slnempty = FALSE;
	restore(ps);
	return(OK);
}
Exemple #7
0
/*------------------------------------------------------------------------
 *  ready  -  Make a process eligible for CPU service
 *------------------------------------------------------------------------
 */
status	ready(
	  pid32		pid		/* ID of process to make ready	*/
	)
{
	register struct procent *prptr;

	if (isbadpid(pid)) {
		return SYSERR;
	}

	/* Set process state to indicate ready and add to ready list */

	prptr = &proctab[pid];

	record_cpuqdata(pid);  /* call function to record process state time data */
							   /* (actual recording is controlled by EV_CPUQDATA env var and choice of scheduler) */
	prptr->prstate = PR_READY;
	readycount++;  /* increase the readylist count tracker */

	/* assigns a new adjusted priority based on the scheduler currently active */
	prptr->prprio = setprio(pid);

	insert(pid, readylist, prptr->prprio);
	resched();

	return OK;
}
Exemple #8
0
/*------------------------------------------------------------------------
 *  send  -  pass a message to a process and start recipient if waiting
 *------------------------------------------------------------------------
 */
syscall	send(
	  pid32		pid,		/* ID of recipient process	*/
	  umsg32	msg		/* contents of message		*/
	)
{
	intmask	mask;			/* saved interrupt mask		*/
	struct	procent *prptr;		/* ptr to process' table entry	*/

	mask = disable();
	if (isbadpid(pid)) {
		restore(mask);
		return SYSERR;
	}

	prptr = &proctab[pid];
	if ((prptr->prstate == PR_FREE) || prptr->prhasmsg) {
		restore(mask);
		return SYSERR;
	}
	prptr->prmsg = msg;		/* deliver message		*/
	prptr->prhasmsg = TRUE;		/* indicate message is waiting	*/

	/* If recipient waiting or in timed-wait make it ready */

	if (prptr->prstate == PR_RECV) {
		ready(pid, RESCHED_YES);
	} else if (prptr->prstate == PR_RECTIM) {
		unsleep(pid);
		ready(pid, RESCHED_YES);
	}
	restore(mask);		/* restore interrupts */
	return OK;
}
Exemple #9
0
/* Name: l_clear_pidmaps
 *
 * Desc: Clears all the entries corresponding to the pid in all available
 *       lid's pidmaps. This is usually called when a process is killed.
 *
 * Params: 
 *  pid     - process ID of the process whose pid-bit is to be cleared
 *
 * Returns: int
 *  OK      - on success
 *  SYSERR  - on error
 */ 
int
l_clear_pidmaps(int pid)
{
    int lid = EMPTY;
    STATWORD ps;

    disable(ps);
    DTRACE_START;

    if (isbadpid(pid)) {
        DTRACE("DBG$ %d %s> bad pid %d\n", currpid, __func__, pid);
        goto RETURN_ERROR;
    }

    /* Go thru all the locks and clear the pid-bit on all the pidmaps. */
    for (lid = 0; lid < NLOCKS; ++lid) {
        l_pidmap_oper(lid, pid, L_MAP_DELETE, L_MAP_CLR);
        l_pidmap_oper(lid, pid, L_MAP_RELEASE, L_MAP_CLR);
        l_pidmap_oper(lid, pid, L_MAP_LOG, L_MAP_CLR);
    }
    DTRACE_END;
    restore(ps);
    return OK;

RETURN_ERROR:
    DTRACE_END;
    restore(ps);
    return SYSERR;
}
Exemple #10
0
/*------------------------------------------------------------------------
 *  send  --  send a message to another process
 *------------------------------------------------------------------------
 */
SYSCALL	send(int pid, WORD msg)
{
	int start;
	if(activated == 1)
		start = ctr1000;
	STATWORD ps;    
	struct	pentry	*pptr;

	disable(ps);
	if (isbadpid(pid) || ( (pptr= &proctab[pid])->pstate == PRFREE)
	   || pptr->phasmsg != 0) {
		restore(ps);
		if(activated == 1)
		{
        	        Info[currpid][SEND].freq++;
	                Info[currpid][SEND].time += (ctr1000 - start);		
		}
		return(SYSERR);
	}
	pptr->pmsg = msg;
	pptr->phasmsg = TRUE;
	if (pptr->pstate == PRRECV)	/* if receiver waits, start it	*/
		ready(pid, RESCHYES);
	else if (pptr->pstate == PRTRECV) {
		unsleep(pid);
		ready(pid, RESCHYES);
	}
	restore(ps);
	if(activated == 1)
	{
		Info[currpid][SEND].freq++;
	        Info[currpid][SEND].time += (ctr1000 - start);
	}
	return(OK);
}
/*------------------------------------------------------------------------
 *  insert  -  Insert a process into a queue in descending key order
 *------------------------------------------------------------------------
 */
status	insert_real(
	  pid32		pid,		/* ID of process to insert	*/
	  qid16		q,		/* ID of queue to use		*/
	  double		key             /* Key for the inserted process	*/
	)
{
	int16	curr;			/* Runs through items in a queue*/
	int16	prev;			/* Holds previous node index	*/

	if (isbadqid(q) || isbadpid(pid)) {
		return SYSERR;
	}

	curr = firstid(q);
	while (queuetab[curr].real_qkey >= key) {
		curr = queuetab[curr].qnext;
	}

	/* Insert process between curr node and previous node */

	prev = queuetab[curr].qprev;	/* Get index of previous node	*/
	queuetab[pid].qnext = curr;
	queuetab[pid].qprev = prev;
	queuetab[pid].real_qkey = key;
	queuetab[prev].qnext = pid;
	queuetab[curr].qprev = pid;
	return OK;
}
Exemple #12
0
/*------------------------------------------------------------------------
 * chprio  --  change the scheduling priority of a process
 *------------------------------------------------------------------------
 */
SYSCALL chprio(int pid, int newprio)
{
    STATWORD ps;    
    struct  pentry  *pptr;

    disable(ps);
    if (isbadpid(pid) || newprio<=0 ||
        (pptr = &proctab[pid])->pstate == PRFREE) {
        restore(ps);
        return(SYSERR);
    }
    pptr->pprio = newprio;
    if(pptr -> pstate == PRREADY) {
        dequeue(pid);
        insert(pid, rdyhead, pptr -> pprio);
    }

    // Update the processes priority inheritance
    update_priority(pid);

    // If the process is waiting for a lock then update the lock
    if (pptr->pstate == PRLOCK) {
        // Update lppriomax for the lock (max priority of all waiting procs)
        update_lppriomax(LOCK_INDEX(pptr->plock));
        // Update pinh for all procs that hold this lock.
        update_pinh(LOCK_INDEX(pptr->plock));
    }

    restore(ps);
    return(newprio);
}
Exemple #13
0
/*******************************************************************************
 * Name:    remove_pgd
 *
 * Desc:    Removes the pgd of a proc and frees the frame. 
 *
 * Params:  
 *  pid     - pid whose pgd has to be removed
 *
 * Returns: Nothing. 
 ******************************************************************************/
void
remove_pgd(int pid)
{
    int pgd_fr_id = EMPTY;
    STATWORD ps;

    disable(ps);
    DTRACE_START;
    if (isbadpid(pid) || (PRFREE == P_GET_PSTATE(pid))) {
        DTRACE("DBG$ %d %s> bad pid %d or bad state %d\n",  \
                currpid, __func__, pid, P_GET_PSTATE(pid));
        goto RESTORE_AND_RETURN;
    }

    /* Each process has a pdir whose base addr is stored in pgdir field of 
     * the PCB. This is hosted on a frame and we need to free that frame as the
     * process is being killed.
     */
    pgd_fr_id = FR_PA_TO_ID(P_GET_PDIR(pid));
    free_frm(pgd_fr_id);

RESTORE_AND_RETURN:
    DTRACE_END;
    restore(ps);
    return;
}
Exemple #14
0
/*------------------------------------------------------------------------
 *  insertd  -  Insert a process in delta list using delay as the key
 *------------------------------------------------------------------------
 */
status	insertd(			/* assumes interrupts disabled	*/
	  pid32		pid,		/* ID of process to insert	*/
	  qid16		q,		/* ID of queue to use		*/
	  int32		key		/* delay from "now" (in ms.)	*/
	)
{
	int	next;			/* runs through the delta list	*/
	int	prev;			/* follows next through the list*/

	if (isbadqid(q) || isbadpid(pid)) {
		return SYSERR;
	}

	prev = queuehead(q);
	next = queuetab[queuehead(q)].qnext;
	while ((next != queuetail(q)) && (queuetab[next].qkey <= key)) {
		key -= queuetab[next].qkey;
		prev = next;
		next = queuetab[next].qnext;
	}

	/* Insert new node between prev and next nodes */

	queuetab[pid].qnext = next;
	queuetab[pid].qprev = prev;
	queuetab[pid].qkey = key;
	queuetab[prev].qnext = pid;
	queuetab[next].qprev = pid;
	if (next != queuetail(q)) {
		queuetab[next].qkey -= key;
	}

	return OK;
}
Exemple #15
0
/*------------------------------------------------------------------------
 *  ready  -  Make a process eligible for CPU service
 *------------------------------------------------------------------------
 */
status	ready(
	  pid32		pid,		/* ID of process to make ready	*/
	  bool8		resch		/* reschedule afterward?	*/
	)
{
	register struct procent *prptr;

	int rrChecker = 1 ; 	/* variable to check if round robin should run */
	
	if (isbadpid(pid)) {
		return(SYSERR);
	}

	/* Set process state to indicate ready and add to ready list */
	
	prptr = &proctab[pid];
	prptr->prstate = PR_READY;
	if (rrChecker != 1) {
		insert(pid, readylist, prptr->prprio);
	} else if (rrChecker == ROUND_ROBIN) {
		insert(pid, readylist, prptr->prprio);
	}

	if (resch == RESCHED_YES) {
		resched();
	}
	return OK;
}
Exemple #16
0
//------------------------------------------------------------------------
//  rarp_in  -  handle RARP packet coming in from Ethernet network
//------------------------------------------------------------------------
int
rarp_in(struct epacket *packet, int dev)
{
	int ps;
	int pid;
	int ret;
	struct arppak *apacptr;
	struct etblk *etptr;

	apacptr = (struct arppak *)packet->ep_data;
	ret = SYSERR;
	if (net2hs(apacptr->ar_op) == AR_RRLY) {
		etptr = (struct etblk *)devtab[dev].iobuf;
		if (memcmp(apacptr->ar_tha, etptr->etpaddr, EPADLEN) == 0) {
			memmove(Net.myaddr, apacptr->ar_tpa, IPLEN);
			netnum(Net.mynet, Net.myaddr);
			ps = disable();
			Net.mavalid = TRUE;
			pid = Arp.rarppid;
			if (!isbadpid(pid)) {
				Arp.rarppid = BADPID;
				send(pid, OK);
			}
			restore(ps);
		}
		ret = OK;
	}
	freebuf(packet);

	return ret;
}
Exemple #17
0
/*------------------------------------------------------------------------
 *  ready  -  Make a process eligible for CPU service
 *------------------------------------------------------------------------
 */
status	ready(
	  pid32		pid,		/* ID of process to make ready	*/
	  bool8		resch		/* reschedule afterward?	*/
	)
{
	register struct procent *prptr;

	if (isbadpid(pid)) {
		return(SYSERR);
	}

	/* Set process state to indicate ready and add to ready list */

	prptr = &proctab[pid];
	prptr->prstate = PR_READY;

	if (ROUND_ROBIN == 1)
	{
		enqueue(pid, readylist);
	}
	else
	{
		insert(pid, readylist, prptr->prprio);
	}

	if (resch == RESCHED_YES) {
		resched();
	}
	return OK;
}
Exemple #18
0
/*------------------------------------------------------------------------
 * chprio  --  change the scheduling priority of a process
 *------------------------------------------------------------------------
 */
SYSCALL chprio(int pid, int newprio)
{
	unsigned long timer_start_value=ctr1000;
	if(start_summary==1)
	{
		summary_tab[currpid][1].syscall_name="sys_chprio";
		summary_tab[currpid][1].frequency+=1;
	}
	
	STATWORD ps;    
	struct	pentry	*pptr;

	disable(ps);
	if (isbadpid(pid) || newprio<=0 ||
	    (pptr = &proctab[pid])->pstate == PRFREE) {
		restore(ps);
		summary_tab[currpid][1].time+=ctr1000-timer_start_value;
		return(SYSERR);
	}
	pptr->pprio = newprio;
	restore(ps);
	
	
	summary_tab[currpid][1].time+=ctr1000-timer_start_value;	
	return(newprio);
}
Exemple #19
0
/**
 * Remove a process from anywhere in a queue
 * @param  pid process ID to remove
 * @return process id of removed process
 */
short remove(short pid)
{
	if (isbadpid(pid)) { return SYSERR; }

	queuetab[queuetab[pid].prev].next = queuetab[pid].next;
	queuetab[queuetab[pid].next].prev = queuetab[pid].prev;
	return pid;
}
syscall	sendb(
	  pid32		pid,		/* ID of recipient process	*/
	  umsg32	msg		/* contents of message		*/
	)
{
	intmask	mask;			/* saved interrupt mask		*/
	struct	procent *prptr;		/* ptr to process' table entry	*/

	mask = disable();
	if (isbadpid(pid)) {
		restore(mask);
		return SYSERR;
	}

	prptr = &proctab[pid];
	if (prptr->prstate == PR_FREE) {
		restore(mask);
		return SYSERR;
	}

		/* another pointer to process table */



    /* CONDITIONS:
     * if process has a message
     * - sendflag = true
     * - state changes to pr send
     * else
     * - state of prhasmsg is true
     */

	if( prptr -> prhasmsg){
		struct procent *sendMessage;
		sendMessage = &proctab[currpid];

		sendMessage -> prstate	= PR_SND; 	/* setting the message state to PR_SEND */
		sendMessage -> sndmsg  	= msg;
		sendMessage -> sndflag 	= TRUE;		/* message to send */
	
		enqueue(currpid, prptr -> messagesQueue);
		resched();

	}

	prptr->prmsg = msg;		/* deliver message		*/
	prptr->prhasmsg = TRUE;		/* indicate message is waiting	*/

	if (prptr->prstate == PR_RECV) { ready(pid, RESCHED_YES );
	} 
    else if (prptr->prstate == PR_RECTIM) {
		unsleep(pid);
		ready(pid, RESCHED_YES);
	}
	restore(mask);		/* restore interrupts */
	return OK;
}
Exemple #21
0
/*------------------------------------------------------------------------
 * kill  --  kill a process and remove it from the system
 *------------------------------------------------------------------------
 */
SYSCALL kill(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;		/* points to proc. table for pid*/
	int	dev;
	inversion(pid);
	disable(ps);
	if (isbadpid(pid) || (pptr= &proctab[pid])->pstate==PRFREE) {
		restore(ps);
		return(SYSERR);
	}
	if (--numproc == 0)
		xdone();

	dev = pptr->pdevs[0];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->pdevs[1];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->ppagedev;
	if (! isbaddev(dev) )
		close(dev);
	
	send(pptr->pnxtkin, pid);

	freestk(pptr->pbase, pptr->pstklen);
	switch (pptr->pstate) {

	case PRCURR:	pptr->pstate = PRFREE;	/* suicide */
			resched();

	case PRWAIT:	semaph[pptr->psem].semcnt++;
			int i;
			for(i=0;i<NLOCKS;i++)
			{
				if(proctab[pid].holding_lock[i].type != -1)
				{
					lockarr[i].lockcnt--;
					lockarr[i].process_lock[pid]=-1;
					if(proctab[pid].holding_lock[i].type==READ)
						lockarr[i].read_count--;
				}
			}

	case PRREADY:	dequeue(pid);
			pptr->pstate = PRFREE;
			break;

	case PRSLEEP:
	case PRTRECV:	unsleep(pid);
						/* fall through	*/
	default:	pptr->pstate = PRFREE;
	}
	restore(ps);
	return(OK);
}
Exemple #22
0
/*------------------------------------------------------------------------
 * kill  --  kill a process and remove it from the system
 *------------------------------------------------------------------------
 */
SYSCALL kill(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;		/* points to proc. table for pid*/
	int	dev;
	int i;
	disable(ps);
	if (isbadpid(pid) || (pptr= &proctab[pid])->pstate==PRFREE) {
		restore(ps);
		return(SYSERR);
	}

#ifdef ENABLE_LOCKS
  for (i = 0; i < NLOCKS; i++){
    if (locktab[i].procs[pid].lstate == LOCKED)
      release_lock(CREATELDESC(i, locktab[i].procs[pid].lage), pid);
    locktab[i].procs[pid].lstate = UNLOCKED;
  }
#endif

  if (--numproc == 0)
		xdone();

	dev = pptr->pdevs[0];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->pdevs[1];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->ppagedev;
	if (! isbaddev(dev) )
		close(dev);
	
	send(pptr->pnxtkin, pid);

	freestk(pptr->pbase, pptr->pstklen);
	switch (pptr->pstate) {

	case PRCURR:	pptr->pstate = PRFREE;	/* suicide */
			resched();

	case PRWAIT:	semaph[pptr->psem].semcnt++;

  case PRLOCK:
	case PRREADY:	dequeue(pid);
			pptr->pstate = PRFREE;
			break;

	case PRSLEEP:
	case PRTRECV:	unsleep(pid);
						/* fall through	*/
	default:	pptr->pstate = PRFREE;
	}
	restore(ps);
	return(OK);
}
Exemple #23
0
/*------------------------------------------------------------------------
 * kill  --  kill a process and remove it from the system
 *------------------------------------------------------------------------
 */
SYSCALL kill(int pid)
{
extern int flag;
if(flag==1){	
	extern int freq[6][NPROC];
        freq[2][currpid]++;
	kprintf("########################################\n");
        kprintf("System Call(2) 'kill' being called by \"%s\" (pid=%d)\n", proctab[currpid].pname, currpid);
        kprintf("########################################\n");
}

	STATWORD ps;    
	struct	pentry	*pptr;		/* points to proc. table for pid*/
	int	dev;

	disable(ps);
	if (isbadpid(pid) || (pptr= &proctab[pid])->pstate==PRFREE) {
		restore(ps);
		return(SYSERR);
	}
	if (--numproc == 0)
		xdone();

	dev = pptr->pdevs[0];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->pdevs[1];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->ppagedev;
	if (! isbaddev(dev) )
		close(dev);
	
	send(pptr->pnxtkin, pid);

	freestk(pptr->pbase, pptr->pstklen);
	switch (pptr->pstate) {

	case PRCURR:	pptr->pstate = PRFREE;	/* suicide */
			resched();

	case PRWAIT:	semaph[pptr->psem].semcnt++;

	case PRREADY:	dequeue(pid);
			pptr->pstate = PRFREE;
			break;

	case PRSLEEP:
	case PRTRECV:	unsleep(pid);
						/* fall through	*/
	default:	pptr->pstate = PRFREE;
	}
	restore(ps);
	return(OK);
}
Exemple #24
0
/*------------------------------------------------------------------------
 *  kill  -  Kill a process and remove it from the system
 *------------------------------------------------------------------------
 */
syscall	kill(
	  pid32		pid		/* ID of process to kill	*/
	)
{
	intmask	mask;			/* Saved interrupt mask		*/
	struct	procent *prptr;		/* Ptr to process's table entry	*/
	int32	i;			/* Index into descriptors	*/

	mask = disable();
	if (isbadpid(pid) || (pid == NULLPROC)
	    || ((prptr = &proctab[pid])->prstate) == PR_FREE) {
		restore(mask);
		return SYSERR;
	}

	if (prptr->prcleanup != NULL){
		prptr->prcleanup();
	}

	if (--prcount <= 1) {		/* Last user process completes	*/
		xdone();
	}

	send(prptr->prparent, pid);
	for (i=0; i<3; i++) {
		close(prptr->prdesc[i]);
	}
	freestk(prptr->prstkbase, prptr->prstklen);

	switch (prptr->prstate) {
	case PR_CURR:
		prptr->prstate = PR_FREE;	/* Suicide */
		resched();

	case PR_SLEEP:
	case PR_RECTIM:
		unsleep(pid);
		prptr->prstate = PR_FREE;
		break;

	case PR_WAIT:
		semtab[prptr->prsem].scount++;
		/* Fall through */

	case PR_READY:
		getitem(pid);		/* Remove from queue */
		/* Fall through */

	default:
		prptr->prstate = PR_FREE;
	}

	restore(mask);
	return OK;
}
Exemple #25
0
/*------------------------------------------------------------------------
 *  setdev  -  set the two device entries in the process table entry
 *------------------------------------------------------------------------
 */
SYSCALL	setdev(int pid, int dev1, int dev2)
{
	short	*nxtdev;

	if (isbadpid(pid))
		return(SYSERR);
	nxtdev = (short *) proctab[pid].pdevs;
	*nxtdev++ = dev1;
	*nxtdev = dev2;
	return(OK);
}
Exemple #26
0
/*------------------------------------------------------------------------
 * kill  --  kill a process and remove it from the system
 *------------------------------------------------------------------------
 */
SYSCALL kill(int pid)
{
	STATWORD ps;    
	struct	pentry	*pptr;		/* points to proc. table for pid*/
	int	dev, pdbr;

	disable(ps);
	if (isbadpid(pid) || (pptr= &proctab[pid])->pstate==PRFREE) {
		restore(ps);
		return(SYSERR);
	}
	if (--numproc == 0)
		xdone();

	dev = pptr->pdevs[0];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->pdevs[1];
	if (! isbaddev(dev) )
		close(dev);
	dev = pptr->ppagedev;
	if (! isbaddev(dev) )
		close(dev);
	
	send(pptr->pnxtkin, pid);
	
	
	proc_dies_clean_bs(pid);
	pdbr = proctab[pid].pdbr;
	//kprintf("\nFreeing frame in kill %d", (pdbr-FRAME0));
	free_frm((pdbr-FRAME0));
	
	
	
	freestk(pptr->pbase, pptr->pstklen);
	switch (pptr->pstate) {

	case PRCURR:	pptr->pstate = PRFREE;	/* suicide */
			resched();

	case PRWAIT:	semaph[pptr->psem].semcnt++;

	case PRREADY:	dequeue(pid);
			pptr->pstate = PRFREE;
			break;

	case PRSLEEP:
	case PRTRECV:	unsleep(pid);
						/* fall through	*/
	default:	pptr->pstate = PRFREE;
	}
	restore(ps);
	return(OK);
}
Exemple #27
0
/*------------------------------------------------------------------------
 * pipconnect  --  Connect a pipe with a reader and writer process
 *------------------------------------------------------------------------
 */
syscall pipconnect(pipid32 pip, pid32 writer, pid32 reader)
{
	intmask mask;			/* saved interrupt mask		*/
        //kprintf("inside pipconnect \n\r");	
	mask = disable();
	if (isbadpip(pip) || isbadpid(writer) || isbadpid(reader) || (reader == writer) ) {
		restore(mask);
		return SYSERR;
	}
        if ((piptab[pip].pipstate == PIPE_CONNECTED) || (piptab[pip].pipstate == PIPE_FREE)) {
		restore(mask);
		return SYSERR;
	}

        piptab[pip].pipstate = PIPE_CONNECTED;
        piptab[pip].rdend = reader;
        piptab[pip].wrtend = writer;
        // create process table entry for pipe state
        //pipedetails(pip);
	restore(mask);
	return OK;
}
Exemple #28
0
/*------------------------------------------------------------------------
 * ready  --  make a process eligible for CPU service
 *------------------------------------------------------------------------
 */
int ready(int pid, int resch)
{
	register struct	pentry	*pptr;

	if (isbadpid(pid))
		return(SYSERR);
	pptr = &proctab[pid];
	pptr->pstate = PRREADY;
	insert(pid,rdyhead,pptr->pgoodness);
	if (resch)
		resched();
	return(OK);
}
Exemple #29
0
/*------------------------------------------------------------------------
 * getprio -- return the scheduling priority of a given process
 *------------------------------------------------------------------------
 */
SYSCALL getprio(int pid)
{
	struct	pentry	*pptr;
	sigset_t ps;

	disable(ps);
	if (isbadpid(pid) || (pptr = &proctab[pid])->pstate == PRFREE) {
		restore(ps);
		return(SYSERR);
	}
	restore(ps);
	return(pptr->pprio);
}
Exemple #30
0
/*------------------------------------------------------------------------
 *  myenqueue  -  Insert a process at the tail of a queue
 *------------------------------------------------------------------------
 */
pid32	myenqueue(
	  pid32		pid,		/* ID of process to insert	*/
	  qid16		q		/* ID of queue to use		*/
	)
{
	int	tail, prev;		/* Tail & previous node indexes	*/

	if (myisbadqid(q) || isbadpid(pid)) {
		if(myisbadqid(q))
			kprintf("BAD QID \n");
		if(isbadpid(pid))
			kprintf("BAD PID \n");
		return SYSERR;
	}

	tail = myqueuetail(q);
	prev = myqueuetab[tail].qprev;

	myqueuetab[pid].qnext  = tail;	/* Insert just before tail node	*/
	myqueuetab[pid].qprev  = prev;
	myqueuetab[prev].qnext = pid;
	myqueuetab[tail].qprev = pid;
	return pid;
}