Implement thread count view

This commit is contained in:
Rodrigo Arias 2021-07-28 19:12:20 +02:00
parent d25bbed350
commit 49198afbca
3 changed files with 149 additions and 73 deletions

98
emu.c
View File

@ -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
View File

@ -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);

View File

@ -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;
}