Subversion Repositories HelenOS

Rev

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

Rev 1593 Rev 1681
Line 97... Line 97...
97
        }
97
        }
98
 
98
 
99
        list_remove(&t->wq_link);
99
        list_remove(&t->wq_link);
100
        t->saved_context = t->sleep_timeout_context;
100
        t->saved_context = t->sleep_timeout_context;
101
        do_wakeup = true;
101
        do_wakeup = true;
102
       
-
 
103
        spinlock_unlock(&wq->lock);
-
 
104
        t->sleep_queue = NULL;
102
        t->sleep_queue = NULL;
-
 
103
        spinlock_unlock(&wq->lock);
105
    }
104
    }
106
   
105
   
107
    t->timeout_pending = false;
106
    t->timeout_pending = false;
108
    spinlock_unlock(&t->lock);
107
    spinlock_unlock(&t->lock);
109
   
108
   
Line 152... Line 151...
152
            t->timeout_pending = false;
151
            t->timeout_pending = false;
153
 
152
 
154
        list_remove(&t->wq_link);
153
        list_remove(&t->wq_link);
155
        t->saved_context = t->sleep_interruption_context;
154
        t->saved_context = t->sleep_interruption_context;
156
        do_wakeup = true;
155
        do_wakeup = true;
157
       
-
 
158
        spinlock_unlock(&wq->lock);
-
 
159
        t->sleep_queue = NULL;
156
        t->sleep_queue = NULL;
-
 
157
        spinlock_unlock(&wq->lock);
160
    }
158
    }
161
    spinlock_unlock(&t->lock);
159
    spinlock_unlock(&t->lock);
162
 
160
 
163
    if (do_wakeup)
161
    if (do_wakeup)
164
        thread_ready(t);
162
        thread_ready(t);
Line 416... Line 414...
416
        return;
414
        return;
417
    }
415
    }
418
 
416
 
419
    t = list_get_instance(wq->head.next, thread_t, wq_link);
417
    t = list_get_instance(wq->head.next, thread_t, wq_link);
420
   
418
   
-
 
419
    /*
-
 
420
     * Lock the thread prior to removing it from the wq.
-
 
421
     * This is not necessary because of mutual exclusion
-
 
422
     * (the link belongs to the wait queue), but because
-
 
423
     * of synchronization with waitq_timeouted_sleep()
-
 
424
     * and waitq_interrupt_sleep().
-
 
425
     *
-
 
426
     * In order for these two functions to work, the following
-
 
427
     * invariant must hold:
-
 
428
     *
-
 
429
     * t->sleep_queue != NULL <=> t sleeps in a wait queue
-
 
430
     *
-
 
431
     * For an observer who locks the thread, the invariant
-
 
432
     * holds only when the lock is held prior to removing
421
    list_remove(&t->wq_link);
433
     * it from the wait queue.
-
 
434
     */
422
    spinlock_lock(&t->lock);
435
    spinlock_lock(&t->lock);
-
 
436
    list_remove(&t->wq_link);
-
 
437
   
423
    if (t->timeout_pending && timeout_unregister(&t->sleep_timeout))
438
    if (t->timeout_pending && timeout_unregister(&t->sleep_timeout))
424
        t->timeout_pending = false;
439
        t->timeout_pending = false;
425
    t->sleep_queue = NULL;
440
    t->sleep_queue = NULL;
426
    spinlock_unlock(&t->lock);
441
    spinlock_unlock(&t->lock);
427
 
442