123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #ifndef CHMTX_H
- #define CHMTX_H
- #if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
- typedef struct ch_mutex mutex_t;
- struct ch_mutex {
- threads_queue_t queue;
- thread_t *owner;
- mutex_t *next;
- #if (CH_CFG_USE_MUTEXES_RECURSIVE == TRUE) || defined(__DOXYGEN__)
- cnt_t cnt;
- #endif
- };
- #if (CH_CFG_USE_MUTEXES_RECURSIVE == TRUE) || defined(__DOXYGEN__)
- #define _MUTEX_DATA(name) {_THREADS_QUEUE_DATA(name.queue), NULL, NULL, 0}
- #else
- #define _MUTEX_DATA(name) {_THREADS_QUEUE_DATA(name.queue), NULL, NULL}
- #endif
- #define MUTEX_DECL(name) mutex_t name = _MUTEX_DATA(name)
- #ifdef __cplusplus
- extern "C" {
- #endif
- void chMtxObjectInit(mutex_t *mp);
- void chMtxLock(mutex_t *mp);
- void chMtxLockS(mutex_t *mp);
- bool chMtxTryLock(mutex_t *mp);
- bool chMtxTryLockS(mutex_t *mp);
- void chMtxUnlock(mutex_t *mp);
- void chMtxUnlockS(mutex_t *mp);
- void chMtxUnlockAll(void);
- void chMtxUnlockAllS(void);
- #ifdef __cplusplus
- }
- #endif
- static inline bool chMtxQueueNotEmptyS(mutex_t *mp) {
- chDbgCheckClassS();
- return queue_notempty(&mp->queue);
- }
- static inline thread_t *chMtxGetOwnerI(mutex_t *mp) {
- chDbgCheckClassI();
- return mp->owner;
- }
- static inline mutex_t *chMtxGetNextMutexX(void) {
- return chThdGetSelfX()->mtxlist;
- }
- #endif
- #endif
|