// Copyright 2017 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

#include <inttypes.h>
#include <lib/ktrace.h>
#include <lib/syscalls/forward.h>
#include <trace.h>
#include <zircon/errors.h>
#include <zircon/types.h>

#include <fbl/alloc_checker.h>
#include <fbl/ref_ptr.h>
#include <ktl/algorithm.h>
#include <object/handle.h>
#include <object/process_dispatcher.h>
#include <object/timer_dispatcher.h>

#include <ktl/enforce.h>

// zx_status_t zx_timer_create
zx_status_t sys_timer_create(uint32_t options, zx_clock_t clock_id, user_out_handle* out) {
  if (clock_id != ZX_CLOCK_MONOTONIC)
    return ZX_ERR_INVALID_ARGS;

  auto up = ProcessDispatcher::GetCurrent();
  zx_status_t result = up->EnforceBasicPolicy(ZX_POL_NEW_TIMER);
  if (result != ZX_OK)
    return result;

  KernelHandle<TimerDispatcher> handle;
  zx_rights_t rights;

  result = TimerDispatcher::Create(options, &handle, &rights);

  if (result == ZX_OK)
    result = out->make(ktl::move(handle), rights);
  return result;
}

// zx_status_t zx_timer_set
zx_status_t sys_timer_set(zx_handle_t handle, zx_time_t deadline, zx_duration_t slack) {
  if (slack < 0) {
    return ZX_ERR_OUT_OF_RANGE;
  }

  auto up = ProcessDispatcher::GetCurrent();

  fbl::RefPtr<TimerDispatcher> timer;
  zx_status_t status =
      up->handle_table().GetDispatcherWithRights(*up, handle, ZX_RIGHT_WRITE, &timer);
  if (status != ZX_OK)
    return status;

  // Effective slack can only be increased so use max of the requested and the policy slack.
  const zx_duration_t policySlack = up->GetTimerSlackPolicy().amount();
  const zx_duration_t effectiveSlack = ktl::max(slack, policySlack);

  return timer->Set(deadline, effectiveSlack);
}

// zx_status_t zx_timer_cancel
zx_status_t sys_timer_cancel(zx_handle_t handle) {
  auto up = ProcessDispatcher::GetCurrent();

  fbl::RefPtr<TimerDispatcher> timer;
  zx_status_t status =
      up->handle_table().GetDispatcherWithRights(*up, handle, ZX_RIGHT_WRITE, &timer);
  if (status != ZX_OK)
    return status;

  return timer->Cancel();
}
