Changes in kernel/generic/src/ipc/kbox.c [a35b458:5a6cc679] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/kbox.c
ra35b458 r5a6cc679 63 63 TASK->kb.finished = true; 64 64 mutex_unlock(&TASK->kb.cleanup_lock); 65 65 66 66 bool have_kb_thread = (TASK->kb.thread != NULL); 67 67 68 68 /* 69 69 * From now on nobody will try to connect phones or attach 70 70 * kbox threads 71 71 */ 72 72 73 73 /* 74 74 * Disconnect all phones connected to our kbox. Passing true for … … 78 78 */ 79 79 ipc_answerbox_slam_phones(&TASK->kb.box, have_kb_thread); 80 80 81 81 /* 82 82 * If the task was being debugged, clean up debugging session. … … 87 87 udebug_task_cleanup(TASK); 88 88 mutex_unlock(&TASK->udebug.lock); 89 89 90 90 if (have_kb_thread) { 91 91 LOG("Join kb.thread."); … … 95 95 TASK->kb.thread = NULL; 96 96 } 97 97 98 98 /* Answer all messages in 'calls' and 'dispatched_calls' queues. */ 99 99 ipc_cleanup_call_list(&TASK->kb.box, &TASK->kb.box.calls); … … 120 120 LOG("Was not debugger."); 121 121 } 122 122 123 123 LOG("Continue with hangup message."); 124 124 IPC_SET_RETVAL(call->data, 0); 125 125 ipc_answer(&TASK->kb.box, call); 126 126 127 127 mutex_lock(&TASK->kb.cleanup_lock); 128 128 129 129 irq_spinlock_lock(&TASK->lock, true); 130 130 irq_spinlock_lock(&TASK->kb.box.lock, false); … … 134 134 * gets freed and signal to the caller. 135 135 */ 136 136 137 137 /* Only detach kbox thread unless already terminating. */ 138 138 if (TASK->kb.finished == false) { … … 141 141 TASK->kb.thread = NULL; 142 142 } 143 143 144 144 LOG("Phone list is empty."); 145 145 *last = true; 146 146 } else 147 147 *last = false; 148 148 149 149 irq_spinlock_unlock(&TASK->kb.box.lock, false); 150 150 irq_spinlock_unlock(&TASK->lock, true); 151 151 152 152 mutex_unlock(&TASK->kb.cleanup_lock); 153 153 } … … 166 166 LOG("Starting."); 167 167 bool done = false; 168 168 169 169 while (!done) { 170 170 call_t *call = ipc_wait_for_call(&TASK->kb.box, SYNCH_NO_TIMEOUT, 171 171 SYNCH_FLAGS_NONE); 172 172 173 173 if (call == NULL) 174 174 continue; /* Try again. */ 175 175 176 176 switch (IPC_GET_IMETHOD(call->data)) { 177 177 178 178 case IPC_M_DEBUG: 179 179 /* Handle debug call. */ 180 180 udebug_call_receive(call); 181 181 break; 182 182 183 183 case IPC_M_PHONE_HUNGUP: 184 184 /* … … 189 189 kbox_proc_phone_hungup(call, &done); 190 190 break; 191 191 192 192 default: 193 193 /* Ignore */ … … 195 195 } 196 196 } 197 197 198 198 LOG("Exiting."); 199 199 } … … 213 213 { 214 214 irq_spinlock_lock(&tasks_lock, true); 215 215 216 216 task_t *task = task_find_by_id(taskid); 217 217 if (task == NULL) { … … 219 219 return ENOENT; 220 220 } 221 221 222 222 atomic_inc(&task->refcount); 223 223 224 224 irq_spinlock_unlock(&tasks_lock, true); 225 225 226 226 mutex_lock(&task->kb.cleanup_lock); 227 227 228 228 if (atomic_predec(&task->refcount) == 0) { 229 229 mutex_unlock(&task->kb.cleanup_lock); … … 231 231 return ENOENT; 232 232 } 233 233 234 234 if (task->kb.finished) { 235 235 mutex_unlock(&task->kb.cleanup_lock); 236 236 return EINVAL; 237 237 } 238 238 239 239 /* Create a kbox thread if necessary. */ 240 240 if (task->kb.thread == NULL) { 241 241 thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task, 242 242 THREAD_FLAG_NONE, "kbox"); 243 243 244 244 if (!kb_thread) { 245 245 mutex_unlock(&task->kb.cleanup_lock); 246 246 return ENOMEM; 247 247 } 248 248 249 249 task->kb.thread = kb_thread; 250 250 thread_ready(kb_thread); 251 251 } 252 252 253 253 /* Allocate a new phone. */ 254 254 cap_handle_t phone_handle; … … 258 258 return rc; 259 259 } 260 260 261 261 kobject_t *phone_obj = kobject_get(TASK, phone_handle, 262 262 KOBJECT_TYPE_PHONE); … … 264 264 /* Hand over phone_obj's reference to ipc_phone_connect() */ 265 265 (void) ipc_phone_connect(phone_obj->phone, &task->kb.box); 266 266 267 267 mutex_unlock(&task->kb.cleanup_lock); 268 268 *out_phone = phone_handle;
Note:
See TracChangeset
for help on using the changeset viewer.