Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/ipc.c

    rab34cc9 r6aef742  
    3838 */
    3939
     40#include <synch/synch.h>
    4041#include <synch/spinlock.h>
    4142#include <synch/mutex.h>
    4243#include <synch/waitq.h>
     44#include <synch/synch.h>
    4345#include <ipc/ipc.h>
    44 #include <abi/ipc/methods.h>
    4546#include <ipc/kbox.h>
    4647#include <ipc/event.h>
     
    126127        list_initialize(&box->answers);
    127128        list_initialize(&box->irq_notifs);
    128         list_initialize(&box->irq_list);
     129        list_initialize(&box->irq_head);
    129130        box->task = task;
    130131}
     
    181182         */
    182183        irq_spinlock_lock(&TASK->lock, true);
    183         list_append(&sync_box->sync_box_link, &TASK->sync_boxes);
     184        list_append(&sync_box->sync_box_link, &TASK->sync_box_head);
    184185        irq_spinlock_unlock(&TASK->lock, true);
    185186       
     
    230231                }
    231232        }
    232 
    233         call->data.task_id = TASK->taskid;
    234233       
    235234        if (do_lock)
     
    296295                atomic_inc(&phone->active_calls);
    297296                call->data.phone = phone;
    298                 call->data.task_id = TASK->taskid;
     297                call->data.task = TASK;
    299298        }
    300299       
     
    408407                        call->caller_phone = call->data.phone;
    409408                call->data.phone = newphone;
    410                 call->data.task_id = TASK->taskid;
     409                call->data.task = TASK;
    411410        }
    412411       
     
    450449                irq_spinlock_lock(&box->irq_lock, false);
    451450               
    452                 request = list_get_instance(list_first(&box->irq_notifs),
    453                     call_t, link);
     451                request = list_get_instance(box->irq_notifs.next, call_t, link);
    454452                list_remove(&request->link);
    455453               
     
    460458               
    461459                /* Handle asynchronous answers */
    462                 request = list_get_instance(list_first(&box->answers),
    463                     call_t, link);
     460                request = list_get_instance(box->answers.next, call_t, link);
    464461                list_remove(&request->link);
    465462                atomic_dec(&request->data.phone->active_calls);
     
    469466               
    470467                /* Handle requests */
    471                 request = list_get_instance(list_first(&box->calls),
    472                     call_t, link);
     468                request = list_get_instance(box->calls.next, call_t, link);
    473469                list_remove(&request->link);
    474470               
     
    497493 *
    498494 */
    499 void ipc_cleanup_call_list(list_t *lst)
     495void ipc_cleanup_call_list(link_t *lst)
    500496{
    501497        while (!list_empty(lst)) {
    502                 call_t *call = list_get_instance(list_first(lst), call_t, link);
     498                call_t *call = list_get_instance(lst->next, call_t, link);
    503499                if (call->buffer)
    504500                        free(call->buffer);
     
    529525        irq_spinlock_lock(&box->lock, true);
    530526        while (!list_empty(&box->connected_phones)) {
    531                 phone = list_get_instance(list_first(&box->connected_phones),
     527                phone = list_get_instance(box->connected_phones.next,
    532528                    phone_t, link);
    533529                if (SYNCH_FAILED(mutex_trylock(&phone->lock))) {
     
    609605        /* Wait for all answers to interrupted synchronous calls to arrive */
    610606        ipl_t ipl = interrupts_disable();
    611         while (!list_empty(&TASK->sync_boxes)) {
    612                 answerbox_t *box = list_get_instance(
    613                     list_first(&TASK->sync_boxes), answerbox_t, sync_box_link);
     607        while (!list_empty(&TASK->sync_box_head)) {
     608                answerbox_t *box = list_get_instance(TASK->sync_box_head.next,
     609                    answerbox_t, sync_box_link);
    614610               
    615611                list_remove(&box->sync_box_link);
     
    746742#endif
    747743       
     744        link_t *cur;
     745       
    748746        printf(" --- incomming calls ---\n");
    749         list_foreach(task->answerbox.calls, cur) {
     747        for (cur = task->answerbox.calls.next; cur != &task->answerbox.calls;
     748            cur = cur->next) {
    750749                call_t *call = list_get_instance(cur, call_t, link);
    751750               
     
    767766       
    768767        printf(" --- dispatched calls ---\n");
    769         list_foreach(task->answerbox.dispatched_calls, cur) {
     768        for (cur = task->answerbox.dispatched_calls.next;
     769            cur != &task->answerbox.dispatched_calls;
     770            cur = cur->next) {
    770771                call_t *call = list_get_instance(cur, call_t, link);
    771772               
     
    787788       
    788789        printf(" --- incoming answers ---\n");
    789         list_foreach(task->answerbox.answers, cur) {
     790        for (cur = task->answerbox.answers.next;
     791            cur != &task->answerbox.answers;
     792            cur = cur->next) {
    790793                call_t *call = list_get_instance(cur, call_t, link);
    791794               
Note: See TracChangeset for help on using the changeset viewer.