// 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/cmdline.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)
