bond/kernel/ke/rwwlock.c

100 lines
2.2 KiB
C
Raw Normal View History

2018-01-26 08:43:22 +00:00
#include "kernel/ke/rwwlock.h"
2016-08-27 05:13:54 +00:00
2016-09-13 04:41:09 +00:00
void ke_rwwlock_init(k_rwwlock_t *lock)
2016-08-27 05:13:54 +00:00
{
2016-09-13 04:41:09 +00:00
if (lock != NULL)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock_init(&lock->w_mutex);
ke_spin_lock_init(&lock->r_mutex);
ke_spin_lock_init(&lock->res_lock);
ke_spin_lock_init(&lock->r_try);
lock->reader_ct = 0;
lock->writer_ct = 0;
}
return;
}
2016-09-13 04:41:09 +00:00
void ke_rwwlock_reader_lock(k_rwwlock_t *lock)
2016-08-27 05:13:54 +00:00
{
2016-09-13 04:41:09 +00:00
if (lock != NULL)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock(&lock->r_try);
ke_spin_lock(&lock->r_mutex);
lock->reader_ct++;
2016-09-13 04:41:09 +00:00
if (lock->reader_ct == 1)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock(&lock->res_lock);
}
ke_spin_unlock(&lock->r_mutex);
ke_spin_unlock(&lock->r_try);
}
return;
}
2016-09-13 04:41:09 +00:00
void ke_rwwlock_reader_unlock(k_rwwlock_t *lock)
2016-08-27 05:13:54 +00:00
{
2016-09-13 04:41:09 +00:00
if (lock != NULL)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock(&lock->r_mutex);
lock->reader_ct--;
2016-09-13 04:41:09 +00:00
if (lock->reader_ct == 0)
2016-08-27 05:13:54 +00:00
{
ke_spin_unlock(&lock->res_lock);
}
ke_spin_unlock(&lock->r_mutex);
}
return;
}
2016-09-13 04:41:09 +00:00
void ke_rwwlock_writer_lock(k_rwwlock_t *lock)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock(&lock->w_mutex);
lock->writer_ct++;
2016-09-13 04:41:09 +00:00
if (lock->writer_ct == 1)
2016-08-27 05:13:54 +00:00
{
ke_spin_lock(&lock->r_try);
}
ke_spin_unlock(&lock->w_mutex);
ke_spin_lock(&lock->res_lock);
}
2016-09-13 04:41:09 +00:00
void ke_rwwlock_writer_unlock(k_rwwlock_t *lock)
2016-08-27 05:13:54 +00:00
{
ke_spin_unlock(&lock->res_lock);
ke_spin_lock(&lock->w_mutex);
lock->writer_ct--;
2016-09-13 04:41:09 +00:00
if (lock->writer_ct == 0)
2016-08-27 05:13:54 +00:00
{
ke_spin_unlock(&lock->r_try);
}
ke_spin_unlock(&lock->w_mutex);
}
2017-02-01 03:26:08 +00:00
irql_t ke_rwwlock_reader_lock_raise_irql(k_rwwlock_t *lock, irql_t irql)
2016-08-27 05:13:54 +00:00
{
2017-02-01 03:26:08 +00:00
irql_t old_irql = ke_raise_irql(irql);
2016-09-13 04:41:09 +00:00
ke_rwwlock_reader_lock(lock);
return old_irql;
2016-08-27 05:13:54 +00:00
}
2017-02-01 03:26:08 +00:00
void ke_rwwlock_reader_unlock_lower_irql(k_rwwlock_t *lock, irql_t irql)
2016-08-27 05:13:54 +00:00
{
2016-09-13 04:41:09 +00:00
ke_rwwlock_reader_unlock(lock);
ke_lower_irql(irql);
2016-08-27 05:13:54 +00:00
return;
}
2016-09-13 04:41:09 +00:00
2017-02-01 03:26:08 +00:00
irql_t ke_rwwlock_writer_lock_raise_irql(k_rwwlock_t *lock, irql_t irql)
2016-09-13 04:41:09 +00:00
{
2017-02-01 03:26:08 +00:00
irql_t old_irql = ke_raise_irql(irql);
2016-09-13 04:41:09 +00:00
ke_rwwlock_writer_lock(lock);
return old_irql;
}
2017-02-01 03:26:08 +00:00
void ke_rwwlock_writer_unlock_lower_irql(k_rwwlock_t *lock, irql_t irql)
2016-09-13 04:41:09 +00:00
{
ke_rwwlock_writer_unlock(lock);
ke_lower_irql(irql);
return;
}