Rev 1090 | Rev 1223 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1090 | Rev 1141 | ||
|---|---|---|---|
| Line 320... | Line 320... | ||
| 320 | request = list_get_instance(box->calls.next, call_t, list); |
320 | request = list_get_instance(box->calls.next, call_t, list); |
| 321 | list_remove(&request->list); |
321 | list_remove(&request->list); |
| 322 | /* Append request to dispatch queue */ |
322 | /* Append request to dispatch queue */ |
| 323 | list_append(&request->list, &box->dispatched_calls); |
323 | list_append(&request->list, &box->dispatched_calls); |
| 324 | } else { |
324 | } else { |
| - | 325 | /* This can happen regularly after ipc_cleanup, remove |
|
| - | 326 | * the warning in the future when the IPC is |
|
| - | 327 | * more debugged */ |
|
| 325 | printf("WARNING: Spurious IPC wakeup.\n"); |
328 | printf("WARNING: Spurious IPC wakeup.\n"); |
| 326 | spinlock_unlock(&box->lock); |
329 | spinlock_unlock(&box->lock); |
| 327 | goto restart; |
330 | goto restart; |
| 328 | } |
331 | } |
| 329 | spinlock_unlock(&box->lock); |
332 | spinlock_unlock(&box->lock); |
| Line 337... | Line 340... | ||
| 337 | sizeof(call_t), |
340 | sizeof(call_t), |
| 338 | 0, |
341 | 0, |
| 339 | NULL, NULL, 0); |
342 | NULL, NULL, 0); |
| 340 | } |
343 | } |
| 341 | 344 | ||
| - | 345 | /** Answer all calls from list with EHANGUP msg */ |
|
| - | 346 | static void ipc_cleanup_call_list(link_t *lst) |
|
| - | 347 | { |
|
| - | 348 | call_t *call; |
|
| - | 349 | ||
| - | 350 | while (!list_empty(lst)) { |
|
| - | 351 | call = list_get_instance(lst->next, call_t, list); |
|
| - | 352 | list_remove(&call->list); |
|
| - | 353 | ||
| - | 354 | IPC_SET_RETVAL(call->data, EHANGUP); |
|
| - | 355 | _ipc_answer_free_call(call); |
|
| - | 356 | } |
|
| - | 357 | } |
|
| - | 358 | ||
| 342 | /** Cleans up all IPC communication of the given task |
359 | /** Cleans up all IPC communication of the given task |
| 343 | * |
360 | * |
| 344 | * |
361 | * |
| 345 | */ |
362 | */ |
| 346 | void ipc_cleanup(task_t *task) |
363 | void ipc_cleanup(task_t *task) |
| 347 | { |
364 | { |
| 348 | int i; |
365 | int i; |
| - | 366 | call_t *call; |
|
| - | 367 | phone_t *phone; |
|
| 349 | 368 | ||
| 350 | /* Disconnect all our phones ('ipc_phone_hangup') */ |
369 | /* Disconnect all our phones ('ipc_phone_hangup') */ |
| 351 | for (i=0;i < IPC_MAX_PHONES; i++) |
370 | for (i=0;i < IPC_MAX_PHONES; i++) |
| 352 | ipc_phone_hangup(&task->phones[i]); |
371 | ipc_phone_hangup(&task->phones[i]); |
| 353 | 372 | ||
| 354 | /* Disconnect all phones connected to answerbox */ |
373 | /* Disconnect all phones connected to our answerbox */ |
| - | 374 | restart_phones: |
|
| - | 375 | spinlock_lock(&task->answerbox.lock); |
|
| - | 376 | while (!list_empty(&task->answerbox.connected_phones)) { |
|
| - | 377 | phone = list_get_instance(task->answerbox.connected_phones.next, |
|
| - | 378 | phone_t, |
|
| - | 379 | list); |
|
| - | 380 | if (! spinlock_trylock(&phone->lock)) { |
|
| - | 381 | spinlock_unlock(&task->answerbox.lock); |
|
| - | 382 | goto restart_phones; |
|
| - | 383 | } |
|
| - | 384 | ||
| - | 385 | /* Disconnect phone */ |
|
| - | 386 | phone->callee = NULL; |
|
| - | 387 | list_remove(&phone->list); |
|
| - | 388 | ||
| - | 389 | spinlock_unlock(&phone->lock); |
|
| - | 390 | } |
|
| 355 | 391 | ||
| 356 | /* Answer all messages in 'calls' and 'dispatched_calls' queues */ |
392 | /* Answer all messages in 'calls' and 'dispatched_calls' queues */ |
| - | 393 | spinlock_lock(&task->answerbox.lock); |
|
| - | 394 | ipc_cleanup_call_list(&task->answerbox.dispatched_calls); |
|
| - | 395 | ipc_cleanup_call_list(&task->answerbox.calls); |
|
| - | 396 | spinlock_unlock(&task->answerbox.lock); |
|
| 357 | 397 | ||
| 358 | /* Wait for all async answers to arrive */ |
398 | /* Wait for all async answers to arrive */ |
| - | 399 | while (atomic_get(&task->active_calls)) { |
|
| - | 400 | call = ipc_wait_for_call(&task->answerbox, 0); |
|
| - | 401 | ASSERT(call->flags & IPC_CALL_ANSWERED); |
|
| - | 402 | ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
|
| - | 403 | ||
| - | 404 | atomic_dec(&task->active_calls); |
|
| - | 405 | ipc_call_free(call); |
|
| - | 406 | } |
|
| 359 | } |
407 | } |