c078ec0331
Not complete, probably not fully debugged or optimized.
67 lines
1.7 KiB
C
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);
|
|
}
|
|
|