minix/servers/vm/asynsend.c
Ben Gras c078ec0331 Basic VM and other minor improvements.
Not complete, probably not fully debugged or optimized.
2008-11-19 12:26:10 +00:00

67 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);
}