diff --git a/kernel/atommutex.c b/kernel/atommutex.c index dc40b8c..db1d430 100755 --- a/kernel/atommutex.c +++ b/kernel/atommutex.c @@ -27,6 +27,78 @@ * POSSIBILITY OF SUCH DAMAGE. */ + +/** + * \file + * Mutex library. + * + * + * This module implements a mutual exclusion library with the following + * features: + * + * \par Flexible blocking APIs + * Threads which wish to take a mutex lock can choose whether to block, + * block with timeout, or not block if the mutex is already locked by a + * different thread. + * + * \par Interrupt-safe calls + * Some APIs can be called from interrupt context, but because a mutex + * must be owned by a particular thread the lock/unlock calls must be + * performed by threads only (i.e. it does not make sense to allow + * calls from interrupt context). All APIs are documented with their + * capability of being called from interrupt context. + * + * \par Priority-based queueing + * Where multiple threads are blocking on a mutex, they are woken in + * order of the threads' priorities. Where multiple threads of the same + * priority are blocking, they are woken in FIFO order. + * + * \par Recursive locks + * A mutex can be locked recursively by the same thread up to a + * maximum recursion level of 255. An internal count of locks is + * maintained and the mutex is only released when the count reaches + * zero (when the thread has been unlocked the same number of times + * as it was locked). This makes a mutex more suitable for use as + * mutual exclusions than a semaphore with initial count of 1. + * + * \par Thread ownership + * Once a thread has locked a mutex, only that thread may release the + * lock. This is another feature which makes the mutex more suitable + * for mutual exclusion than a semaphore with initial count 1. It + * prevents programming errors whereby the wrong thread is used to + * perform the unlock. This cannot be done for semaphores which do not + * have a concept of ownership (because it must be possible to use them + * to signal between threads). + * + * \par Smart mutex deletion + * Where a mutex is deleted while threads are blocking on it, all blocking + * threads are woken and returned an error code to indicate the reason for + * being woken. + * + * + * \n Usage instructions: \n + * + * All mutex objects must be initialised before use by calling + * atomMutexCreate(). Once initialised atomMutexGet() and atomMutexPut() + * are used to lock and unlock the mutex respectively. A mutex may be + * locked recursively by the same thread, allowing for simplified code + * structure. + * + * While a thread owns the lock on a mutex, no other thread can take the lock. + * These other threads will block until the mutex is released by the current + * owner (unless the calling parameters request no blocking, in which case the + * lock request will return with an error). If a mutex is released while + * threads are blocking on it, the highest priority thread is woken. Where + * multiple threads of the same priority are blocking, they are woken in the + * order in which the threads started blocking. + * + * A mutex which is no longer required can be deleted using atomMutexDelete(). + * This function automatically wakes up any threads which are waiting on the + * deleted mutex. + * + */ + + #include #include "atom.h" #include "atommutex.h" diff --git a/kernel/atomsem.c b/kernel/atomsem.c index 74206dc..06ed9b9 100755 --- a/kernel/atomsem.c +++ b/kernel/atomsem.c @@ -72,9 +72,9 @@ * the same priority are blocking, they are woken in the order in which the * threads started blocking. * - * Semaphores which are no longer required can be deleted using + * A semaphore which is no longer required can be deleted using * atomSemDelete(). This function automatically wakes up any threads which are - * waiting on a semaphore which is being deleted. + * waiting on the deleted semaphore. * * * \n Notes: \n