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
|
|
|
|
2017-02-01 03:26:08 +00:00
|
|
|
void KABI ke_spin_lock_init(k_spin_lock_t *lock)
|
2016-08-28 09:14:22 +00:00
|
|
|
{
|
|
|
|
if (lock != NULL)
|
|
|
|
{
|
|
|
|
lock->val = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-01 03:26:08 +00:00
|
|
|
void KABI ke_spin_lock(k_spin_lock_t *lock)
|
2016-08-28 09:14:22 +00:00
|
|
|
{
|
|
|
|
if (lock != NULL)
|
|
|
|
{
|
2016-09-13 04:41:09 +00:00
|
|
|
while (ke_interlocked_compare_exchange_32(&lock->val, 0, 1) != 0);
|
2016-08-28 09:14:22 +00:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-02-01 03:26:08 +00:00
|
|
|
void KABI ke_spin_unlock(k_spin_lock_t *lock)
|
2016-08-28 09:14:22 +00:00
|
|
|
{
|
|
|
|
if (lock != NULL)
|
|
|
|
{
|
|
|
|
lock->val = 0;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-02-01 03:26:08 +00:00
|
|
|
irql_t KABI ke_spin_lock_raise_irql(k_spin_lock_t *lock, irql_t irql)
|
2016-08-28 09:14:22 +00:00
|
|
|
{
|
2017-02-01 03:26:08 +00:00
|
|
|
irql_t prev_irql = ke_get_irql();
|
2016-08-28 09:14:22 +00:00
|
|
|
if (lock != NULL)
|
|
|
|
{
|
|
|
|
ke_raise_irql(irql);
|
|
|
|
ke_spin_lock(lock);
|
|
|
|
}
|
|
|
|
return prev_irql;
|
|
|
|
}
|
|
|
|
|
2017-02-01 03:26:08 +00:00
|
|
|
void KABI ke_spin_unlock_lower_irql(k_spin_lock_t *lock, irql_t irql)
|
2016-08-28 09:14:22 +00:00
|
|
|
{
|
|
|
|
if (lock != NULL)
|
|
|
|
{
|
|
|
|
ke_spin_unlock(lock);
|
|
|
|
ke_lower_irql(irql);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|