New system call added to PM: getprocnr(int *proc_nr) (like getpid);
Minor update to scheduling code (unready().
This commit is contained in:
		
							parent
							
								
									307c825515
								
							
						
					
					
						commit
						d0a5a5d007
					
				| @ -575,7 +575,7 @@ register struct proc *rp;	/* this process is now runnable */ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* Run 'rp' next if it has a higher priority than 'proc_ptr'. This actually
 |   /* Run 'rp' next if it has a higher priority than 'proc_ptr'. This actually
 | ||||||
|    * should be done via pick_proc(), but mini_send() and mini_rec() rely |    * should be done via pick_proc(), but the message passing functions rely | ||||||
|    * on this side-effect. |    * on this side-effect. | ||||||
|    */ |    */ | ||||||
|   if (rp->p_priority < proc_ptr->p_priority) proc_ptr = rp; |   if (rp->p_priority < proc_ptr->p_priority) proc_ptr = rp; | ||||||
| @ -590,8 +590,8 @@ register struct proc *rp;	/* this process is no longer runnable */ | |||||||
| /* A process has blocked. See ready for a description of the queues. */ | /* A process has blocked. See ready for a description of the queues. */ | ||||||
| 
 | 
 | ||||||
|   register struct proc *xp; |   register struct proc *xp; | ||||||
|   register struct proc **qtail; /* queue's rdy_tail */ |   register struct proc **qtail; 	/* queue's rdy_tail */ | ||||||
|   int q = rp->p_priority;	/* queue to use */ |   int q = rp->p_priority;		/* queue to use */ | ||||||
| 
 | 
 | ||||||
|   /* Side-effect for tasks: check if the task's stack still is ok? */ |   /* Side-effect for tasks: check if the task's stack still is ok? */ | ||||||
|   if (istaskp(rp)) { 				 |   if (istaskp(rp)) { 				 | ||||||
| @ -600,24 +600,34 @@ register struct proc *rp;	/* this process is no longer runnable */ | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* Now make sure that the process is not in its ready queue. Remove the 
 |   /* Now make sure that the process is not in its ready queue. Remove the 
 | ||||||
|    * process if it is found. The easy part is to check the front of the queue.  |    * process if it is found. A process can be made unready even if it is not  | ||||||
|  |    * running by being sent a signal that kills it. | ||||||
|    */ |    */ | ||||||
|   if ( (xp = rdy_head[q]) == NIL_PROC) return; |   if ( (xp = rdy_head[q]) != NIL_PROC) {	/* ready queue is empty */ | ||||||
|   if (xp == rp) { |       if (xp == rp) {				/* check head of queue */ | ||||||
| 	rdy_head[q] = xp->p_nextready;		/* remove head of queue */ |           rdy_head[q] = xp->p_nextready;	/* new head of queue */ | ||||||
| 	if (rp == proc_ptr) 			/* current process removed */ |           if (rp == proc_ptr) 			/* current process removed */ | ||||||
| 		pick_proc();			/* pick new process to run */ |               pick_proc();			/* pick new process to run */ | ||||||
| 	return; |       }  | ||||||
|  |       else {					/* check body of queue */ | ||||||
|  |           while (xp->p_nextready != rp)		/* stop if process is next */ | ||||||
|  |               if ( (xp = xp->p_nextready) == NIL_PROC)  | ||||||
|  |                   return;	 | ||||||
|  |           xp->p_nextready = xp->p_nextready->p_nextready; | ||||||
|  |           if (rdy_tail[q] == rp) 		/* possibly update tail */ | ||||||
|  |               rdy_tail[q] = rp; | ||||||
|  |       } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* No match yet. Search body of queue. A process can be made unready even 
 |    | ||||||
|    * if it is not running by being sent a signal that kills it. | #if DEAD_CODE | ||||||
|    */ |   while (xp->p_nextready != rp)			/* find rp */ | ||||||
|   while (xp->p_nextready != rp) | 	if ( (xp = xp->p_nextready) == NIL_PROC)  | ||||||
| 	if ( (xp = xp->p_nextready) == NIL_PROC) return; | 		return; | ||||||
|   xp->p_nextready = xp->p_nextready->p_nextready; |   xp->p_nextready = xp->p_nextready->p_nextready; | ||||||
|   qtail = &rdy_tail[q]; |   qtail = &rdy_tail[q]; | ||||||
|   if (*qtail == rp) *qtail = xp; |   if (*qtail == rp) *qtail = xp; | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*===========================================================================*
 | /*===========================================================================*
 | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								lib/other/_getprocnr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/other/_getprocnr.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | #include <lib.h> | ||||||
|  | #define getprocnr	_getprocnr | ||||||
|  | #include <unistd.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | PUBLIC int getprocnr(proc_nr) | ||||||
|  | int *proc_nr;			/* return process number here */ | ||||||
|  | { | ||||||
|  |   message m; | ||||||
|  | 
 | ||||||
|  |   if (_syscall(MM, GETPROCNR, &m) < 0) return(-1); | ||||||
|  |   *proc_nr = m.m1_i1; | ||||||
|  |   return(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										7
									
								
								lib/syscall/getprocnr.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/syscall/getprocnr.s
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | .sect .text | ||||||
|  | .extern	__getprocnr
 | ||||||
|  | .define	_getprocnr
 | ||||||
|  | .align 2
 | ||||||
|  | 
 | ||||||
|  | _getprocnr: | ||||||
|  | 	jmp	__getprocnr | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jorrit Herder
						Jorrit Herder