Allocate only the required processes
This commit is contained in:
		
							parent
							
								
									3e35f3d88b
								
							
						
					
					
						commit
						bed8c35980
					
				
							
								
								
									
										2
									
								
								emu.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								emu.h
									
									
									
									
									
								
							@ -384,7 +384,7 @@ struct ovni_loom {
 | 
				
			|||||||
	/* Virtual CPU */
 | 
						/* Virtual CPU */
 | 
				
			||||||
	struct ovni_cpu vcpu;
 | 
						struct ovni_cpu vcpu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ovni_eproc proc[OVNI_MAX_PROC];
 | 
						struct ovni_eproc *proc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Keep a list of updated cpus */
 | 
						/* Keep a list of updated cpus */
 | 
				
			||||||
	int nupdated_cpus;
 | 
						int nupdated_cpus;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								ovni.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								ovni.h
									
									
									
									
									
								
							@ -41,7 +41,6 @@ extern "C" {
 | 
				
			|||||||
typedef struct json_value_t  JSON_Value;
 | 
					typedef struct json_value_t  JSON_Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OVNI_MAX_CPU 256
 | 
					#define OVNI_MAX_CPU 256
 | 
				
			||||||
#define OVNI_MAX_PROC 256
 | 
					 | 
				
			||||||
#define OVNI_MAX_THR 256
 | 
					#define OVNI_MAX_THR 256
 | 
				
			||||||
#define OVNI_TRACEDIR "ovni"
 | 
					#define OVNI_TRACEDIR "ovni"
 | 
				
			||||||
#define OVNI_MAX_HOSTNAME 512
 | 
					#define OVNI_MAX_HOSTNAME 512
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										75
									
								
								trace.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								trace.c
									
									
									
									
									
								
							@ -38,7 +38,8 @@ find_dir_prefix_str(struct dirent *dirent, const char *prefix, const char **str)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	p++;
 | 
						p++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*str = p;
 | 
						if(str)
 | 
				
			||||||
 | 
							*str = p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -57,6 +58,23 @@ find_dir_prefix_int(struct dirent *dirent, const char *prefix, int *num)
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					count_dir_prefix(DIR *dir, const char *prefix)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct dirent *dirent;
 | 
				
			||||||
 | 
						int n = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while((dirent = readdir(dir)) != NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(find_dir_prefix_str(dirent, prefix, NULL) != 0)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							n++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return n;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
load_thread(struct ovni_ethread *thread, struct ovni_eproc *proc, int index, int tid, char *filepath)
 | 
					load_thread(struct ovni_ethread *thread, struct ovni_eproc *proc, int index, int tid, char *filepath)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -163,13 +181,12 @@ load_proc(struct ovni_eproc *proc, struct ovni_loom *loom, int index, int pid, c
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
load_loom(struct ovni_loom *loom, int loomid, char *loomdir)
 | 
					load_loom(struct ovni_loom *loom, char *loomdir)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int pid;
 | 
						int pid, i;
 | 
				
			||||||
	char path[PATH_MAX];
 | 
						char path[PATH_MAX];
 | 
				
			||||||
	DIR *dir;
 | 
						DIR *dir;
 | 
				
			||||||
	struct dirent *dirent;
 | 
						struct dirent *dirent;
 | 
				
			||||||
	struct ovni_eproc *proc;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if((dir = opendir(loomdir)) == NULL)
 | 
						if((dir = opendir(loomdir)) == NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -178,6 +195,26 @@ load_loom(struct ovni_loom *loom, int loomid, char *loomdir)
 | 
				
			|||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						loom->nprocs = count_dir_prefix(dir, "proc");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(loom->nprocs <= 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							err("cannot find any process directory in loom %s\n",
 | 
				
			||||||
 | 
									loom->hostname);
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						loom->proc = calloc(loom->nprocs, sizeof(struct ovni_eproc));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(loom->proc == NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							perror("calloc failed");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rewinddir(dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i = 0;
 | 
				
			||||||
	while((dirent = readdir(dir)) != NULL)
 | 
						while((dirent = readdir(dir)) != NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(find_dir_prefix_int(dirent, "proc", &pid) != 0)
 | 
							if(find_dir_prefix_int(dirent, "proc", &pid) != 0)
 | 
				
			||||||
@ -185,19 +222,11 @@ load_loom(struct ovni_loom *loom, int loomid, char *loomdir)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		sprintf(path, "%s/%s", loomdir, dirent->d_name);
 | 
							sprintf(path, "%s/%s", loomdir, dirent->d_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(loom->nprocs >= OVNI_MAX_PROC)
 | 
							if(load_proc(&loom->proc[i], loom, i, pid, path) != 0)
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			err("too many process streams for loom %d\n",
 | 
					 | 
				
			||||||
					loomid);
 | 
					 | 
				
			||||||
			abort();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		proc = &loom->proc[loom->nprocs];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if(load_proc(proc, loom, loom->nprocs, pid, path) != 0)
 | 
					 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		loom->nprocs++;
 | 
							i++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	closedir(dir);
 | 
						closedir(dir);
 | 
				
			||||||
@ -241,8 +270,6 @@ ovni_load_trace(struct ovni_trace *trace, char *tracedir)
 | 
				
			|||||||
		trace->nlooms++;
 | 
							trace->nlooms++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	closedir(dir);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if(trace->nlooms == 0)
 | 
						if(trace->nlooms == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		err("cannot find any loom in %s\n", tracedir);
 | 
							err("cannot find any loom in %s\n", tracedir);
 | 
				
			||||||
@ -270,12 +297,7 @@ ovni_load_trace(struct ovni_trace *trace, char *tracedir)
 | 
				
			|||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Read again the directory */
 | 
						rewinddir(dir);
 | 
				
			||||||
	if((dir = opendir(tracedir)) == NULL)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		err("opendir %s failed: %s\n", tracedir, strerror(errno));
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l = 0;
 | 
						l = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -326,7 +348,7 @@ ovni_load_trace(struct ovni_trace *trace, char *tracedir)
 | 
				
			|||||||
		/* Safe */
 | 
							/* Safe */
 | 
				
			||||||
		strcpy(trace->loom[l].hostname, hosts[l]);
 | 
							strcpy(trace->loom[l].hostname, hosts[l]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(load_loom(&trace->loom[l], l, looms[l]) != 0)
 | 
							if(load_loom(&trace->loom[l], looms[l]) != 0)
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -448,6 +470,11 @@ ovni_free_streams(struct ovni_trace *trace)
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
ovni_free_trace(struct ovni_trace *trace)
 | 
					ovni_free_trace(struct ovni_trace *trace)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						size_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i<trace->nlooms; i++)
 | 
				
			||||||
 | 
							free(trace->loom[i].proc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(trace->loom);
 | 
						free(trace->loom);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user