Subversion Repositories HelenOS-historic

Rev

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

Rev 1375 Rev 1467
Line 222... Line 222...
222
    ipl_t ipl;
222
    ipl_t ipl;
223
   
223
   
224
restart:
224
restart:
225
    ipl = interrupts_disable();
225
    ipl = interrupts_disable();
226
 
226
 
-
 
227
    if (THREAD) {   /* needed during system initiailzation */
227
    /*
228
        /*
228
     * Busy waiting for a delayed timeout.
229
         * Busy waiting for a delayed timeout.
229
     * This is an important fix for the race condition between
230
         * This is an important fix for the race condition between
230
     * a delayed timeout and a next call to waitq_sleep_timeout().
231
         * a delayed timeout and a next call to waitq_sleep_timeout().
231
     * Simply, the thread is not allowed to go to sleep if
232
         * Simply, the thread is not allowed to go to sleep if
232
     * there are timeouts in progress.
233
         * there are timeouts in progress.
233
     */
234
         */
234
    spinlock_lock(&THREAD->lock);
235
        spinlock_lock(&THREAD->lock);
235
    if (THREAD->timeout_pending) {
236
        if (THREAD->timeout_pending) {
-
 
237
            spinlock_unlock(&THREAD->lock);
-
 
238
            interrupts_restore(ipl);
-
 
239
            goto restart;
-
 
240
        }
236
        spinlock_unlock(&THREAD->lock);
241
        spinlock_unlock(&THREAD->lock);
237
        interrupts_restore(ipl);
-
 
238
        goto restart;
-
 
239
    }
242
    }
240
    spinlock_unlock(&THREAD->lock);
-
 
241
                                                   
243
                                                   
242
    spinlock_lock(&wq->lock);
244
    spinlock_lock(&wq->lock);
243
    return ipl;
245
    return ipl;
244
}
246
}
245
 
247