1#ifndef __LWP_MUTEX_INL__
2#define __LWP_MUTEX_INL__
3
4static __inline__ u32 __lwp_mutex_locked(lwp_mutex *mutex)
5{
6	return (mutex->lock==LWP_MUTEX_LOCKED);
7}
8
9static __inline__ u32 __lwp_mutex_ispriority(lwp_mutex_attr *attrs)
10{
11	return (attrs->mode==LWP_MUTEX_PRIORITY);
12}
13
14static __inline__ u32 __lwp_mutex_isfifo(lwp_mutex_attr *attrs)
15{
16	return (attrs->mode==LWP_MUTEX_FIFO);
17}
18
19static __inline__ u32 __lwp_mutex_isinheritprio(lwp_mutex_attr *attrs)
20{
21	return (attrs->mode==LWP_MUTEX_INHERITPRIO);
22}
23
24static __inline__ u32 __lwp_mutex_isprioceiling(lwp_mutex_attr *attrs)
25{
26	return (attrs->mode==LWP_MUTEX_PRIORITYCEIL);
27}
28
29static __inline__ u32 __lwp_mutex_seize_irq_trylock(lwp_mutex *mutex,u32 *isr_level)
30{
31	lwp_cntrl *exec;
32	u32 level = *isr_level;
33
34	exec = _thr_executing;
35	exec->wait.ret_code = LWP_MUTEX_SUCCESSFUL;
36	if(!__lwp_mutex_locked(mutex)) {
37		mutex->lock = LWP_MUTEX_LOCKED;
38		mutex->holder = exec;
39		mutex->nest_cnt = 1;
40		if(__lwp_mutex_isinheritprio(&mutex->atrrs) || __lwp_mutex_isprioceiling(&mutex->atrrs))
41			exec->res_cnt++;
42		if(!__lwp_mutex_isprioceiling(&mutex->atrrs)) {
43			_CPU_ISR_Restore(level);
44			return 0;
45		}
46		{
47			u32 prioceiling,priocurr;
48
49			prioceiling = mutex->atrrs.prioceil;
50			priocurr = exec->cur_prio;
51			if(priocurr==prioceiling) {
52				_CPU_ISR_Restore(level);
53				return 0;
54			}
55			if(priocurr>prioceiling) {
56				__lwp_thread_dispatchdisable();
57				_CPU_ISR_Restore(level);
58				__lwp_thread_changepriority(mutex->holder,mutex->atrrs.prioceil,FALSE);
59				__lwp_thread_dispatchenable();
60				return 0;
61			}
62			exec->wait.ret_code = LWP_MUTEX_CEILINGVIOL;
63			mutex->nest_cnt = 0;
64			exec->res_cnt--;
65			_CPU_ISR_Restore(level);
66			return 0;
67		}
68		return 0;
69	}
70
71	if(__lwp_thread_isexec(mutex->holder)) {
72		switch(mutex->atrrs.nest_behavior) {
73			case LWP_MUTEX_NEST_ACQUIRE:
74				mutex->nest_cnt++;
75				_CPU_ISR_Restore(level);
76				return 0;
77			case LWP_MUTEX_NEST_ERROR:
78				exec->wait.ret_code = LWP_MUTEX_NEST_NOTALLOWED;
79				_CPU_ISR_Restore(level);
80				return 0;
81			case LWP_MUTEX_NEST_BLOCK:
82				break;
83		}
84	}
85	return 1;
86}
87
88#endif
89