Changeset 2ba7810 in mainline for generic/src/ipc/ipc.c


Ignore:
Timestamp:
2006-03-16T12:24:20Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b7dcabb
Parents:
d764ddc
Message:

Changed ipc to use spinlocks instead of mutexes again.
Fixed loading inits to set nameservice as the first loaded process.
Lot of TODO in ipc done.

File:
1 edited

Legend:

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

    rd764ddc r2ba7810  
    3232 */
    3333
    34 #include <synch/condvar.h>
    35 #include <synch/mutex.h>
     34#include <synch/spinlock.h>
     35#include <synch/waitq.h>
    3636#include <ipc/ipc.h>
    3737#include <errno.h>
     
    8585void ipc_answerbox_init(answerbox_t *box)
    8686{
    87         mutex_initialize(&box->mutex);
    88         condvar_initialize(&box->cv);
     87        spinlock_initialize(&box->lock, "ipc_box_lock");
     88        waitq_initialize(&box->wq);
    8989        list_initialize(&box->connected_phones);
    9090        list_initialize(&box->calls);
     
    9494}
    9595
     96/** Connect phone to answerbox */
     97void ipc_phone_connect(phone_t *phone, answerbox_t *box)
     98{
     99        ASSERT(!phone->callee);
     100        phone->busy = 1;
     101        phone->callee = box;
     102
     103        spinlock_lock(&box->lock);
     104        list_append(&phone->list, &box->connected_phones);
     105        spinlock_unlock(&box->lock);
     106}
     107
    96108/** Initialize phone structure and connect phone to naswerbox
    97109 */
    98 void ipc_phone_init(phone_t *phone, answerbox_t *box)
     110void ipc_phone_init(phone_t *phone)
    99111{
    100112        spinlock_initialize(&phone->lock, "phone_lock");
    101        
    102         phone->callee = box;
    103 
    104         mutex_lock(&box->mutex);
    105         list_append(&phone->list, &box->connected_phones);
    106         mutex_unlock(&box->mutex);
     113        phone->callee = NULL;
     114        phone->busy = 0;
    107115}
    108116
     
    114122        ASSERT(box);
    115123
    116         mutex_lock(&box->mutex);
     124        spinlock_lock(&box->lock);
    117125        list_remove(&phone->list);
    118         mutex_unlock(&box->mutex);
     126        spinlock_unlock(&box->lock);
    119127}
    120128
     
    138146 * @param request Request to be sent
    139147 */
    140 void ipc_call(phone_t *phone, call_t *request)
     148void ipc_call(phone_t *phone, call_t *call)
    141149{
    142150        answerbox_t *box = phone->callee;
     
    144152        ASSERT(box);
    145153
    146         mutex_lock(&box->mutex);
    147         list_append(&request->list, &box->calls);
    148         mutex_unlock(&box->mutex);
    149         condvar_signal(&box->cv);
     154        spinlock_lock(&box->lock);
     155        list_append(&call->list, &box->calls);
     156        spinlock_unlock(&box->lock);
     157        waitq_wakeup(&box->wq, 0);
     158}
     159
     160/** Forwards call from one answerbox to a new one
     161 *
     162 * @param request Request to be forwarded
     163 * @param newbox Target answerbox
     164 * @param oldbox Old answerbox
     165 */
     166void ipc_forward(call_t *call, answerbox_t *newbox, answerbox_t *oldbox)
     167{
     168        spinlock_lock(&oldbox->lock);
     169        list_remove(&call->list);
     170        spinlock_unlock(&oldbox->lock);
     171
     172        spinlock_lock(&newbox->lock);
     173        list_append(&call->list, &newbox->calls);
     174        spinlock_lock(&newbox->lock);
     175        waitq_wakeup(&newbox->wq, 0);
    150176}
    151177
     
    161187        request->flags |= IPC_CALL_ANSWERED;
    162188
    163         mutex_lock(&box->mutex);
     189        spinlock_lock(&box->lock);
    164190        list_remove(&request->list);
    165         mutex_unlock(&box->mutex);
    166 
    167         mutex_lock(&callerbox->mutex);
     191        spinlock_unlock(&box->lock);
     192
     193        spinlock_lock(&callerbox->lock);
    168194        list_append(&request->list, &callerbox->answers);
    169         mutex_unlock(&callerbox->mutex);
    170         condvar_signal(&callerbox->cv);
     195        spinlock_unlock(&callerbox->lock);
     196        waitq_wakeup(&callerbox->wq, 0);
    171197}
    172198
     
    180206        call_t *request;
    181207
    182         mutex_lock(&box->mutex);
     208        spinlock_lock(&box->lock);
    183209        while (1) {
    184210                if (!list_empty(&box->answers)) {
     
    195221                        if (!(flags & IPC_WAIT_NONBLOCKING)) {
    196222                                /* Wait for event to appear */
    197                                 condvar_wait(&box->cv, &box->mutex);
     223                                spinlock_unlock(&box->lock);
     224                                waitq_sleep(&box->wq);
     225                                spinlock_lock(&box->lock);
    198226                                continue;
    199227                        }
     
    202230                break;
    203231        }
    204         mutex_unlock(&box->mutex);
     232        spinlock_unlock(&box->lock);
    205233        return request;
    206234}
Note: See TracChangeset for help on using the changeset viewer.