3

thread.c の Schedule() は、現在実行中のスレッドと準備完了リスト内の次のスレッドを取得し、次のスレッドがスレッドであることを ASSERT します (is_thread(t) は t != NULL と t->magic = をチェックします)。 = THREAD_MAGIC)。現在、次のエラーが発生しています。

Kernel PANIC at ../../threads/thread.c:563 in schedule(): assertion 'is_thread(next)' failed.

現在、ビジー待機を行わないように timer_sleep を実装しています。ここに私の timer_sleep 関数があります:

void
timer_sleep (int64_t ticks) 
{
  if (ticks > 0)
  {
    ASSERT (intr_get_level () == INTR_ON);
    enum intr_level old_level;
    old_level = intr_disable ();

    struct thread *current_thread;
    current_thread = thread_current();

    int64_t wake_tick = timer_ticks() + ticks;
    current_thread->wake_tick = wake_tick;

    list_insert_ordered (&sleep_list, &current_thread->timer_elem, cmp_wake_ticks, NULL);
    thread_block();

    intr_set_level(old_level);
  }
}

そして私のtimer_interrupt:

static void
timer_interrupt (struct intr_frame *args UNUSED)
{
  enum intr_level old_level;
  old_level = intr_disable ();

  ticks++;
  thread_tick ();

  struct list_elem* sl_elem;
  struct thread* sl_thread;
  while(!list_empty(&sleep_list))
  {
    sl_elem = list_front(&sleep_list);
    sl_thread = list_entry(sl_elem, struct thread, timer_elem);

    if (sl_thread->wake_tick > ticks)
    {
      break;
    }

    thread_unblock(sl_thread);
    list_remove(sl_elem);
  }

  intr_set_level (old_level);
}

ready_list に何かが追加されている唯一の場所は、ASSERT is_thread も行う thread_unblock 内にあるため、スレッド以外の何かが Ready リストに追加される場所はわかりません。timer_elem を thread.h に追加し、スレッド cmp_wake_ticks 関数を追加する以外に、基本コードに変更を加えていません。

4

0 に答える 0