// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GARNET_LIB_DEBUGGER_UTILS_THREADS_H_
#define GARNET_LIB_DEBUGGER_UTILS_THREADS_H_

#include <functional>
#include <string>
#include <vector>

#include <lib/zx/job.h>
#include <lib/zx/thread.h>
#include <lib/zx/time.h>

namespace debugger_utils {

using WithThreadSuspendedFunction =
    std::function<zx_status_t(const zx::thread& thread)>;

// Return the thread's current state according to the o/s.
// The result is one if ZX_THREAD_STATE_*.
uint32_t GetThreadOsState(zx_handle_t thread);

// Return the thread's current state according to the o/s.
// The result is one if ZX_THREAD_STATE_*.
uint32_t GetThreadOsState(const zx::thread& thread);

// Return the name of ZX_THREAD_STATE_* value |state|.
// Returns nullptr if |state| is invalid.
const char* ThreadOsStateName(uint32_t state);

// Return the name of ZX_THREAD_STATE_* value |state|.
// Returns UNKNOWN(value) if |state| is invalid.
const std::string ThreadOsStateNameAsString(uint32_t state);

// Suspend |thread| and then run |function|.
// If waiting for |thread| to suspend times out then |function| is not called,
// and the result is ZX_ERR_TIMED_OUT.
// If the thread terminates while waiting for it to suspend then the result
// is ZX_ERR_NOT_FOUND.
// Otherwise the result is the result of |function|.
zx_status_t WithThreadSuspended(
    const zx::thread& thread, zx::duration thread_suspend_timeout,
    const WithThreadSuspendedFunction& function);

// Suspend all |threads|, run |function| on each one in order, and then
// resume them. If any call to |function| returns !ZX_OK then the iteration
// stops immediately and the result of this function is that status.
// If any thread terminates while waiting for it to suspend then that thread
// is ignored but the other threads are processed.
// If waiting for a thread to suspend times out then |function| is not called
// on any thread, and the result is ZX_ERR_TIMED_OUT.
// Otherwise the result is ZX_OK.
zx_status_t WithAllThreadsSuspended(
    const std::vector<zx::thread>& threads,
    zx::duration thread_suspend_timeout,
    const WithThreadSuspendedFunction& function);

// Print a dump of |thread| suitable for use with the symbolizer.
// If |in_exception| is true then the thread is in an exception and extra
// information related to the exception is printed.
// If |in_exception| is false then the thread must be suspended.
void DumpThread(zx_handle_t process, zx_handle_t thread, bool in_exception);

}  // namespace debugger_utils

#endif  // GARNET_LIB_DEBUGGER_UTILS_THREADS_H_
