 c5b309ff07
			
		
	
	
		c5b309ff07
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.0 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();
 | |
| }
 | |
| 
 |