예제 #1
0
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--;
}
예제 #2
0
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();
   }
}
예제 #3
0
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();
   }
}
예제 #4
0
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);
   }
}
예제 #5
0
/* 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();
}