static void sek_rp_write_thread(void *arg) { se_rwlock_ctx *ctx = arg; writers_running++; for (int iter = 0; iter < RWLOCK_TH_ITERS; iter++) { ctx->exlock(ctx->arg); { kernel_yield(); if (sekrp_vars[0] == sek_rp_set_1[0]) { sek_check_set_eq(sek_rp_set_1); sek_set_vars(sek_rp_set_2); } else { sek_check_set_eq(sek_rp_set_2); sek_set_vars(sek_rp_set_1); } kernel_yield(); } ctx->exunlock(ctx->arg); } writers_running--; }
static void sek_check_set_eq(const int *set) { for (u32 i = 0; i < ARRAY_SIZE(sekrp_vars); i++) { VERIFY(sekrp_vars[i] == set[i]); kernel_yield(); } }
static void sek_set_vars(const int *set) { for (u32 i = 0; i < ARRAY_SIZE(sekrp_vars); i++) { sekrp_vars[i] = set[i]; kernel_yield(); } }
void kmutex_lock(kmutex *m) { disable_preemption(); DEBUG_ONLY(check_not_in_irq_handler()); if (!m->owner_task) { /* Nobody owns this mutex, just make this task own it */ m->owner_task = get_curr_task(); if (m->flags & KMUTEX_FL_RECURSIVE) { ASSERT(m->lock_count == 0); m->lock_count++; } enable_preemption(); return; } if (m->flags & KMUTEX_FL_RECURSIVE) { ASSERT(m->lock_count > 0); if (kmutex_is_curr_task_holding_lock(m)) { m->lock_count++; enable_preemption(); return; } } else { ASSERT(!kmutex_is_curr_task_holding_lock(m)); } #if KMUTEX_STATS_ENABLED m->num_waiters++; m->max_num_waiters = MAX(m->num_waiters, m->max_num_waiters); #endif task_set_wait_obj(get_curr_task(), WOBJ_KMUTEX, m, &m->wait_list); enable_preemption(); kernel_yield(); // Go to sleep until someone else is holding the lock. /* ------------------- We've been woken up ------------------- */ #if KMUTEX_STATS_ENABLED m->num_waiters--; #endif /* Now for sure this task should hold the mutex */ ASSERT(kmutex_is_curr_task_holding_lock(m)); /* * DEBUG check: in case we went to sleep with a recursive mutex, then the * lock_count must be just 1 now. */ if (m->flags & KMUTEX_FL_RECURSIVE) { ASSERT(m->lock_count == 1); } }
/* wait until we can tx */ static void arm_uart_tx_wait(struct RS232 *rs232) { dint(); if (rs232->tx_cnt > 0) { rs232->tx_wait = 1; rs232->task = kernel_getTask(); kernel_suspend(); eint(); kernel_yield(); } eint(); }