Rev 4386 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4386 | Rev 4387 | ||
|---|---|---|---|
| Line 96... | Line 96... | ||
| 96 | rc = waitq_sleep_timeout_unsafe(wq, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
96 | rc = waitq_sleep_timeout_unsafe(wq, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
| 97 | 97 | ||
| 98 | waitq_sleep_finish(wq, rc, ipl); |
98 | waitq_sleep_finish(wq, rc, ipl); |
| 99 | } |
99 | } |
| 100 | 100 | ||
| 101 | /** Do a preliminary check that a debugging session is in progress. |
- | |
| 102 | * |
- | |
| 103 | * This only requires the THREAD->udebug.lock mutex (and not TASK->udebug.lock |
- | |
| 104 | * mutex). For an undebugged task, this will never block (while there could be |
- | |
| 105 | * collisions by different threads on the TASK mutex), thus improving SMP |
- | |
| 106 | * perormance for undebugged tasks. |
- | |
| 107 | * |
- | |
| 108 | * @return True if the thread was in a debugging session when the function |
- | |
| 109 | * checked, false otherwise. |
- | |
| 110 | */ |
- | |
| 111 | static bool udebug_thread_precheck(void) |
- | |
| 112 | { |
- | |
| 113 | bool res; |
- | |
| 114 | - | ||
| 115 | mutex_lock(&THREAD->udebug.lock); |
- | |
| 116 | res = THREAD->udebug.active; |
- | |
| 117 | mutex_unlock(&THREAD->udebug.lock); |
- | |
| 118 | - | ||
| 119 | return res; |
- | |
| 120 | } |
- | |
| 121 | - | ||
| 122 | /** Start of stoppable section. |
101 | /** Start of stoppable section. |
| 123 | * |
102 | * |
| 124 | * A stoppable section is a section of code where if the thread can be stoped. In other words, |
103 | * A stoppable section is a section of code where if the thread can be stoped. In other words, |
| 125 | * if a STOP operation is issued, the thread is guaranteed not to execute |
104 | * if a STOP operation is issued, the thread is guaranteed not to execute |
| 126 | * any userspace instructions until the thread is resumed. |
105 | * any userspace instructions until the thread is resumed. |
| Line 243... | Line 222... | ||
| 243 | call_t *call; |
222 | call_t *call; |
| 244 | udebug_event_t etype; |
223 | udebug_event_t etype; |
| 245 | 224 | ||
| 246 | etype = end_variant ? UDEBUG_EVENT_SYSCALL_E : UDEBUG_EVENT_SYSCALL_B; |
225 | etype = end_variant ? UDEBUG_EVENT_SYSCALL_E : UDEBUG_EVENT_SYSCALL_B; |
| 247 | 226 | ||
| 248 | /* Early check for undebugged tasks */ |
- | |
| 249 | if (!udebug_thread_precheck()) { |
- | |
| 250 | return; |
- | |
| 251 | } |
- | |
| 252 | - | ||
| 253 | mutex_lock(&TASK->udebug.lock); |
227 | mutex_lock(&TASK->udebug.lock); |
| 254 | mutex_lock(&THREAD->udebug.lock); |
228 | mutex_lock(&THREAD->udebug.lock); |
| 255 | 229 | ||
| 256 | /* Must only generate events when in debugging session and is go. */ |
230 | /* Must only generate events when in debugging session and is go. */ |
| 257 | if (THREAD->udebug.active != true || THREAD->udebug.go == false || |
231 | if (THREAD->udebug.active != true || THREAD->udebug.go == false || |