minix/test/ds/subs.c
Cristiano Giuffrida c5b309ff07 Merge of Wu's GSOC 09 branch (src.20090525.r4372.wu)
Main changes:
- COW optimization for safecopy.
- safemap, a grant-based interface for sharing memory regions between processes.
- Integration with safemap and complete rework of DS, supporting new data types
  natively (labels, memory ranges, memory mapped ranges).
- For further information:
  http://wiki.minix3.org/en/SummerOfCode2009/MemoryGrants

Additional changes not included in the original Wu's branch:
- Fixed unhandled case in VM when using COW optimization for safecopy in case
  of a block that has already been shared as SMAP.
- Better interface and naming scheme for sys_saferevmap and ds_retrieve_map
  calls.
- Better input checking in syslib: check for page alignment when creating
  memory mapping grants.
- DS notifies subscribers when an entry is deleted.
- Documented the behavior of indirect grants in case of memory mapping.
- Test suite in /usr/src/test/safeperf|safecopy|safemap|ds/* reworked
  and extended.
- Minor fixes and general cleanup.
- TO-DO: Grant ids should be generated and managed the way endpoints are to make
sure grant slots are never misreused.
2010-01-14 15:24:16 +00:00

94 lines
2 KiB
C

#include "inc.h"
char *key_u32 = "test_u32";
/* SEF functions and variables. */
FORWARD _PROTOTYPE( void sef_local_startup, (void) );
/*===========================================================================*
* main *
*===========================================================================*/
int main(void)
{
int r;
message mess;
char key[DS_MAX_KEYLEN];
int type;
unsigned long num;
char string[17];
char buf[1000];
size_t length = 1000;
/* SEF local startup. */
sef_local_startup();
/* Subscribe. */
r = ds_subscribe(key_u32, DSF_INITIAL);
if(r != OK && r != EEXIST) {
printf("SUBSCRIBER: error in ds_subscribe: %d\n", r);
return -1;
}
while(1) {
/* Wait for a message. */
r = sef_receive(ANY, &mess);
if(r != OK) {
printf("SUBSCRIBER: sef_receive failed.\n");
return 1;
}
/* Only handle notifications from DS. */
if(mess.m_source != DS_PROC_NR)
continue;
/* Check which one was changed. */
r = ds_check(key, &type);
if(r == ENOENT) {
printf("SUBSCRIBER: the key %s was deleted.\n",
key);
continue;
}
if(r != OK) {
printf("SUBSCRIBER: error in ds_check.\n");
continue;
}
/* Retrieve the entry. */
printf("SUBSCRIBER: key: %s, ", key);
switch(type) {
case DSF_TYPE_U32:
r = ds_retrieve_u32(key, &num);
if(r != OK)
printf("error in ds_retrieve_u32.\n");
printf("U32: %d\n", num);
break;
case DSF_TYPE_STR:
r = ds_retrieve_str(key, string, 0);
if(r != OK)
printf("error in ds_retrieve_str.\n");
printf("STR: %s\n", string);
break;
case DSF_TYPE_MEM:
r = ds_retrieve_mem(key, buf, &length);
if(r != OK)
printf("error in ds_retrieve_mem.\n");
break;
case DSF_TYPE_MAP:
break;
default:
printf("error in type! %d\n", type);
}
}
return 0;
}
/*===========================================================================*
* sef_local_startup *
*===========================================================================*/
PRIVATE void sef_local_startup()
{
/* Let SEF perform startup. */
sef_startup();
}