| // Copyright 2017 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. |
| |
| #pragma once |
| |
| #include <zircon/compiler.h> |
| #include <zircon/types.h> |
| |
| __BEGIN_CDECLS |
| |
| // Called on a task (job/process/thread) node by walk_job_tree(). |
| // |
| // context: The same value passed to walk_[root_]job_tree(), letting callers pass |
| // a context (e.g., object or struct) into each callback of a walk. |
| // depth: The distance from root_job. root_job has depth 0, direct |
| // children have depth 1, and so on. |
| // task: A handle to the job/process/thread. Will be closed automatically |
| // after the callback returns, so callers should duplicate the handle |
| // if they want to use it later. |
| // koid: The koid of the task that the handle points to. |
| // parent_koid: The koid of the parent task (e.g., the process the contains the |
| // thread, the job that contains the process, or the job that contains the |
| // job). |
| // |
| // If the callback returns a value other than ZX_OK, the job tree walk will |
| // terminate without visiting any other node, and the zx_status_t value will be |
| // returned by walk_job_tree(). |
| typedef zx_status_t(task_callback_t)( |
| void* context, int depth, |
| zx_handle_t task, zx_koid_t koid, zx_koid_t parent_koid); |
| |
| // Walks the job/process/task tree rooted in root_job. Visits tasks in |
| // depth-first pre order. Any callback arg may be NULL. |
| // |context| is passed to all callbacks. |
| zx_status_t walk_job_tree(zx_handle_t root_job, |
| task_callback_t job_callback, |
| task_callback_t process_callback, |
| task_callback_t thread_callback, |
| void* context); |
| |
| // Calls walk_job_tree() on the system's root job. Will fail if the calling |
| // process does not have the rights to access the root job. |
| // TODO(dbort): Add a different lib/API to get the system root job and remove |
| // this function. |
| zx_status_t walk_root_job_tree(task_callback_t job_callback, |
| task_callback_t process_callback, |
| task_callback_t thread_callback, |
| void* context); |
| |
| __END_CDECLS |
| |
| // C++ interface |
| #ifdef __cplusplus |
| // Interface for walking a job tree. |
| class TaskEnumerator { |
| public: |
| // Each of these methods visits the corresponding task type. If any On*() |
| // method returns a value other than ZX_OK, the enumeration stops. See |
| // |task_callback_t| for a description of parameters. |
| virtual zx_status_t OnJob( |
| int depth, zx_handle_t job, zx_koid_t koid, zx_koid_t parent_koid) { |
| return ZX_ERR_NOT_SUPPORTED; |
| } |
| virtual zx_status_t OnProcess( |
| int depth, zx_handle_t process, zx_koid_t koid, zx_koid_t parent_koid) { |
| return ZX_ERR_NOT_SUPPORTED; |
| } |
| virtual zx_status_t OnThread( |
| int depth, zx_handle_t process, zx_koid_t koid, zx_koid_t parent_koid) { |
| return ZX_ERR_NOT_SUPPORTED; |
| } |
| |
| // Walks the job/process/task tree rooted in root_job. Visits tasks in |
| // depth-first pre order. |
| zx_status_t WalkJobTree(zx_handle_t root_job); |
| |
| // Calls WalkJobTree() on the system's root job. Will fail if the calling |
| // process does not have the rights to access the root job. |
| // TODO(dbort): Add a different lib/API to get the system root job and |
| // remove this function. |
| zx_status_t WalkRootJobTree(); |
| |
| protected: |
| TaskEnumerator() = default; |
| virtual ~TaskEnumerator() = default; |
| |
| // Subclasses must overload these to indicate which task types to actually |
| // visit. Avoids, e.g., visiting every thread in the system when a caller |
| // only cares about jobs. |
| virtual bool has_on_job() const { return false; } |
| virtual bool has_on_process() const { return false; } |
| virtual bool has_on_thread() const { return false; } |
| }; |
| #endif // __cplusplus |