68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #define _SYSTEM 1
 | |
| 
 | |
| #include <minix/callnr.h>
 | |
| #include <minix/com.h>
 | |
| #include <minix/config.h>
 | |
| #include <minix/const.h>
 | |
| #include <minix/ds.h>
 | |
| #include <minix/endpoint.h>
 | |
| #include <minix/keymap.h>
 | |
| #include <minix/minlib.h>
 | |
| #include <minix/type.h>
 | |
| #include <minix/ipc.h>
 | |
| #include <minix/sysutil.h>
 | |
| #include <minix/syslib.h>
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <string.h>
 | |
| #include <env.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #include "proto.h"
 | |
| #include "util.h"
 | |
| 
 | |
| #define SENDSLOTS _NR_PROCS
 | |
| 
 | |
| PRIVATE asynmsg_t msgtable[SENDSLOTS];
 | |
| PRIVATE size_t msgtable_n= SENDSLOTS;
 | |
| 
 | |
| PUBLIC int asynsend(dst, mp)
 | |
| endpoint_t dst;
 | |
| message *mp;
 | |
| {
 | |
|         int i;
 | |
|         unsigned flags;
 | |
| 
 | |
|         /* Find slot in table */
 | |
|         for (i= 0; i<msgtable_n; i++)
 | |
|         {
 | |
|                 flags= msgtable[i].flags;
 | |
|                 if ((flags & (AMF_VALID|AMF_DONE)) == (AMF_VALID|AMF_DONE))
 | |
|                 {
 | |
|                         if (msgtable[i].result != OK)
 | |
|                         {
 | |
|                                 printf(
 | |
|                       "VM: asynsend: found completed entry %d with error %d\n",
 | |
|                                         i, msgtable[i].result);
 | |
|                         }
 | |
|                         break;
 | |
|                 }
 | |
|                 if (flags == AMF_EMPTY)
 | |
|                         break;
 | |
|         }
 | |
|         if (i >= msgtable_n)
 | |
|                 vm_panic("asynsend: should resize table", i);
 | |
|         msgtable[i].dst= dst;
 | |
|         msgtable[i].msg= *mp;
 | |
|         msgtable[i].flags= AMF_VALID;   /* Has to be last. The kernel
 | |
|                                          * scans this table while we are
 | |
|                                          * sleeping.
 | |
|                                          */
 | |
| 
 | |
|         /* Tell the kernel to rescan the table */
 | |
|         return senda(msgtable, msgtable_n);
 | |
| }
 | |
| 
 | 
