Changeset a35b458 in mainline for kernel/generic/src/ipc/event.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/event.c
r3061bc1 ra35b458 61 61 { 62 62 assert(evno < EVENT_TASK_END); 63 63 64 64 event_t *event; 65 65 66 66 if (evno < EVENT_END) 67 67 event = &events[(event_type_t) evno]; 68 68 else 69 69 event = &task->events[(event_task_type_t) evno - EVENT_END]; 70 70 71 71 return event; 72 72 } … … 96 96 for (unsigned int i = 0; i < EVENT_END; i++) { 97 97 spinlock_lock(&events[i].lock); 98 98 99 99 if (events[i].answerbox == answerbox) { 100 100 events[i].answerbox = NULL; … … 103 103 events[i].masked = false; 104 104 } 105 105 106 106 spinlock_unlock(&events[i].lock); 107 107 } … … 125 125 { 126 126 assert(evno < EVENT_END); 127 127 128 128 _event_set_unmask_callback(evno2event(evno, NULL), callback); 129 129 } … … 134 134 assert(evno >= (int) EVENT_END); 135 135 assert(evno < EVENT_TASK_END); 136 136 137 137 _event_set_unmask_callback(evno2event(evno, task), callback); 138 138 } … … 144 144 145 145 spinlock_lock(&event->lock); 146 146 147 147 if (event->answerbox != NULL) { 148 148 if (!event->masked) { 149 149 call_t *call = ipc_call_alloc(FRAME_ATOMIC); 150 150 151 151 if (call) { 152 152 call->flags |= IPC_CALL_NOTIF; 153 153 call->priv = ++event->counter; 154 154 155 155 IPC_SET_IMETHOD(call->data, event->imethod); 156 156 IPC_SET_ARG1(call->data, a1); … … 159 159 IPC_SET_ARG4(call->data, a4); 160 160 IPC_SET_ARG5(call->data, a5); 161 161 162 162 call->data.task_id = TASK ? TASK->taskid : 0; 163 163 164 164 irq_spinlock_lock(&event->answerbox->irq_lock, 165 165 true); … … 168 168 irq_spinlock_unlock(&event->answerbox->irq_lock, 169 169 true); 170 170 171 171 waitq_wakeup(&event->answerbox->wq, 172 172 WAKEUP_FIRST); 173 173 174 174 if (mask) 175 175 event->masked = true; 176 176 177 177 res = EOK; 178 178 } else … … 182 182 } else 183 183 res = ENOENT; 184 184 185 185 spinlock_unlock(&event->lock); 186 186 return res; … … 210 210 { 211 211 assert(evno < EVENT_END); 212 212 213 213 return event_enqueue(evno2event(evno, NULL), mask, a1, a2, a3, a4, a5); 214 214 } … … 239 239 assert(evno >= (int) EVENT_END); 240 240 assert(evno < EVENT_TASK_END); 241 241 242 242 return event_enqueue(evno2event(evno, task), mask, a1, a2, a3, a4, a5); 243 243 } … … 259 259 { 260 260 errno_t res; 261 262 spinlock_lock(&event->lock); 263 261 262 spinlock_lock(&event->lock); 263 264 264 if (event->answerbox == NULL) { 265 265 event->answerbox = answerbox; … … 270 270 } else 271 271 res = EEXIST; 272 273 spinlock_unlock(&event->lock); 274 272 273 spinlock_unlock(&event->lock); 274 275 275 return res; 276 276 } … … 289 289 { 290 290 errno_t res; 291 292 spinlock_lock(&event->lock); 293 291 292 spinlock_lock(&event->lock); 293 294 294 if (event->answerbox == answerbox) { 295 295 event->answerbox = NULL; … … 300 300 } else 301 301 res = ENOENT; 302 303 spinlock_unlock(&event->lock); 304 302 303 spinlock_unlock(&event->lock); 304 305 305 return res; 306 306 } … … 317 317 event_callback_t callback = event->unmask_callback; 318 318 spinlock_unlock(&event->lock); 319 319 320 320 /* 321 321 * Check if there is an unmask callback … … 342 342 if (evno >= EVENT_TASK_END) 343 343 return ELIMIT; 344 344 345 345 return (sys_errno_t) event_subscribe(evno2event(evno, TASK), 346 346 (sysarg_t) imethod, &TASK->answerbox); … … 361 361 if (evno >= EVENT_TASK_END) 362 362 return ELIMIT; 363 363 364 364 return (sys_errno_t) event_unsubscribe(evno2event(evno, TASK), 365 365 &TASK->answerbox); … … 383 383 if (evno >= EVENT_TASK_END) 384 384 return ELIMIT; 385 385 386 386 event_unmask(evno2event(evno, TASK)); 387 387
Note:
See TracChangeset
for help on using the changeset viewer.