Changeset 8820544 in mainline for kernel/generic/src/ipc/event.c


Ignore:
Timestamp:
2014-08-16T00:02:04Z (10 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
35b8bfe, 8cd680c
Parents:
83f29e0
Message:

support for kernel notification multiplexing in the async framework

  • rename SYS_EVENT_* and SYS_IRQ_* syscalls to unify the terminology
  • add SYS_IPC_EVENT_UNSUBSCRIBE
  • remove IRQ handler multiplexing from DDF, the generic mechanism replaces it (unfortunatelly the order of arguments used by interrupt_handler_t needs to be permutated to align with the async framework conventions)
File:
1 edited

Legend:

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

    r83f29e0 r8820544  
    5858}
    5959
    60 static event_t *evno2event(int evno, task_t *t)
     60static event_t *evno2event(int evno, task_t *task)
    6161{
    6262        ASSERT(evno < EVENT_TASK_END);
    63 
     63       
    6464        event_t *event;
    65 
     65       
    6666        if (evno < EVENT_END)
    6767                event = &events[(event_type_t) evno];
    6868        else
    69                 event = &t->events[(event_task_type_t) evno - EVENT_END];
    70 
     69                event = &task->events[(event_task_type_t) evno - EVENT_END];
     70       
    7171        return event;
    7272}
     
    8686                event_initialize(evno2event(i, task));
    8787}
    88 
    8988
    9089/** Unsubscribe kernel events associated with an answerbox
     
    260259{
    261260        int res;
    262 
     261       
    263262        spinlock_lock(&event->lock);
    264263       
     
    277276}
    278277
     278/** Unsubscribe event notifications
     279 *
     280 * @param evno      Event type.
     281 * @param answerbox Answerbox used to send the notifications to.
     282 *
     283 * @return EOK if the subscription was successful.
     284 * @return EEXISTS if the notifications of the given type are
     285 *         already subscribed.
     286 *
     287 */
     288static int event_unsubscribe(event_t *event, answerbox_t *answerbox)
     289{
     290        int res;
     291       
     292        spinlock_lock(&event->lock);
     293       
     294        if (event->answerbox == answerbox) {
     295                event->answerbox = NULL;
     296                event->counter = 0;
     297                event->imethod = 0;
     298                event->masked = false;
     299                res = EOK;
     300        } else
     301                res = ENOENT;
     302       
     303        spinlock_unlock(&event->lock);
     304       
     305        return res;
     306}
     307
    279308/** Unmask event notifications
    280309 *
     
    297326}
    298327
    299 /** Event notification syscall wrapper
     328/** Event notification subscription syscall wrapper
    300329 *
    301330 * @param evno    Event type to subscribe.
     
    309338 *
    310339 */
    311 sysarg_t sys_event_subscribe(sysarg_t evno, sysarg_t imethod)
     340sysarg_t sys_ipc_event_subscribe(sysarg_t evno, sysarg_t imethod)
    312341{
    313342        if (evno >= EVENT_TASK_END)
     
    316345        return (sysarg_t) event_subscribe(evno2event(evno, TASK),
    317346            (sysarg_t) imethod, &TASK->answerbox);
     347}
     348
     349/** Event notification unsubscription syscall wrapper
     350 *
     351 * @param evno    Event type to unsubscribe.
     352 *
     353 * @return EOK on success.
     354 * @return ELIMIT on unknown event type.
     355 * @return ENOENT if the notification of the given type is not
     356           subscribed.
     357 *
     358 */
     359sysarg_t sys_ipc_event_unsubscribe(sysarg_t evno)
     360{
     361        if (evno >= EVENT_TASK_END)
     362                return ELIMIT;
     363       
     364        return (sysarg_t) event_unsubscribe(evno2event(evno, TASK),
     365            &TASK->answerbox);
    318366}
    319367
     
    331379 *
    332380 */
    333 sysarg_t sys_event_unmask(sysarg_t evno)
     381sysarg_t sys_ipc_event_unmask(sysarg_t evno)
    334382{
    335383        if (evno >= EVENT_TASK_END)
Note: See TracChangeset for help on using the changeset viewer.