xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/jffs2/kernel/asm/semaphore.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero #ifndef __ASM_SEMAPHORE_H__
2*10465441SEvalZero #define __ASM_SEMAPHORE_H__
3*10465441SEvalZero 
4*10465441SEvalZero #define CONFIG_JFFS2_SEMAPHORE  0 // no mutex, 1 use static, 2 use dynamic
5*10465441SEvalZero #if CONFIG_JFFS2_SEMAPHORE == 0
6*10465441SEvalZero //#include <cyg/hal/drv_api.h>
7*10465441SEvalZero 
8*10465441SEvalZero struct semaphore {
9*10465441SEvalZero 	int x;
10*10465441SEvalZero };
11*10465441SEvalZero 
12*10465441SEvalZero #define DECLARE_MUTEX(x)
13*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
14*10465441SEvalZero 
15*10465441SEvalZero #define init_MUTEX(sem)
16*10465441SEvalZero #define init_MUTEX_LOCKED(sem)
17*10465441SEvalZero #define down(sem)
18*10465441SEvalZero #define down_interruptible(sem)  0
19*10465441SEvalZero #define down_trylock(sem)
20*10465441SEvalZero #define up(sem)
21*10465441SEvalZero 
22*10465441SEvalZero #elif CONFIG_JFFS2_SEMAPHORE == 1
23*10465441SEvalZero #include <rtthread.h>
24*10465441SEvalZero 
25*10465441SEvalZero struct semaphore {
26*10465441SEvalZero 	struct rt_mutex mutex;
27*10465441SEvalZero };
28*10465441SEvalZero 
29*10465441SEvalZero #define DECLARE_MUTEX(x)
30*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
init_MUTEX(struct semaphore * sem)31*10465441SEvalZero rt_inline void init_MUTEX(struct semaphore * sem)
32*10465441SEvalZero {
33*10465441SEvalZero    if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
34*10465441SEvalZero    {
35*10465441SEvalZero 	   /* detach the object from system object container */
36*10465441SEvalZero 	   rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
37*10465441SEvalZero 	   return;
38*10465441SEvalZero    }
39*10465441SEvalZero    rt_kprintf("get an error at %s:%d \n",  __FUNCTION__, __LINE__);
40*10465441SEvalZero    RT_ASSERT(0);
41*10465441SEvalZero }
42*10465441SEvalZero 
init_MUTEX_LOCKED(struct semaphore * sem)43*10465441SEvalZero rt_inline void init_MUTEX_LOCKED(struct semaphore * sem)
44*10465441SEvalZero {
45*10465441SEvalZero    rt_enter_critical();
46*10465441SEvalZero    if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
47*10465441SEvalZero    {
48*10465441SEvalZero 	   /* detach the object from system object container */
49*10465441SEvalZero 	   rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
50*10465441SEvalZero 	   rt_exit_critical();
51*10465441SEvalZero 	   rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
52*10465441SEvalZero 	   return;
53*10465441SEvalZero    }
54*10465441SEvalZero    rt_exit_critical();
55*10465441SEvalZero 
56*10465441SEvalZero    rt_kprintf("get an error at %s:%d \n",  __FUNCTION__, __LINE__);
57*10465441SEvalZero    RT_ASSERT(0);
58*10465441SEvalZero }
59*10465441SEvalZero 
down(struct semaphore * sem)60*10465441SEvalZero rt_inline down(struct semaphore * sem)
61*10465441SEvalZero {
62*10465441SEvalZero 	rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
63*10465441SEvalZero }
down_interruptible(struct semaphore * sem)64*10465441SEvalZero rt_inline int down_interruptible(struct semaphore* sem)
65*10465441SEvalZero {
66*10465441SEvalZero 	rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
67*10465441SEvalZero     return 0;
68*10465441SEvalZero }
up(struct semaphore * sem)69*10465441SEvalZero rt_inline up(struct semaphore * sem)
70*10465441SEvalZero {
71*10465441SEvalZero 	rt_mutex_release((rt_mutex_t)sem);
72*10465441SEvalZero }
73*10465441SEvalZero #elif CONFIG_JFFS2_SEMAPHORE == 2
74*10465441SEvalZero 
75*10465441SEvalZero #include <rtthread.h>
76*10465441SEvalZero 
77*10465441SEvalZero struct semaphore {
78*10465441SEvalZero 	 rt_mutex_t mutex;
79*10465441SEvalZero };
80*10465441SEvalZero 
81*10465441SEvalZero #define DECLARE_MUTEX(x)
82*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
83*10465441SEvalZero 
init_MUTEX(struct semaphore * sem)84*10465441SEvalZero rt_inline void init_MUTEX(struct semaphore * sem)
85*10465441SEvalZero {
86*10465441SEvalZero 	sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
87*10465441SEvalZero }
init_MUTEX_LOCKED(struct semaphore * sem)88*10465441SEvalZero rt_inline init_MUTEX_LOCKED(struct semaphore * sem)
89*10465441SEvalZero {
90*10465441SEvalZero 	sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
91*10465441SEvalZero 	rt_mutex_take(sem->mutex,  RT_WAITING_FOREVER);
92*10465441SEvalZero }
down(struct semaphore * sem)93*10465441SEvalZero rt_inline down(struct semaphore * sem)
94*10465441SEvalZero {
95*10465441SEvalZero 	rt_mutex_take(sem->mutex,  RT_WAITING_FOREVER);
96*10465441SEvalZero }
down_interruptible(struct semaphore * sem)97*10465441SEvalZero rt_inline int down_interruptible(struct semaphore* sem)
98*10465441SEvalZero {
99*10465441SEvalZero 	rt_mutex_take(sem->mutex,  RT_WAITING_FOREVER);
100*10465441SEvalZero     return 0;
101*10465441SEvalZero }
102*10465441SEvalZero /*
103*10465441SEvalZero Attempt to lock the mutex pointed to by the mutex argument without waiting.
104*10465441SEvalZero If the mutex is already locked by some other thread then this function
105*10465441SEvalZero returns FALSE. If the function can lock the mutex without waiting, then
106*10465441SEvalZero TRUE is returned.
107*10465441SEvalZero void cyg_drv_mutex_unlock( cyg_drv_mutex *mutex )
108*10465441SEvalZero */
109*10465441SEvalZero 
110*10465441SEvalZero //#define down_trylock(struct semaphore * sem)  rt_mutex_take((rt_mutex_t)sem,  RT_WAITING_NO)
up(struct semaphore * sem)111*10465441SEvalZero rt_inline up(struct semaphore * sem)
112*10465441SEvalZero {
113*10465441SEvalZero 	rt_mutex_release(sem->mutex);
114*10465441SEvalZero }
115*10465441SEvalZero 
116*10465441SEvalZero #else
117*10465441SEvalZero #error "CONFIG_JFFS2_SEMAPHORE should be 0, 1 or 2"
118*10465441SEvalZero #endif
119*10465441SEvalZero 
120*10465441SEvalZero #endif /* __ASM_SEMAPHORE_H__ */
121