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.
93 lines
2 KiB
C
93 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();
|
|
}
|
|
|