// Copyright 2019 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 SRC_SYS_BIN_PSUTILS_PS_INTERNAL_H_
#define SRC_SYS_BIN_PSUTILS_PS_INTERNAL_H_

#include <stdio.h>
#include <zircon/types.h>

// These are only exposed for testing.

#define MAX_STATE_LEN (7 + 1)                        // +1 for trailing NUL
#define MAX_KOID_LEN sizeof("18446744073709551616")  // 1<<64 + NUL

// A single task (job or process).
typedef struct {
  char type;  // 'j' (job), 'p' (process), or 't' (thread)
  char koid_str[MAX_KOID_LEN];
  char parent_koid_str[MAX_KOID_LEN];
  int depth;
  char name[ZX_MAX_NAME_LEN];
  char state_str[MAX_STATE_LEN];
  size_t pss_bytes;
  size_t private_bytes;
  size_t shared_bytes;
} task_entry_t;

// An array of tasks.
typedef struct {
  task_entry_t* entries;
  size_t num_entries;
  size_t capacity;  // allocation size
} task_table_t;

// Controls what is shown.
typedef struct {
  bool also_show_threads;
  bool only_show_jobs;
  char format_unit;
} ps_options_t;

// Prints the contents of |table| to |out|.
void print_table(task_table_t* table, const ps_options_t* options, FILE* out);

void print_header(int id_w, const ps_options_t* options, FILE* out);

// Print to stdout all jobs in the system.
zx_status_t show_all_jobs(const ps_options_t* options);

// Print to stdout all jobs/processes/threads under the given job.
zx_status_t show_job_tree(zx_handle_t target_job, const ps_options_t* options);

#endif  // SRC_SYS_BIN_PSUTILS_PS_INTERNAL_H_
