Rev 4653 | Rev 4655 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4653 | Rev 4654 | ||
|---|---|---|---|
| Line 44... | Line 44... | ||
| 44 | #include <mem.h> |
44 | #include <mem.h> |
| 45 | #include <string.h> |
45 | #include <string.h> |
| 46 | #include <loader/loader.h> |
46 | #include <loader/loader.h> |
| 47 | #include <io/console.h> |
47 | #include <io/console.h> |
| 48 | #include <io/keycode.h> |
48 | #include <io/keycode.h> |
| - | 49 | #include <fibril_sync.h> |
|
| 49 | 50 | ||
| 50 | #include <libc.h> |
51 | #include <libc.h> |
| 51 | 52 | ||
| 52 | // Temporary: service and method names |
53 | // Temporary: service and method names |
| 53 | #include "proto.h" |
54 | #include "proto.h" |
| Line 69... | Line 70... | ||
| 69 | int phoneid; |
70 | int phoneid; |
| 70 | int abort_trace; |
71 | int abort_trace; |
| 71 | 72 | ||
| 72 | uintptr_t thash; |
73 | uintptr_t thash; |
| 73 | volatile int paused; |
74 | volatile int paused; |
| - | 75 | fibril_condvar_t paused_cv; |
|
| - | 76 | fibril_mutex_t paused_lock; |
|
| 74 | 77 | ||
| 75 | void thread_trace_start(uintptr_t thread_hash); |
78 | void thread_trace_start(uintptr_t thread_hash); |
| 76 | 79 | ||
| 77 | static proto_t *proto_console; |
80 | static proto_t *proto_console; |
| 78 | static task_id_t task_id; |
81 | static task_id_t task_id; |
| Line 451... | Line 454... | ||
| 451 | 454 | ||
| 452 | printf("Start tracing thread [%d] (hash 0x%lx).\n", thread_id, thread_hash); |
455 | printf("Start tracing thread [%d] (hash 0x%lx).\n", thread_id, thread_hash); |
| 453 | 456 | ||
| 454 | while (!abort_trace) { |
457 | while (!abort_trace) { |
| 455 | 458 | ||
| - | 459 | fibril_mutex_lock(&paused_lock); |
|
| 456 | if (paused) { |
460 | if (paused) { |
| 457 | printf("Press R to resume.\n"); |
461 | printf("Thread [%d] paused. Press R to resume.\n", |
| - | 462 | thread_id); |
|
| - | 463 | ||
| 458 | while (paused) { |
464 | while (paused) |
| 459 | async_usleep(1000000); |
465 | fibril_condvar_wait(&paused_cv, &paused_lock); |
| 460 | } |
466 | |
| 461 | printf("Resumed\n"); |
467 | printf("Thread [%d] resumed.\n", thread_id); |
| 462 | } |
468 | } |
| - | 469 | fibril_mutex_unlock(&paused_lock); |
|
| 463 | 470 | ||
| 464 | /* Run thread until an event occurs */ |
471 | /* Run thread until an event occurs */ |
| 465 | rc = udebug_go(phoneid, thread_hash, |
472 | rc = udebug_go(phoneid, thread_hash, |
| 466 | &ev_type, &val0, &val1); |
473 | &ev_type, &val0, &val1); |
| 467 | 474 | ||
| Line 479... | Line 486... | ||
| 479 | case UDEBUG_EVENT_SYSCALL_E: |
486 | case UDEBUG_EVENT_SYSCALL_E: |
| 480 | event_syscall_e(thread_id, thread_hash, val0, (int)val1); |
487 | event_syscall_e(thread_id, thread_hash, val0, (int)val1); |
| 481 | break; |
488 | break; |
| 482 | case UDEBUG_EVENT_STOP: |
489 | case UDEBUG_EVENT_STOP: |
| 483 | printf("Stop event\n"); |
490 | printf("Stop event\n"); |
| - | 491 | fibril_mutex_lock(&paused_lock); |
|
| - | 492 | paused = 1; |
|
| - | 493 | fibril_mutex_unlock(&paused_lock); |
|
| 484 | break; |
494 | break; |
| 485 | case UDEBUG_EVENT_THREAD_B: |
495 | case UDEBUG_EVENT_THREAD_B: |
| 486 | event_thread_b(val0); |
496 | event_thread_b(val0); |
| 487 | break; |
497 | break; |
| 488 | case UDEBUG_EVENT_THREAD_E: |
498 | case UDEBUG_EVENT_THREAD_E: |
| Line 596... | Line 606... | ||
| 596 | done = true; |
606 | done = true; |
| 597 | break; |
607 | break; |
| 598 | case KC_P: |
608 | case KC_P: |
| 599 | printf("Pause...\n"); |
609 | printf("Pause...\n"); |
| 600 | rc = udebug_stop(phoneid, thash); |
610 | rc = udebug_stop(phoneid, thash); |
| 601 | if (rc == EOK) |
611 | if (rc != EOK) |
| 602 | paused = 1; |
- | |
| 603 | else |
- | |
| 604 | printf("stop -> %d\n", rc); |
612 | printf("Error: stop -> %d\n", rc); |
| 605 | break; |
613 | break; |
| 606 | case KC_R: |
614 | case KC_R: |
| - | 615 | fibril_mutex_lock(&paused_lock); |
|
| 607 | paused = 0; |
616 | paused = 0; |
| - | 617 | fibril_condvar_broadcast(&paused_cv); |
|
| - | 618 | fibril_mutex_unlock(&paused_lock); |
|
| 608 | printf("Resume...\n"); |
619 | printf("Resume...\n"); |
| 609 | break; |
620 | break; |
| 610 | } |
621 | } |
| 611 | } |
622 | } |
| 612 | 623 | ||
| Line 642... | Line 653... | ||
| 642 | V_INTEGER |
653 | V_INTEGER |
| 643 | }; |
654 | }; |
| 644 | 655 | ||
| 645 | next_thread_id = 1; |
656 | next_thread_id = 1; |
| 646 | paused = 0; |
657 | paused = 0; |
| - | 658 | fibril_mutex_initialize(&paused_lock); |
|
| - | 659 | fibril_condvar_initialize(&paused_cv); |
|
| 647 | 660 | ||
| 648 | proto_init(); |
661 | proto_init(); |
| 649 | 662 | ||
| 650 | p = proto_new("vfs"); |
663 | p = proto_new("vfs"); |
| 651 | o = oper_new("read", 1, arg_def, V_ERRNO, 1, resp_def); |
664 | o = oper_new("read", 1, arg_def, V_ERRNO, 1, resp_def); |