Changeset 2ba7810 in mainline for generic/src/ipc/ipc.c
- Timestamp:
- 2006-03-16T12:24:20Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b7dcabb
- Parents:
- d764ddc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/src/ipc/ipc.c
rd764ddc r2ba7810 32 32 */ 33 33 34 #include <synch/ condvar.h>35 #include <synch/ mutex.h>34 #include <synch/spinlock.h> 35 #include <synch/waitq.h> 36 36 #include <ipc/ipc.h> 37 37 #include <errno.h> … … 85 85 void ipc_answerbox_init(answerbox_t *box) 86 86 { 87 mutex_initialize(&box->mutex);88 condvar_initialize(&box->cv);87 spinlock_initialize(&box->lock, "ipc_box_lock"); 88 waitq_initialize(&box->wq); 89 89 list_initialize(&box->connected_phones); 90 90 list_initialize(&box->calls); … … 94 94 } 95 95 96 /** Connect phone to answerbox */ 97 void 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 96 108 /** Initialize phone structure and connect phone to naswerbox 97 109 */ 98 void ipc_phone_init(phone_t *phone , answerbox_t *box)110 void ipc_phone_init(phone_t *phone) 99 111 { 100 112 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; 107 115 } 108 116 … … 114 122 ASSERT(box); 115 123 116 mutex_lock(&box->mutex);124 spinlock_lock(&box->lock); 117 125 list_remove(&phone->list); 118 mutex_unlock(&box->mutex);126 spinlock_unlock(&box->lock); 119 127 } 120 128 … … 138 146 * @param request Request to be sent 139 147 */ 140 void ipc_call(phone_t *phone, call_t * request)148 void ipc_call(phone_t *phone, call_t *call) 141 149 { 142 150 answerbox_t *box = phone->callee; … … 144 152 ASSERT(box); 145 153 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 */ 166 void 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); 150 176 } 151 177 … … 161 187 request->flags |= IPC_CALL_ANSWERED; 162 188 163 mutex_lock(&box->mutex);189 spinlock_lock(&box->lock); 164 190 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); 168 194 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); 171 197 } 172 198 … … 180 206 call_t *request; 181 207 182 mutex_lock(&box->mutex);208 spinlock_lock(&box->lock); 183 209 while (1) { 184 210 if (!list_empty(&box->answers)) { … … 195 221 if (!(flags & IPC_WAIT_NONBLOCKING)) { 196 222 /* 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); 198 226 continue; 199 227 } … … 202 230 break; 203 231 } 204 mutex_unlock(&box->mutex);232 spinlock_unlock(&box->lock); 205 233 return request; 206 234 }
Note:
See TracChangeset
for help on using the changeset viewer.