bond/kernel/ke/spin_lock.c

51 lines
777 B
C
Raw Normal View History

2018-01-26 08:43:22 +00:00
#include "kernel/ke/atomic.h"
#include "kernel/ke/spin_lock.h"
2016-08-28 09:14:22 +00:00
2018-02-18 07:48:59 +00:00
void SXAPI ke_spin_lock_init(k_spin_lock_t *lock)
2016-08-28 09:14:22 +00:00
{
2018-02-18 04:06:57 +00:00
if (lock != NULL)
{
lock->val = 0;
}
2016-08-28 09:14:22 +00:00
}
2018-02-18 07:48:59 +00:00
void SXAPI ke_spin_lock(k_spin_lock_t *lock)
2016-08-28 09:14:22 +00:00
{
2018-02-18 04:06:57 +00:00
if (lock != NULL)
{
while (ke_interlocked_compare_exchange_32(&lock->val, 0, 1) != 0)
{}
}
return;
2016-08-28 09:14:22 +00:00
}
2018-02-18 07:48:59 +00:00
void SXAPI ke_spin_unlock(k_spin_lock_t *lock)
2016-08-28 09:14:22 +00:00
{
2018-02-18 04:06:57 +00:00
if (lock != NULL)
{
lock->val = 0;
}
return;
2016-08-28 09:14:22 +00:00
}
2018-03-24 00:58:24 +00:00
k_irql SXAPI ke_spin_lock_raise_irql(k_spin_lock_t *lock, k_irql irql)
2016-08-28 09:14:22 +00:00
{
2018-03-24 00:58:24 +00:00
k_irql prev_irql = ke_get_irql();
2018-02-18 04:06:57 +00:00
if (lock != NULL)
{
ke_raise_irql(irql);
ke_spin_lock(lock);
}
return prev_irql;
2016-08-28 09:14:22 +00:00
}
2018-03-24 00:58:24 +00:00
void SXAPI ke_spin_unlock_lower_irql(k_spin_lock_t *lock, k_irql irql)
2016-08-28 09:14:22 +00:00
{
2018-02-18 04:06:57 +00:00
if (lock != NULL)
{
ke_spin_unlock(lock);
ke_lower_irql(irql);
}
return;
2018-03-24 00:58:24 +00:00
}