Changeset 84683fdc in mainline


Ignore:
Timestamp:
2009-07-21T20:37:18Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5462a30
Parents:
8e1dc00
Message:

Use a dedicated fibril to wait for console events so that we can quit the tracer as soon as the app exits. (Need to wait for two different things.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/trace/trace.c

    r8e1dc00 r84683fdc  
    7373uintptr_t thash;
    7474volatile int paused;
    75 fibril_condvar_t paused_cv;
    76 fibril_mutex_t paused_lock;
     75fibril_condvar_t state_cv;
     76fibril_mutex_t state_lock;
     77
     78int cev_valid;
     79console_event_t cev;
    7780
    7881void thread_trace_start(uintptr_t thread_hash);
     
    8689
    8790static int program_run_fibril(void *arg);
     91static int cev_fibril(void *arg);
    8892
    8993static void program_run(void)
     
    9296
    9397        fid = fibril_create(program_run_fibril, NULL);
     98        if (fid == 0) {
     99                printf("Error creating fibril\n");
     100                exit(1);
     101        }
     102
     103        fibril_add_ready(fid);
     104}
     105
     106static void cev_fibril_start(void)
     107{
     108        fid_t fid;
     109
     110        fid = fibril_create(cev_fibril, NULL);
    94111        if (fid == 0) {
    95112                printf("Error creating fibril\n");
     
    457474        while (!abort_trace) {
    458475
    459                 fibril_mutex_lock(&paused_lock);
     476                fibril_mutex_lock(&state_lock);
    460477                if (paused) {
    461478                        printf("Thread [%d] paused. Press R to resume.\n",
     
    463480
    464481                        while (paused)
    465                                 fibril_condvar_wait(&paused_cv, &paused_lock);
     482                                fibril_condvar_wait(&state_cv, &state_lock);
    466483
    467484                        printf("Thread [%d] resumed.\n", thread_id);
    468485                }
    469                 fibril_mutex_unlock(&paused_lock);
     486                fibril_mutex_unlock(&state_lock);
    470487
    471488                /* Run thread until an event occurs */
     
    489506                        case UDEBUG_EVENT_STOP:
    490507                                printf("Stop event\n");
    491                                 fibril_mutex_lock(&paused_lock);
     508                                fibril_mutex_lock(&state_lock);
    492509                                paused = 1;
    493                                 fibril_mutex_unlock(&paused_lock);
     510                                fibril_mutex_unlock(&state_lock);
    494511                                break;
    495512                        case UDEBUG_EVENT_THREAD_B:
     
    498515                        case UDEBUG_EVENT_THREAD_E:
    499516                                printf("Thread 0x%lx exited.\n", val0);
     517                                fibril_mutex_lock(&state_lock);
    500518                                abort_trace = 1;
     519                                fibril_condvar_broadcast(&state_cv);
     520                                fibril_mutex_unlock(&state_lock);
    501521                                break;
    502522                        default:
     
    593613}
    594614
     615static int cev_fibril(void *arg)
     616{
     617        (void) arg;
     618
     619        printf("cev_fibril()\n");
     620        while (true) {
     621                printf("cev_fibril: wait for cev_valid == 0\n");
     622                fibril_mutex_lock(&state_lock);
     623                while (cev_valid)
     624                        fibril_condvar_wait(&state_cv, &state_lock);
     625                fibril_mutex_unlock(&state_lock);
     626
     627                printf("cev_fibril: wait for key\n");
     628
     629                if (!console_get_event(fphone(stdin), &cev))
     630                        return -1;
     631
     632                printf("cev_fibril: broadcast cev_valid = 1\n");
     633
     634                fibril_mutex_lock(&state_lock);
     635                cev_valid = 1;
     636                fibril_condvar_broadcast(&state_cv);
     637                fibril_mutex_unlock(&state_lock);               
     638        }
     639}
     640
    595641static void trace_task(task_id_t task_id)
    596642{
     
    623669
    624670        while (!done) {
    625                 if (!console_get_event(fphone(stdin), &ev))
    626                         return;
     671                printf("trace_task: wait for cev_valid || abort_trace\n");
     672                fibril_mutex_lock(&state_lock);
     673                while (!cev_valid && !abort_trace)
     674                        fibril_condvar_wait(&state_cv, &state_lock);
     675                fibril_mutex_unlock(&state_lock);
     676
     677                printf("trace_task: got something\n");
     678
     679                ev = cev;
     680
     681                fibril_mutex_lock(&state_lock);
     682                cev_valid = false;
     683                fibril_condvar_broadcast(&state_cv);
     684                fibril_mutex_unlock(&state_lock);
     685
     686                if (abort_trace)
     687                        break;
    627688
    628689                if (ev.type != KEY_PRESS)
     
    640701                        break;
    641702                case KC_R:
    642                         fibril_mutex_lock(&paused_lock);
     703                        fibril_mutex_lock(&state_lock);
    643704                        paused = 0;
    644                         fibril_condvar_broadcast(&paused_cv);
    645                         fibril_mutex_unlock(&paused_lock);
     705                        fibril_condvar_broadcast(&state_cv);
     706                        fibril_mutex_unlock(&state_lock);
    646707                        printf("Resume...\n");
    647708                        break;
     
    683744        next_thread_id = 1;
    684745        paused = 0;
    685         fibril_mutex_initialize(&paused_lock);
    686         fibril_condvar_initialize(&paused_cv);
     746        cev_valid = 0;
     747
     748        fibril_mutex_initialize(&state_lock);
     749        fibril_condvar_initialize(&state_cv);
    687750
    688751        proto_init();
     
    874937        }
    875938
     939        cev_fibril_start();
    876940        trace_task(task_id);
    877941
Note: See TracChangeset for help on using the changeset viewer.