|
33 | 33 |
|
34 | 34 | void syscallSleep(g_task* task, g_syscall_sleep* data) |
35 | 35 | { |
36 | | - INTERRUPTS_PAUSE; |
37 | | - mutexAcquire(&task->lock); |
38 | | - task->status = G_TASK_STATUS_WAITING; |
39 | | - task->waitsFor = "sleeps"; |
40 | | - mutexRelease(&task->lock); |
41 | | - clockWaitForTime(task->id, clockGetLocal()->time + data->milliseconds); |
42 | | - taskingYield(); |
43 | | - INTERRUPTS_RESUME; |
| 36 | + taskingWait(task, __func__, [task, data]() |
| 37 | + { |
| 38 | + clockWaitForTime(task->id, clockGetLocal()->time + data->milliseconds); |
| 39 | + }); |
44 | 40 | } |
45 | 41 |
|
46 | 42 | void syscallYield(g_task* task, g_syscall_yield* data) |
@@ -88,14 +84,10 @@ void syscallGetProcessIdForTaskId(g_task* task, g_syscall_get_pid_for_tid* data) |
88 | 84 |
|
89 | 85 | void syscallJoin(g_task* task, g_syscall_join* data) |
90 | 86 | { |
91 | | - INTERRUPTS_PAUSE; |
92 | | - mutexAcquire(&task->lock); |
93 | | - task->status = G_TASK_STATUS_WAITING; |
94 | | - task->waitsFor = "join"; |
95 | | - mutexRelease(&task->lock); |
96 | | - taskingWaitForExit(data->taskId, task->id); |
97 | | - taskingYield(); |
98 | | - INTERRUPTS_RESUME; |
| 87 | + taskingWait(task, __func__, [task ,data]() |
| 88 | + { |
| 89 | + taskingWaitForExit(data->taskId, task->id); |
| 90 | + }); |
99 | 91 | } |
100 | 92 |
|
101 | 93 | void syscallSpawn(g_task* task, g_syscall_spawn* data) |
@@ -175,7 +167,8 @@ void syscallCreateTask(g_task* task, g_syscall_create_task* data) |
175 | 167 | if(data->coreAffinity == G_TASK_CORE_AFFINITY_NONE) |
176 | 168 | { |
177 | 169 | taskingAssignBalanced(newTask); |
178 | | - } else |
| 170 | + } |
| 171 | + else |
179 | 172 | { |
180 | 173 | taskingAssignOnCore(data->coreAffinity, newTask); |
181 | 174 | } |
@@ -293,6 +286,21 @@ void syscallRegisterTaskIdentifier(g_task* task, g_syscall_task_id_register* dat |
293 | 286 | data->successful = taskingDirectoryRegister(data->identifier, task->id, task->securityLevel); |
294 | 287 | } |
295 | 288 |
|
| 289 | +void syscallAwaitTaskByIdentifier(g_task* task, g_syscall_task_await_by_id* data) |
| 290 | +{ |
| 291 | + g_tid target; |
| 292 | + while((target = taskingDirectoryGet(data->identifier)) == G_TID_NONE) |
| 293 | + { |
| 294 | + taskingWait(task, __func__, [data, task]() |
| 295 | + { |
| 296 | + clockWaitForTime(task->id, clockGetLocal()->time + 100); |
| 297 | + taskingDirectoryWaitForRegister(data->identifier, task->id); |
| 298 | + }); |
| 299 | + clockUnwaitForTime(task->id); |
| 300 | + } |
| 301 | + data->task = target; |
| 302 | +} |
| 303 | + |
296 | 304 | void syscallGetTaskForIdentifier(g_task* task, g_syscall_task_id_get* data) |
297 | 305 | { |
298 | 306 | data->resultTaskId = taskingDirectoryGet(data->identifier); |
|
0 commit comments