Implement thread count view
This commit is contained in:
		
							parent
							
								
									d25bbed350
								
							
						
					
					
						commit
						49198afbca
					
				
							
								
								
									
										98
									
								
								emu.c
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								emu.c
									
									
									
									
									
								
							| @ -85,15 +85,41 @@ find_thread(struct ovni_eproc *proc, pid_t tid) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| step_emulator(struct ovni_emu *emu) | hook_pre(struct ovni_emu *emu) | ||||||
| { | { | ||||||
| 	//emu_emit(emu);
 | 	//emu_emit(emu);
 | ||||||
| 
 | 
 | ||||||
| 	switch(emu->cur_ev->model) | 	switch(emu->cur_ev->model) | ||||||
| 	{ | 	{ | ||||||
| 		case 'O': emu_process_ovni_ev(emu); break; | 		case 'O': hook_pre_ovni(emu); break; | ||||||
| 		//case 'V': emu_process_nosv_ev(emu); break;
 | 		default: | ||||||
| 		//case 'M': emu_process_tampi_ev(emu); break;
 | 			  //dbg("unknown model %c\n", emu->cur_ev->model);
 | ||||||
|  | 			  break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | hook_view(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	//emu_emit(emu);
 | ||||||
|  | 
 | ||||||
|  | 	switch(emu->cur_ev->model) | ||||||
|  | 	{ | ||||||
|  | 		case 'O': hook_view_ovni(emu); break; | ||||||
|  | 		default: | ||||||
|  | 			  //dbg("unknown model %c\n", emu->cur_ev->model);
 | ||||||
|  | 			  break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | hook_post(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	//emu_emit(emu);
 | ||||||
|  | 
 | ||||||
|  | 	switch(emu->cur_ev->model) | ||||||
|  | 	{ | ||||||
|  | 		case 'O': hook_post_ovni(emu); break; | ||||||
| 		default: | 		default: | ||||||
| 			  //dbg("unknown model %c\n", emu->cur_ev->model);
 | 			  //dbg("unknown model %c\n", emu->cur_ev->model);
 | ||||||
| 			  break; | 			  break; | ||||||
| @ -183,73 +209,15 @@ emulate(struct ovni_emu *emu) | |||||||
| 	while(next_event(emu) == 0) | 	while(next_event(emu) == 0) | ||||||
| 	{ | 	{ | ||||||
| 		//fprintf(stdout, "step %i\n", i);
 | 		//fprintf(stdout, "step %i\n", i);
 | ||||||
| 		step_emulator(emu); | 		hook_pre(emu); | ||||||
|  | 		hook_view(emu); | ||||||
|  | 		hook_post(emu); | ||||||
| 
 | 
 | ||||||
| 		/* Read the next event */ | 		/* Read the next event */ | ||||||
| 		ovni_load_next_event(emu->cur_stream); | 		ovni_load_next_event(emu->cur_stream); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int |  | ||||||
| emu_cpu_find_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 
 |  | ||||||
| 	for(i=0; i<cpu->nthreads; i++) |  | ||||||
| 		if(cpu->thread[i] == thread) |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 	/* Not found */ |  | ||||||
| 	if(i >= cpu->nthreads) |  | ||||||
| 		return -1; |  | ||||||
| 
 |  | ||||||
| 	return i; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| emu_cpu_remove_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) |  | ||||||
| { |  | ||||||
| 	int i, j; |  | ||||||
| 
 |  | ||||||
| 	i = emu_cpu_find_thread(cpu, thread); |  | ||||||
| 
 |  | ||||||
| 	/* Not found, abort */ |  | ||||||
| 	if(i < 0) |  | ||||||
| 		abort(); |  | ||||||
| 
 |  | ||||||
| 	for(j=i; j+1 < cpu->nthreads; j++) |  | ||||||
| 	{ |  | ||||||
| 		cpu->thread[i] = cpu->thread[j+1]; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	cpu->nthreads--; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void |  | ||||||
| emu_cpu_add_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) |  | ||||||
| { |  | ||||||
| 	/* Found, abort */ |  | ||||||
| 	if(emu_cpu_find_thread(cpu, thread) >= 0) |  | ||||||
| 		abort(); |  | ||||||
| 
 |  | ||||||
| 	assert(cpu->nthreads < OVNI_MAX_THR); |  | ||||||
| 
 |  | ||||||
| 	cpu->thread[cpu->nthreads++] = thread; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct ovni_cpu * |  | ||||||
| emu_get_cpu(struct ovni_emu *emu, int cpuid) |  | ||||||
| { |  | ||||||
| 	assert(cpuid < OVNI_MAX_CPU); |  | ||||||
| 
 |  | ||||||
| 	if(cpuid < 0) |  | ||||||
| 	{ |  | ||||||
| 		return &emu->vcpu; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &emu->cpu[emu->cpuind[cpuid]]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct ovni_ethread * | struct ovni_ethread * | ||||||
| emu_get_thread(struct ovni_emu *emu, int tid) | emu_get_thread(struct ovni_emu *emu, int tid) | ||||||
| { | { | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								emu.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								emu.h
									
									
									
									
									
								
							| @ -104,6 +104,8 @@ struct ovni_cpu { | |||||||
| 	enum ovni_cpu_state state; | 	enum ovni_cpu_state state; | ||||||
| 	enum ovni_cpu_type type; | 	enum ovni_cpu_type type; | ||||||
| 
 | 
 | ||||||
|  | 	size_t last_nthreads; | ||||||
|  | 
 | ||||||
| 	/* The threads the cpu is currently running */ | 	/* The threads the cpu is currently running */ | ||||||
| 	size_t nthreads; | 	size_t nthreads; | ||||||
| 	struct ovni_ethread *thread[OVNI_MAX_THR]; | 	struct ovni_ethread *thread[OVNI_MAX_THR]; | ||||||
| @ -135,14 +137,10 @@ struct ovni_emu { | |||||||
| /* Emulator function declaration */ | /* Emulator function declaration */ | ||||||
| 
 | 
 | ||||||
| void emu_emit(struct ovni_emu *emu); | void emu_emit(struct ovni_emu *emu); | ||||||
| void emu_process_ovni_ev(struct ovni_emu *emu); |  | ||||||
| 
 | 
 | ||||||
| 
 | void hook_pre_ovni(struct ovni_emu *emu); | ||||||
| int emu_cpu_find_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread); | void hook_view_ovni(struct ovni_emu *emu); | ||||||
| 
 | void hook_post_ovni(struct ovni_emu *emu); | ||||||
| void emu_cpu_remove_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread); |  | ||||||
| 
 |  | ||||||
| void emu_cpu_add_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread); |  | ||||||
| 
 | 
 | ||||||
| struct ovni_cpu *emu_get_cpu(struct ovni_emu *emu, int cpuid); | struct ovni_cpu *emu_get_cpu(struct ovni_emu *emu, int cpuid); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										112
									
								
								emu_ovni.c
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								emu_ovni.c
									
									
									
									
									
								
							| @ -3,6 +3,67 @@ | |||||||
| 
 | 
 | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| 
 | 
 | ||||||
|  | struct ovni_cpu * | ||||||
|  | emu_get_cpu(struct ovni_emu *emu, int cpuid) | ||||||
|  | { | ||||||
|  | 	assert(cpuid < OVNI_MAX_CPU); | ||||||
|  | 
 | ||||||
|  | 	if(cpuid < 0) | ||||||
|  | 	{ | ||||||
|  | 		return &emu->vcpu; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return &emu->cpu[emu->cpuind[cpuid]]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | emu_cpu_find_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	for(i=0; i<cpu->nthreads; i++) | ||||||
|  | 		if(cpu->thread[i] == thread) | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 	/* Not found */ | ||||||
|  | 	if(i >= cpu->nthreads) | ||||||
|  | 		return -1; | ||||||
|  | 
 | ||||||
|  | 	return i; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | emu_cpu_add_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) | ||||||
|  | { | ||||||
|  | 	/* Found, abort */ | ||||||
|  | 	if(emu_cpu_find_thread(cpu, thread) >= 0) | ||||||
|  | 		abort(); | ||||||
|  | 
 | ||||||
|  | 	assert(cpu->nthreads < OVNI_MAX_THR); | ||||||
|  | 
 | ||||||
|  | 	cpu->thread[cpu->nthreads++] = thread; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | emu_cpu_remove_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread) | ||||||
|  | { | ||||||
|  | 	int i, j; | ||||||
|  | 
 | ||||||
|  | 	i = emu_cpu_find_thread(cpu, thread); | ||||||
|  | 
 | ||||||
|  | 	/* Not found, abort */ | ||||||
|  | 	if(i < 0) | ||||||
|  | 		abort(); | ||||||
|  | 
 | ||||||
|  | 	for(j=i; j+1 < cpu->nthreads; j++) | ||||||
|  | 	{ | ||||||
|  | 		cpu->thread[i] = cpu->thread[j+1]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cpu->nthreads--; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| print_threads_state(struct ovni_emu *emu) | print_threads_state(struct ovni_emu *emu) | ||||||
| { | { | ||||||
| @ -245,7 +306,7 @@ ev_cpu(struct ovni_emu *emu) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| emu_process_ovni_ev(struct ovni_emu *emu) | hook_pre_ovni(struct ovni_emu *emu) | ||||||
| { | { | ||||||
| 	//emu_emit(emu);
 | 	//emu_emit(emu);
 | ||||||
| 
 | 
 | ||||||
| @ -263,3 +324,52 @@ emu_process_ovni_ev(struct ovni_emu *emu) | |||||||
| 
 | 
 | ||||||
| 	print_threads_state(emu); | 	print_threads_state(emu); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | view_thread_count(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	/* Check every CPU looking for a change in nthreads */ | ||||||
|  | 	for(i=0; i<emu->ncpus; i++) | ||||||
|  | 	{ | ||||||
|  | 		if(emu->cpu[i].last_nthreads == emu->cpu[i].nthreads) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		/* Emit the number of threads in the cpu */ | ||||||
|  | 		dbg("cpu %d runs %d threads\n", i, emu->cpu[i].nthreads); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Same with the virtual CPU */ | ||||||
|  | 	if(emu->vcpu.last_nthreads != emu->vcpu.nthreads) | ||||||
|  | 		dbg("vpu runs %d threads\n", emu->vcpu.nthreads); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | hook_view_ovni(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	switch(emu->cur_ev->class) | ||||||
|  | 	{ | ||||||
|  | 		case 'H': | ||||||
|  | 		case 'A': | ||||||
|  | 		case 'C': | ||||||
|  | 			view_thread_count(emu); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | hook_post_ovni(struct ovni_emu *emu) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	/* Update last_nthreads in the CPUs */ | ||||||
|  | 
 | ||||||
|  | 	for(i=0; i<emu->ncpus; i++) | ||||||
|  | 		emu->cpu[i].last_nthreads = emu->cpu[i].nthreads; | ||||||
|  | 
 | ||||||
|  | 	emu->vcpu.last_nthreads = emu->vcpu.nthreads; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user