Implement tracking channels in emu.c
This commit is contained in:
		
							parent
							
								
									6b83789460
								
							
						
					
					
						commit
						cd430a35ce
					
				
							
								
								
									
										71
									
								
								emu.c
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								emu.c
									
									
									
									
									
								
							| @ -79,13 +79,74 @@ find_thread(struct ovni_eproc *proc, pid_t tid) | ||||
| static void | ||||
| emit_channels(struct ovni_emu *emu) | ||||
| { | ||||
| 	struct ovni_ethread *th; | ||||
| 	int i; | ||||
| 
 | ||||
| 	th = emu->cur_thread; | ||||
| 	struct ovni_cpu *cpu; | ||||
| 	struct ovni_chan *chan_cpu, *chan_th; | ||||
| 	struct ovni_ethread *th, *last_th; | ||||
| 	int i, j, k, nrunning, st; | ||||
| 
 | ||||
| 	/* Compute the CPU derived channels from the threads */ | ||||
| 	for(i=0; i<CHAN_MAX; i++) | ||||
| 		chan_emit(&th->chan[i]); | ||||
| 	{ | ||||
| 		for(j=0; j<emu->total_ncpus; j++) | ||||
| 		{ | ||||
| 			cpu = emu->global_cpu[j]; | ||||
| 			chan_cpu = &cpu->chan[i]; | ||||
| 
 | ||||
| 			if(chan_cpu->track != CHAN_TRACK_TH_RUNNING) | ||||
| 			{ | ||||
| 				//dbg("cpu chan %d not tracking threads\n", i);
 | ||||
| 				break; | ||||
| 			} | ||||
| 
 | ||||
| 			/* Count running threads */ | ||||
| 			for(k=0, nrunning=0; k<cpu->nthreads; k++) | ||||
| 			{ | ||||
| 				th = cpu->thread[k]; | ||||
| 				if(th->state == TH_ST_RUNNING) | ||||
| 				{ | ||||
| 					last_th = th; | ||||
| 					nrunning++; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if(nrunning == 0) | ||||
| 			{ | ||||
| 				//dbg("cpu chan %d disabled: no running threads\n", i);
 | ||||
| 				if(chan_is_enabled(chan_cpu)) | ||||
| 					chan_enable(chan_cpu, 0); | ||||
| 			} | ||||
| 			else if(nrunning > 1) | ||||
| 			{ | ||||
| 				//dbg("cpu chan %d bad: multiple threads\n", i);
 | ||||
| 				if(!chan_is_enabled(chan_cpu)) | ||||
| 					chan_enable(chan_cpu, 1); | ||||
| 				chan_set(chan_cpu, -1); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				chan_th = &th->chan[i]; | ||||
| 
 | ||||
| 				//dbg("cpu chan %d good: one thread\n", i);
 | ||||
| 				if(!chan_is_enabled(chan_cpu)) | ||||
| 					chan_enable(chan_cpu, 1); | ||||
| 				if(chan_is_enabled(chan_th)) | ||||
| 					chan_set(chan_cpu, chan_get_st(&last_th->chan[i])); | ||||
| 				else | ||||
| 					chan_set(chan_cpu, ST_BAD); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Emit only the channels that have been updated. We need a list
 | ||||
| 	 * of updated channels */ | ||||
| 	for(i=0; i<emu->total_nthreads; i++) | ||||
| 		for(j=0; j<CHAN_MAX; j++) | ||||
| 			chan_emit(&emu->global_thread[i]->chan[j]); | ||||
| 
 | ||||
| 	for(i=0; i<emu->total_ncpus; i++) | ||||
| 		for(j=0; j<CHAN_MAX; j++) | ||||
| 			chan_emit(&emu->global_cpu[i]->chan[j]); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| static void | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user