Allocate only the required threads
This commit is contained in:
		
							parent
							
								
									bed8c35980
								
							
						
					
					
						commit
						ffd492e922
					
				
							
								
								
									
										2
									
								
								emu.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								emu.h
									
									
									
									
									
								
							| @ -305,7 +305,7 @@ struct ovni_eproc { | ||||
| 
 | ||||
| 	/* Threads */ | ||||
| 	size_t nthreads; | ||||
| 	struct ovni_ethread thread[OVNI_MAX_THR]; | ||||
| 	struct ovni_ethread *thread; | ||||
| 
 | ||||
| 	JSON_Value *meta; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										59
									
								
								trace.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								trace.c
									
									
									
									
									
								
							| @ -117,6 +117,7 @@ load_proc(struct ovni_eproc *proc, struct ovni_loom *loom, int index, int pid, c | ||||
| 	char path[PATH_MAX]; | ||||
| 	struct ovni_ethread *thread; | ||||
| 	int tid; | ||||
| 	size_t i; | ||||
| 
 | ||||
| 	proc->pid = pid; | ||||
| 	proc->index = index; | ||||
| @ -147,6 +148,26 @@ load_proc(struct ovni_eproc *proc, struct ovni_loom *loom, int index, int pid, c | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	proc->nthreads = count_dir_prefix(dir, "thread"); | ||||
| 
 | ||||
| 	if(proc->nthreads <= 0) | ||||
| 	{ | ||||
| 		err("cannot find any thread for process %d\n", | ||||
| 				proc->pid); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	proc->thread = calloc(proc->nthreads, sizeof(struct ovni_ethread)); | ||||
| 
 | ||||
| 	if(proc->thread == NULL) | ||||
| 	{ | ||||
| 		perror("calloc failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	rewinddir(dir); | ||||
| 
 | ||||
| 	i = 0; | ||||
| 	while((dirent = readdir(dir)) != NULL) | ||||
| 	{ | ||||
| 		if(find_dir_prefix_int(dirent, "thread", &tid) != 0) | ||||
| @ -159,31 +180,24 @@ load_proc(struct ovni_eproc *proc, struct ovni_loom *loom, int index, int pid, c | ||||
| 			abort(); | ||||
| 		} | ||||
| 
 | ||||
| 		if(proc->nthreads >= OVNI_MAX_THR) | ||||
| 		{ | ||||
| 			err("too many thread streams for process %d\n", pid); | ||||
| 			abort(); | ||||
| 		} | ||||
| 		thread = &proc->thread[i]; | ||||
| 
 | ||||
| 		thread = &proc->thread[proc->nthreads]; | ||||
| 
 | ||||
| 		if(load_thread(thread, proc, proc->nthreads, tid, path) != 0) | ||||
| 		if(load_thread(thread, proc, i, tid, path) != 0) | ||||
| 			return -1; | ||||
| 
 | ||||
| 		proc->nthreads++; | ||||
| 		i++; | ||||
| 	} | ||||
| 
 | ||||
| 	closedir(dir); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| load_loom(struct ovni_loom *loom, char *loomdir) | ||||
| { | ||||
| 	int pid, i; | ||||
| 	int pid; | ||||
| 	size_t i; | ||||
| 	char path[PATH_MAX]; | ||||
| 	DIR *dir; | ||||
| 	struct dirent *dirent; | ||||
| @ -222,6 +236,12 @@ load_loom(struct ovni_loom *loom, char *loomdir) | ||||
| 
 | ||||
| 		sprintf(path, "%s/%s", loomdir, dirent->d_name); | ||||
| 
 | ||||
| 		if(i >= loom->nprocs) | ||||
| 		{ | ||||
| 			err("more process than expected\n"); | ||||
| 			abort(); | ||||
| 		} | ||||
| 
 | ||||
| 		if(load_proc(&loom->proc[i], loom, i, pid, path) != 0) | ||||
| 			return -1; | ||||
| 
 | ||||
| @ -229,6 +249,12 @@ load_loom(struct ovni_loom *loom, char *loomdir) | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	if(i != loom->nprocs) | ||||
| 	{ | ||||
| 		err("unexpected number of processes\n"); | ||||
| 		abort(); | ||||
| 	} | ||||
| 
 | ||||
| 	closedir(dir); | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -470,10 +496,17 @@ ovni_free_streams(struct ovni_trace *trace) | ||||
| void | ||||
| ovni_free_trace(struct ovni_trace *trace) | ||||
| { | ||||
| 	size_t i; | ||||
| 	size_t i, j; | ||||
| 
 | ||||
| 	for(i=0; i<trace->nlooms; i++) | ||||
| 	{ | ||||
| 		for(j=0; j<trace->loom[i].nprocs; j++) | ||||
| 		{ | ||||
| 			free(trace->loom[i].proc[j].thread); | ||||
| 		} | ||||
| 
 | ||||
| 		free(trace->loom[i].proc); | ||||
| 	} | ||||
| 
 | ||||
| 	free(trace->loom); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user