Rev 1579 | Rev 1583 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1579 | Rev 1580 | ||
|---|---|---|---|
| Line 56... | Line 56... | ||
| 56 | 56 | ||
| 57 | SPINLOCK_INITIALIZE(tasks_lock); |
57 | SPINLOCK_INITIALIZE(tasks_lock); |
| 58 | btree_t tasks_btree; |
58 | btree_t tasks_btree; |
| 59 | static task_id_t task_counter = 0; |
59 | static task_id_t task_counter = 0; |
| 60 | 60 | ||
| 61 | static void ktask_cleanup(void *); |
61 | static void ktaskclnp(void *); |
| 62 | 62 | ||
| 63 | /** Initialize tasks |
63 | /** Initialize tasks |
| 64 | * |
64 | * |
| 65 | * Initialize kernel tasks support. |
65 | * Initialize kernel tasks support. |
| 66 | * |
66 | * |
| Line 245... | Line 245... | ||
| 245 | 245 | ||
| 246 | spinlock_lock(&ta->lock); |
246 | spinlock_lock(&ta->lock); |
| 247 | ta->refcount++; |
247 | ta->refcount++; |
| 248 | spinlock_unlock(&ta->lock); |
248 | spinlock_unlock(&ta->lock); |
| 249 | 249 | ||
| 250 | t = thread_create(ktask_cleanup, NULL, ta, 0, "ktask_cleanup"); |
250 | t = thread_create(ktaskclnp, NULL, ta, 0, "ktaskclnp"); |
| 251 | 251 | ||
| 252 | spinlock_lock(&ta->lock); |
252 | spinlock_lock(&ta->lock); |
| - | 253 | ta->accept_new_threads = false; |
|
| 253 | ta->refcount--; |
254 | ta->refcount--; |
| 254 | 255 | ||
| 255 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
256 | for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
| 256 | thread_t *thr; |
257 | thread_t *thr; |
| 257 | bool sleeping = false; |
258 | bool sleeping = false; |
| Line 268... | Line 269... | ||
| 268 | 269 | ||
| 269 | if (sleeping) |
270 | if (sleeping) |
| 270 | waitq_interrupt_sleep(thr); |
271 | waitq_interrupt_sleep(thr); |
| 271 | } |
272 | } |
| 272 | 273 | ||
| - | 274 | spinlock_unlock(&ta->lock); |
|
| 273 | thread_ready(t); |
275 | interrupts_restore(ipl); |
| 274 | 276 | ||
| - | 277 | if (t) |
|
| - | 278 | thread_ready(t); |
|
| - | 279 | ||
| 275 | return 0; |
280 | return 0; |
| 276 | } |
281 | } |
| 277 | 282 | ||
| 278 | /** Print task list */ |
283 | /** Print task list */ |
| 279 | void task_print_list(void) |
284 | void task_print_list(void) |
| Line 311... | Line 316... | ||
| 311 | spinlock_unlock(&tasks_lock); |
316 | spinlock_unlock(&tasks_lock); |
| 312 | interrupts_restore(ipl); |
317 | interrupts_restore(ipl); |
| 313 | } |
318 | } |
| 314 | 319 | ||
| 315 | /** Kernel thread used to cleanup the task. */ |
320 | /** Kernel thread used to cleanup the task. */ |
| 316 | void ktask_cleanup(void *arg) |
321 | void ktaskclnp(void *arg) |
| 317 | { |
322 | { |
| - | 323 | ipl_t ipl; |
|
| - | 324 | thread_t *t = NULL; |
|
| - | 325 | link_t *cur; |
|
| - | 326 | ||
| - | 327 | thread_detach(THREAD); |
|
| - | 328 | ||
| - | 329 | loop: |
|
| - | 330 | ipl = interrupts_disable(); |
|
| - | 331 | spinlock_lock(&TASK->lock); |
|
| - | 332 | ||
| - | 333 | /* |
|
| - | 334 | * Find a thread to join. |
|
| - | 335 | */ |
|
| - | 336 | for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) { |
|
| - | 337 | t = list_get_instance(cur, thread_t, th_link); |
|
| - | 338 | if (t == THREAD) |
|
| - | 339 | continue; |
|
| - | 340 | else |
|
| - | 341 | break; |
|
| - | 342 | } |
|
| - | 343 | ||
| - | 344 | spinlock_unlock(&TASK->lock); |
|
| - | 345 | interrupts_restore(ipl); |
|
| - | 346 | ||
| - | 347 | if (t != THREAD) { |
|
| - | 348 | thread_join(t); |
|
| - | 349 | thread_detach(t); |
|
| - | 350 | goto loop; |
|
| - | 351 | } |
|
| - | 352 | ||
| - | 353 | /* |
|
| - | 354 | * Now there are no other threads in this task |
|
| - | 355 | * and no new threads can be created. |
|
| - | 356 | */ |
|
| - | 357 | ||
| 318 | /* |
358 | /* |
| 319 | * TODO: |
359 | * TODO: |
| 320 | * Wait until it is save to cleanup the task (i.e. all other threads exit) |
- | |
| 321 | * and do the cleanup (e.g. close IPC communication and release used futexes). |
360 | * Close IPC communication and release used futexes. |
| 322 | * When this thread exits, the task refcount drops to zero and the task structure is |
361 | * When this thread exits, the task refcount drops to zero and the task structure is |
| 323 | * cleaned. |
362 | * cleaned. |
| 324 | */ |
363 | */ |
| 325 | } |
364 | } |