72,9 → 72,12 |
|
uintptr_t thash; |
volatile int paused; |
fibril_condvar_t paused_cv; |
fibril_mutex_t paused_lock; |
fibril_condvar_t state_cv; |
fibril_mutex_t state_lock; |
|
int cev_valid; |
console_event_t cev; |
|
void thread_trace_start(uintptr_t thread_hash); |
|
static proto_t *proto_console; |
85,6 → 88,7 |
display_mask_t display_mask; |
|
static int program_run_fibril(void *arg); |
static int cev_fibril(void *arg); |
|
static void program_run(void) |
{ |
99,6 → 103,19 |
fibril_add_ready(fid); |
} |
|
static void cev_fibril_start(void) |
{ |
fid_t fid; |
|
fid = fibril_create(cev_fibril, NULL); |
if (fid == 0) { |
printf("Error creating fibril\n"); |
exit(1); |
} |
|
fibril_add_ready(fid); |
} |
|
static int program_run_fibril(void *arg) |
{ |
int rc; |
456,17 → 473,17 |
|
while (!abort_trace) { |
|
fibril_mutex_lock(&paused_lock); |
fibril_mutex_lock(&state_lock); |
if (paused) { |
printf("Thread [%d] paused. Press R to resume.\n", |
thread_id); |
|
while (paused) |
fibril_condvar_wait(&paused_cv, &paused_lock); |
fibril_condvar_wait(&state_cv, &state_lock); |
|
printf("Thread [%d] resumed.\n", thread_id); |
} |
fibril_mutex_unlock(&paused_lock); |
fibril_mutex_unlock(&state_lock); |
|
/* Run thread until an event occurs */ |
rc = udebug_go(phoneid, thread_hash, |
488,9 → 505,9 |
break; |
case UDEBUG_EVENT_STOP: |
printf("Stop event\n"); |
fibril_mutex_lock(&paused_lock); |
fibril_mutex_lock(&state_lock); |
paused = 1; |
fibril_mutex_unlock(&paused_lock); |
fibril_mutex_unlock(&state_lock); |
break; |
case UDEBUG_EVENT_THREAD_B: |
event_thread_b(val0); |
497,7 → 514,10 |
break; |
case UDEBUG_EVENT_THREAD_E: |
printf("Thread 0x%lx exited.\n", val0); |
fibril_mutex_lock(&state_lock); |
abort_trace = 1; |
fibril_condvar_broadcast(&state_cv); |
fibril_mutex_unlock(&state_lock); |
break; |
default: |
printf("Unknown event type %d.\n", ev_type); |
592,6 → 612,32 |
return NULL; |
} |
|
static int cev_fibril(void *arg) |
{ |
(void) arg; |
|
printf("cev_fibril()\n"); |
while (true) { |
printf("cev_fibril: wait for cev_valid == 0\n"); |
fibril_mutex_lock(&state_lock); |
while (cev_valid) |
fibril_condvar_wait(&state_cv, &state_lock); |
fibril_mutex_unlock(&state_lock); |
|
printf("cev_fibril: wait for key\n"); |
|
if (!console_get_event(fphone(stdin), &cev)) |
return -1; |
|
printf("cev_fibril: broadcast cev_valid = 1\n"); |
|
fibril_mutex_lock(&state_lock); |
cev_valid = 1; |
fibril_condvar_broadcast(&state_cv); |
fibril_mutex_unlock(&state_lock); |
} |
} |
|
static void trace_task(task_id_t task_id) |
{ |
console_event_t ev; |
622,9 → 668,24 |
done = false; |
|
while (!done) { |
if (!console_get_event(fphone(stdin), &ev)) |
return; |
printf("trace_task: wait for cev_valid || abort_trace\n"); |
fibril_mutex_lock(&state_lock); |
while (!cev_valid && !abort_trace) |
fibril_condvar_wait(&state_cv, &state_lock); |
fibril_mutex_unlock(&state_lock); |
|
printf("trace_task: got something\n"); |
|
ev = cev; |
|
fibril_mutex_lock(&state_lock); |
cev_valid = false; |
fibril_condvar_broadcast(&state_cv); |
fibril_mutex_unlock(&state_lock); |
|
if (abort_trace) |
break; |
|
if (ev.type != KEY_PRESS) |
continue; |
|
639,10 → 700,10 |
printf("Error: stop -> %d\n", rc); |
break; |
case KC_R: |
fibril_mutex_lock(&paused_lock); |
fibril_mutex_lock(&state_lock); |
paused = 0; |
fibril_condvar_broadcast(&paused_cv); |
fibril_mutex_unlock(&paused_lock); |
fibril_condvar_broadcast(&state_cv); |
fibril_mutex_unlock(&state_lock); |
printf("Resume...\n"); |
break; |
} |
682,9 → 743,11 |
|
next_thread_id = 1; |
paused = 0; |
fibril_mutex_initialize(&paused_lock); |
fibril_condvar_initialize(&paused_cv); |
cev_valid = 0; |
|
fibril_mutex_initialize(&state_lock); |
fibril_condvar_initialize(&state_cv); |
|
proto_init(); |
|
p = proto_new("vfs"); |
873,6 → 936,7 |
program_run(); |
} |
|
cev_fibril_start(); |
trace_task(task_id); |
|
return 0; |