// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

// This file defines:
// * Initialization code for kernel/object module
// * Singleton instances

#include <inttypes.h>
#include <lib/crashlog.h>
#include <zircon/boot/crash-reason.h>
#include <zircon/syscalls/object.h>
#include <zircon/types.h>

#include <lk/init.h>
#include <object/diagnostics.h>
#include <object/event_dispatcher.h>
#include <object/executor.h>
#include <object/job_dispatcher.h>
#include <object/memory_watchdog.h>
#include <platform/crashlog.h>
#include <platform/halt_helper.h>

static Executor gExecutor;

fbl::RefPtr<JobDispatcher> GetRootJobDispatcher() { return gExecutor.GetRootJobDispatcher(); }

Handle* GetRootJobHandle() { return gExecutor.GetRootJobHandle(); }

fbl::RefPtr<EventDispatcher> GetMemPressureEvent(uint32_t kind) {
  return gExecutor.GetMemPressureEvent(kind);
}

void StartRootJobObserver() { gExecutor.StartRootJobObserver(); }

static void object_init(uint level) TA_NO_THREAD_SAFETY_ANALYSIS {
  Handle::Init();

  gExecutor.Init();
}

LK_INIT_HOOK(libobject, object_init, LK_INIT_LEVEL_THREADING)
