123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- #ifndef __ASM_SEMAPHORE_H__
- #define __ASM_SEMAPHORE_H__
- #define CONFIG_JFFS2_SEMAPHORE 0 // no mutex, 1 use static, 2 use dynamic
- #if CONFIG_JFFS2_SEMAPHORE == 0
- //#include <cyg/hal/drv_api.h>
- struct semaphore {
- int x;
- };
- #define DECLARE_MUTEX(x)
- #define DECLARE_MUTEX_LOCKED(x)
- #define init_MUTEX(sem)
- #define init_MUTEX_LOCKED(sem)
- #define down(sem)
- #define down_interruptible(sem) 0
- #define down_trylock(sem)
- #define up(sem)
- #elif CONFIG_JFFS2_SEMAPHORE == 1
- #include <rtthread.h>
- struct semaphore {
- struct rt_mutex mutex;
- };
- #define DECLARE_MUTEX(x)
- #define DECLARE_MUTEX_LOCKED(x)
- rt_inline void init_MUTEX(struct semaphore * sem)
- {
- if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
- {
- /* detach the object from system object container */
- rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
- return;
- }
- rt_kprintf("get an error at %s:%d \n", __FUNCTION__, __LINE__);
- RT_ASSERT(0);
- }
- rt_inline void init_MUTEX_LOCKED(struct semaphore * sem)
- {
- rt_enter_critical();
- if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
- {
- /* detach the object from system object container */
- rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
- rt_exit_critical();
- rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
- return;
- }
- rt_exit_critical();
- rt_kprintf("get an error at %s:%d \n", __FUNCTION__, __LINE__);
- RT_ASSERT(0);
- }
- rt_inline down(struct semaphore * sem)
- {
- rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
- }
- rt_inline int down_interruptible(struct semaphore* sem)
- {
- rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
- return 0;
- }
- rt_inline up(struct semaphore * sem)
- {
- rt_mutex_release((rt_mutex_t)sem);
- }
- #elif CONFIG_JFFS2_SEMAPHORE == 2
- #include <rtthread.h>
- struct semaphore {
- rt_mutex_t mutex;
- };
- #define DECLARE_MUTEX(x)
- #define DECLARE_MUTEX_LOCKED(x)
- rt_inline void init_MUTEX(struct semaphore * sem)
- {
- sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
- }
- rt_inline init_MUTEX_LOCKED(struct semaphore * sem)
- {
- sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
- rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
- }
- rt_inline down(struct semaphore * sem)
- {
- rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
- }
- rt_inline int down_interruptible(struct semaphore* sem)
- {
- rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
- return 0;
- }
- /*
- Attempt to lock the mutex pointed to by the mutex argument without waiting.
- If the mutex is already locked by some other thread then this function
- returns FALSE. If the function can lock the mutex without waiting, then
- TRUE is returned.
- void cyg_drv_mutex_unlock( cyg_drv_mutex *mutex )
- */
- //#define down_trylock(struct semaphore * sem) rt_mutex_take((rt_mutex_t)sem, RT_WAITING_NO)
- rt_inline up(struct semaphore * sem)
- {
- rt_mutex_release(sem->mutex);
- }
- #else
- #error "CONFIG_JFFS2_SEMAPHORE should be 0, 1 or 2"
- #endif
- #endif /* __ASM_SEMAPHORE_H__ */
|