Subversion Repositories HelenOS-historic

Rev

Rev 411 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 411 Rev 413
Line 98... Line 98...
98
 */
98
 */
99
void timeout_register(timeout_t *t, __u64 time, timeout_handler_t f, void *arg)
99
void timeout_register(timeout_t *t, __u64 time, timeout_handler_t f, void *arg)
100
{
100
{
101
    timeout_t *hlp;
101
    timeout_t *hlp;
102
    link_t *l, *m;
102
    link_t *l, *m;
103
    pri_t pri;
103
    ipl_t ipl;
104
    __u64 sum;
104
    __u64 sum;
105
 
105
 
106
    pri = cpu_priority_high();
106
    ipl = interrupts_disable();
107
    spinlock_lock(&CPU->timeoutlock);
107
    spinlock_lock(&CPU->timeoutlock);
108
    spinlock_lock(&t->lock);
108
    spinlock_lock(&t->lock);
109
 
109
 
110
    if (t->cpu)
110
    if (t->cpu)
111
        panic("t->cpu != 0");
111
        panic("t->cpu != 0");
Line 150... Line 150...
150
        spinlock_unlock(&hlp->lock);
150
        spinlock_unlock(&hlp->lock);
151
    }
151
    }
152
 
152
 
153
    spinlock_unlock(&t->lock);
153
    spinlock_unlock(&t->lock);
154
    spinlock_unlock(&CPU->timeoutlock);
154
    spinlock_unlock(&CPU->timeoutlock);
155
    cpu_priority_restore(pri);
155
    interrupts_restore(ipl);
156
}
156
}
157
 
157
 
158
 
158
 
159
/** Unregister timeout
159
/** Unregister timeout
160
 *
160
 *
Line 166... Line 166...
166
 */
166
 */
167
bool timeout_unregister(timeout_t *t)
167
bool timeout_unregister(timeout_t *t)
168
{
168
{
169
    timeout_t *hlp;
169
    timeout_t *hlp;
170
    link_t *l;
170
    link_t *l;
171
    pri_t pri;
171
    ipl_t ipl;
172
 
172
 
173
grab_locks:
173
grab_locks:
174
    pri = cpu_priority_high();
174
    ipl = interrupts_disable();
175
    spinlock_lock(&t->lock);
175
    spinlock_lock(&t->lock);
176
    if (!t->cpu) {
176
    if (!t->cpu) {
177
        spinlock_unlock(&t->lock);
177
        spinlock_unlock(&t->lock);
178
        cpu_priority_restore(pri);
178
        interrupts_restore(ipl);
179
        return false;
179
        return false;
180
    }
180
    }
181
    if (!spinlock_trylock(&t->cpu->timeoutlock)) {
181
    if (!spinlock_trylock(&t->cpu->timeoutlock)) {
182
        spinlock_unlock(&t->lock);
182
        spinlock_unlock(&t->lock);
183
        cpu_priority_restore(pri);     
183
        interrupts_restore(ipl);       
184
        goto grab_locks;
184
        goto grab_locks;
185
    }
185
    }
186
   
186
   
187
    /*
187
    /*
188
     * Now we know for sure that t hasn't been activated yet
188
     * Now we know for sure that t hasn't been activated yet
Line 201... Line 201...
201
    spinlock_unlock(&t->cpu->timeoutlock);
201
    spinlock_unlock(&t->cpu->timeoutlock);
202
 
202
 
203
    timeout_reinitialize(t);
203
    timeout_reinitialize(t);
204
    spinlock_unlock(&t->lock);
204
    spinlock_unlock(&t->lock);
205
 
205
 
206
    cpu_priority_restore(pri);
206
    interrupts_restore(ipl);
207
    return true;
207
    return true;
208
}
208
}