You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.7 KiB
85 lines
1.7 KiB
#ifndef __THREADS_H__ |
|
# define __THREADS_H__ |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#include <stddef.h> |
|
#include <stdint.h> |
|
|
|
//--- |
|
// Warnig, this part is experimental and reserved for Vhex |
|
//--- |
|
|
|
// Define Mutex type |
|
enum { |
|
mtx_plain = 0, |
|
mtx_recursive = 1, |
|
mtx_timed = 2 |
|
}; |
|
|
|
// Define mutex structure |
|
// @note: This is a custom implementation |
|
#define MTX_WATERMARK (0xdeadbeef) |
|
struct __mtx_s { |
|
uint32_t __watermark; |
|
uint16_t lock; |
|
uint8_t type; |
|
}; |
|
typedef struct __mtx_s mtx_t; |
|
|
|
|
|
//--- |
|
// Mutex functions |
|
//--- |
|
|
|
/* |
|
** Creates a new mutex object with type __TYPE. |
|
** @note: If successful the new object is pointed by __MUTEX. |
|
*/ |
|
extern int mtx_init(mtx_t *__mutex, int __type); |
|
|
|
/* |
|
** Block the current thread until the mutex pointed to by __MUTEX is unlocked. |
|
** In that case current thread will not be blocked. |
|
*/ |
|
extern int mtx_lock(mtx_t *__mutex); |
|
|
|
/* |
|
** Try to lock the mutex pointed by __MUTEX without blocking. |
|
** @note: If the mutex is free the current threads takes control of it, |
|
** otherwise it returns immediately. |
|
*/ |
|
extern int mtx_trylock(mtx_t *__mutex); |
|
|
|
/* |
|
** Unlock the mutex pointed by __MUTEX. |
|
** @note: It may potentially awake other threads waiting on this mutex. |
|
*/ |
|
extern int mtx_unlock (mtx_t *__mutex); |
|
|
|
/* Destroy the mutex object pointed by __MUTEX. */ |
|
extern void mtx_destroy(mtx_t *__mutex); |
|
|
|
|
|
//--- |
|
// Atomic operations |
|
//--- |
|
/* |
|
** Save the current SR register and set the SR.BIT bit up (start atomic operations) |
|
** @note: return the saved SR register (if has been saved), 0xffffffff otherwise. |
|
*/ |
|
extern uint32_t __thread_atomic_start(void); |
|
|
|
/* |
|
** Restore the saved SR register |
|
** @note: return the restored SR register or -1 otherwise. |
|
*/ |
|
extern uint32_t __thread_atomic_stop(void); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /*__THREADS_H__*/
|
|
|