Subversion Repositories HelenOS

Rev

Rev 4377 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4377 Rev 4692
Line 62... Line 62...
62
        events[i].counter = 0;
62
        events[i].counter = 0;
63
        events[i].method = 0;
63
        events[i].method = 0;
64
    }
64
    }
65
}
65
}
66
 
66
 
67
static int
-
 
68
event_subscribe(event_type_t evno, unative_t method, answerbox_t *answerbox)
67
static int event_subscribe(event_type_t evno, unative_t method,
-
 
68
    answerbox_t *answerbox)
69
{
69
{
70
    if (evno >= EVENT_END)
70
    if (evno >= EVENT_END)
71
        return ELIMIT;
71
        return ELIMIT;
72
   
72
   
73
    spinlock_lock(&events[evno].lock);
73
    spinlock_lock(&events[evno].lock);
Line 120... Line 120...
120
        }
120
        }
121
        spinlock_unlock(&events[i].lock);
121
        spinlock_unlock(&events[i].lock);
122
    }
122
    }
123
}
123
}
124
 
124
 
125
void
-
 
126
event_notify(event_type_t evno, unative_t a1, unative_t a2, unative_t a3,
125
void event_notify(event_type_t evno, unative_t a1, unative_t a2, unative_t a3,
127
    unative_t a4, unative_t a5)
126
    unative_t a4, unative_t a5)
128
{
127
{
129
    ASSERT(evno < EVENT_END);
128
    ASSERT(evno < EVENT_END);
130
   
129
   
131
    spinlock_lock(&events[evno].lock);
130
    spinlock_lock(&events[evno].lock);
Line 139... Line 138...
139
            IPC_SET_ARG2(call->data, a2);
138
            IPC_SET_ARG2(call->data, a2);
140
            IPC_SET_ARG3(call->data, a3);
139
            IPC_SET_ARG3(call->data, a3);
141
            IPC_SET_ARG4(call->data, a4);
140
            IPC_SET_ARG4(call->data, a4);
142
            IPC_SET_ARG5(call->data, a5);
141
            IPC_SET_ARG5(call->data, a5);
143
           
142
           
-
 
143
            ipl_t ipl = interrupts_disable();
144
            spinlock_lock(&events[evno].answerbox->irq_lock);
144
            spinlock_lock(&events[evno].answerbox->irq_lock);
145
            list_append(&call->link, &events[evno].answerbox->irq_notifs);
145
            list_append(&call->link, &events[evno].answerbox->irq_notifs);
146
            spinlock_unlock(&events[evno].answerbox->irq_lock);
146
            spinlock_unlock(&events[evno].answerbox->irq_lock);
-
 
147
            interrupts_restore(ipl);
147
           
148
           
148
            waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST);
149
            waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST);
149
        }
150
        }
150
    }
151
    }
151
    spinlock_unlock(&events[evno].lock);
152
    spinlock_unlock(&events[evno].lock);