Changeset 624 for trunk/kernel/libk/remote_busylock.h
- Timestamp:
- Mar 12, 2019, 1:37:38 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/libk/remote_busylock.h
r619 r624 2 2 * remote_busylock.h: remote kernel busy-waiting lock definition. 3 3 * 4 * Authors Alain Greiner (2016,2017,2018 )4 * Authors Alain Greiner (2016,2017,2018,2019) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 37 37 * higher level synchronisation objects, such as remote_queuelock and remote_rwlock. 38 38 * 39 * WARNING: a thread cannot yield when it is owning a busylock (local or remote).40 *41 39 * - To acquire the lock, we use a ticket policy to avoid starvation: the calling thread 42 40 * makes an atomic increment on a "ticket" allocator, and keep polling the "current" 43 41 * value until current == ticket. 44 42 * 45 * - To release the lock, the owner thread increments the "current" value, 46 * decrements its busylocks counter. 43 * - To release the lock, the owner thread increments the "current" value. 47 44 * 48 * - When a thread takes a busylock, it enters a critical section: the busylock_acquire()45 * - When a thread takes a busylock, it enters a critical section: the acquire() 49 46 * function disables the IRQs, takes the lock, increments the thread busylocks counter, 50 * 47 * save the SR in the lock descriptor and returns. 51 48 * 52 * - The busylock_release() function decrements the thread busylock counter,53 * restores the SR to exit the critical section, and returns49 * - The release() function releases the lock, decrements the thread busylock 50 * counter, restores the SR to exit the critical section, and returns. 54 51 * 55 * - If a thread owning a busylock (local or remote) tries to deschedule, the scheduler 56 * signals a kernel panic. 52 * WARNING: a thread cannot yield when it is holding a busylock (local or remote). 53 * 54 * This rule is checked by all functions containing a thread_yield() AND by the scheduler, 55 * thanks to the busylocks counter stored in the calling thread descriptor. 56 * 1) all functions call "thread_assert_can_yield()" before calling "thread_yield()". 57 * 2) The scheduler checks that the calling thread does not hold any busylock. 58 * In case of violation the core goes to sleep after a [PANIC] message on TXT0. 57 59 ******************************************************************************************/ 58 60
Note: See TracChangeset
for help on using the changeset viewer.