| // 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. |
| |
| // |
| // The ABI-stable entry points used by trace instrumentation libraries. |
| // |
| // These functions are used to write trace records into the trace buffer |
| // associated with a trace context. |
| // |
| // Writing trace records is intended to be very fast but the cost varies |
| // depending on the size and complexity of the event and any arguments |
| // which are associated with it. |
| // |
| // At this time, there exists only one trace context, the engine's trace context, |
| // which can be acquired and released using the functions in |
| // <trace-engine/instrumentation.h>. In the future, this API may be extended |
| // to support trace contexts with different scopes. |
| // |
| // Client code shouldn't be using these APIs directly. |
| // See <trace/event.h> for instrumentation macros. |
| // |
| |
| #ifndef ZIRCON_SYSTEM_ULIB_LIB_TRACE_ENGINE_CONTEXT_H_ |
| #define ZIRCON_SYSTEM_ULIB_LIB_TRACE_ENGINE_CONTEXT_H_ |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <string.h> |
| |
| #include <zircon/assert.h> |
| #include <zircon/compiler.h> |
| #include <zircon/syscalls/object.h> |
| #include <zircon/types.h> |
| |
| #include <lib/trace-engine/types.h> |
| |
| __BEGIN_CDECLS |
| |
| // Opaque type representing a trace context. |
| // Most functions in this header require a valid trace context to operate. |
| typedef struct trace_context trace_context_t; |
| |
| // Opaque type representing a trace context that is held for prolonged |
| // periods of time. |
| typedef struct trace_prolonged_context trace_prolonged_context_t; |
| |
| // Returns true if tracing of the specified category has been enabled. |
| // |
| // Use |trace_context_register_category_literal()| if you intend to immediately |
| // write a record into the trace buffer after checking the category. |
| // |
| // |context| must be a valid trace context reference. |
| // |category_literal| must be a null-terminated static string constant. |
| // |
| // This function is thread-safe. |
| bool trace_context_is_category_enabled(trace_context_t* context, const char* category_literal); |
| |
| // Registers a copy of a string into the string table. |
| // |
| // Writes a string record into the trace buffer if the string was added to the |
| // string table. If the string table is full, returns an inline string reference. |
| // |
| // |context| must be a valid trace context reference. |
| // |string| must be the string to register. |
| // |length| must be the length of the string. |
| // |out_ref| points to where the registered string reference should be returned. |
| // |
| // This function is thread-safe. |
| void trace_context_register_string_copy(trace_context_t* context, const char* string, size_t length, |
| trace_string_ref_t* out_ref); |
| |
| // Registers a copy of a string and returns its string ref. |
| // Helper for |trace_context_register_thread()|. |
| static inline trace_string_ref_t trace_context_make_registered_string_copy(trace_context_t* context, |
| const char* string, |
| size_t length) { |
| trace_string_ref_t ref; |
| trace_context_register_string_copy(context, string, length, &ref); |
| return ref; |
| } |
| |
| // Registers a string literal into the string table keyed by its address in memory. |
| // |
| // The trace context caches the string so that subsequent registrations using |
| // the same memory address may return the same indexed string reference if |
| // found in the cache. |
| // |
| // Writes a string record into the trace buffer if the string was added to the |
| // string table. If the string table is full, returns an inline string reference. |
| // |
| // |context| must be a valid trace context reference. |
| // |string_literal| must be a null-terminated static string constant. |
| // |out_ref| points to where the registered string reference should be returned. |
| // |
| // This function is thread-safe. |
| void trace_context_register_string_literal(trace_context_t* context, const char* string_literal, |
| trace_string_ref_t* out_ref); |
| |
| // Registers a string literal and returns its string ref. |
| // Helper for |trace_context_register_string_literal()|. |
| static inline trace_string_ref_t trace_context_make_registered_string_literal( |
| trace_context_t* context, const char* string_literal) { |
| trace_string_ref_t ref; |
| trace_context_register_string_literal(context, string_literal, &ref); |
| return ref; |
| } |
| |
| // Registers a category into the string table, if it is enabled, keyed by its |
| // address in memory. |
| // |
| // The trace context caches the string so that subsequent registrations using |
| // the same memory address may return the same indexed string reference if |
| // found in the cache. |
| // |
| // Writes a string record into the trace buffer if the category was added to the |
| // string table. If the string table is full, returns an inline string reference. |
| // |
| // |context| must be a valid trace context reference. |
| // |category_literal| must be a null-terminated static string constant. |
| // |out_ref| points to where the registered string reference should be returned. |
| // |
| // Returns true and registers the string if the category is enabled, otherwise |
| // returns false and does not modify |*out_ref|. |
| // |
| // This function is thread-safe. |
| bool trace_context_register_category_literal(trace_context_t* context, const char* category_literal, |
| trace_string_ref_t* out_ref); |
| |
| // Registers the current thread into the thread table. |
| // |
| // Writes a process and/or thread kernel object record into the trace buffer if |
| // the process and/or thread have not previously been described. Writes a |
| // thread record into the trace buffer if the thread was added to the thread table. |
| // |
| // If the thread table is full, returns an inline thread reference. |
| // |
| // |context| must be a valid trace context reference. |
| // |out_ref| points to where the registered thread reference should be returned. |
| // |
| // This function is thread-safe. |
| void trace_context_register_current_thread(trace_context_t* context, trace_thread_ref_t* out_ref); |
| |
| // Registers the virtual thread into the thread table. |
| // |
| // Writes a thread record into the trace buffer if the virtual thread was added |
| // to the thread table. |
| // |
| // If the thread table is full, returns an inline thread reference. |
| // |
| // |context| must be a valid trace context reference. |
| // |process_koid| is the koid of the process which contains the thread. |
| // If ZX_KOID_INVALID is passed, the koid of the current process is used. |
| // |vthread_literal| must be a null-terminated static string constant. |
| // |vthread_id| is the id of the virtual thread to register. |
| // |out_ref| points to where the registered thread reference should be returned. |
| // |
| // This function is thread-safe. |
| void trace_context_register_vthread(trace_context_t* context, zx_koid_t process_koid, |
| const char* vthread_literal, trace_vthread_id_t vthread_id, |
| trace_thread_ref_t* out_ref); |
| |
| // Registers the specified thread into the thread table. |
| // |
| // Writes a thread record into the trace buffer if the thread was added to the |
| // thread table. |
| // |
| // If the thread table is full, returns an inline thread reference. |
| // |
| // Unlike |trace_context_register_current_thread()|, the caller is responsible for |
| // writing a process and/or thread kernel object record into the trace buffer |
| // if the process and/or thread have not previously been described. |
| // |
| // |context| must be a valid trace context reference. |
| // |process_koid| is the koid of the process which contains the thread. |
| // |thread_koid| is the koid of the thread to register. |
| // |out_ref| points to where the registered thread reference should be returned. |
| // |
| // This function is thread-safe. |
| void trace_context_register_thread(trace_context_t* context, zx_koid_t process_koid, |
| zx_koid_t thread_koid, trace_thread_ref_t* out_ref); |
| |
| // Registers a thread and returns its thread ref. |
| // Helper for |trace_context_register_thread()|. |
| static inline trace_thread_ref_t trace_context_make_registered_thread(trace_context_t* context, |
| zx_koid_t process_koid, |
| zx_koid_t thread_koid) { |
| trace_thread_ref_t ref; |
| trace_context_register_thread(context, process_koid, thread_koid, &ref); |
| return ref; |
| } |
| |
| // Allocate space for a blob and write its header. |
| // Returns a pointer to the "raw" contents of the blob, |
| // which must be filled in by the caller. |
| // Returns |nullptr| if there is no space in the buffer for |blob_size| bytes, |
| // or if |blob_size| is larger than TRACE_MAX_BLOB_SIZE. |
| // |context| must be a valid trace context reference. |
| // |type| is the blob type. |
| // |name_ref| is the name of the blob. |
| // |blob_size| is the size of the binary data to write. |
| // The caller is required to fill in the blob after we return. |
| // There is no need to zero out any padding, that has already been done. |
| void* trace_context_begin_write_blob_record(trace_context_t* context, trace_blob_type_t type, |
| const trace_string_ref_t* name_ref, size_t blob_size); |
| |
| // Write a blob of binary data into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |context| must be a valid trace context reference. |
| // |type| is the blob type. |
| // |name_ref| is the name of the blob. |
| // |blob| is the binary data to write. |
| // |blob_size| is the size of the binary data to write. |
| void trace_context_write_blob_record(trace_context_t* context, trace_blob_type_t type, |
| const trace_string_ref_t* name_ref, const void* blob, |
| size_t blob_size); |
| |
| // Sends an alert. |
| // |context| must be a valid trace context reference. |
| // |alert_name| is the name of the alert (max 14 characters). |
| // |
| // This function is thread-safe. |
| void trace_context_send_alert(trace_context_t* context, const char* alert_name); |
| |
| // Writes a kernel object record for the object reference by the specified handle |
| // into the trace buffer. Discards the record if it cannot be written. |
| // |
| // Collects the necessary information by querying the object's type and properties. |
| // |
| // |context| must be a valid trace context reference. |
| // |handle| is the handle of the object being described. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_kernel_object_record_for_handle(trace_context_t* context, |
| zx_handle_t handle, |
| const trace_arg_t* args, size_t num_args); |
| |
| // Writes a kernel object record for the specified process into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |process_koid| is the koid of the process being described. |
| // |process_name_ref| is the name of the process. |
| // |
| // This function is thread-safe. |
| void trace_context_write_process_info_record(trace_context_t* context, zx_koid_t process_koid, |
| const trace_string_ref_t* process_name_ref); |
| |
| // Writes a kernel object record for the specified thread into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |process_koid| is the koid of the process which contains the thread. |
| // |thread_koid| is the koid of the thread being described. |
| // |thread_name_ref| is the name of the thread. |
| // |
| // This function is thread-safe. |
| void trace_context_write_thread_info_record(trace_context_t* context, zx_koid_t process_koid, |
| zx_koid_t thread_koid, |
| const trace_string_ref_t* thread_name_ref); |
| |
| // Writes a context switch record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |cpu_number| is the CPU upon which the context switch occurred. |
| // |outgoing_thread_state| is the state of the thread which was descheduled from the CPU. |
| // |outgoing_thread_ref| is the thread which was descheduled from the CPU. |
| // |incoming_thread_ref| is the thread which was scheduled on the CPU. |
| // |
| // This function is thread-safe. |
| void trace_context_write_context_switch_record(trace_context_t* context, trace_ticks_t event_time, |
| trace_cpu_number_t cpu_number, |
| trace_thread_state_t outgoing_thread_state, |
| const trace_thread_ref_t* outgoing_thread_ref, |
| const trace_thread_ref_t* incoming_thread_ref, |
| trace_thread_priority_t outgoing_thread_priority, |
| trace_thread_priority_t incoming_thread_priority); |
| |
| // Writes a log record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread which wrote the log message. |
| // |log_message| is the content of the log message. |
| // |log_message_length| is the length of the log message. |
| // |
| // This function is thread-safe. |
| void trace_context_write_log_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, const char* log_message, |
| size_t log_message_length); |
| |
| // Writes an instant event record with arguments into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |scope| is the scope to which the instant event applies (thread, process, global). |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_instant_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_scope_t scope, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a counter event record with arguments into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |counter_id| is the correlation id of the counter. |
| // Must be unique for a given process, category, and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_counter_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_counter_id_t counter_id, |
| const trace_arg_t* args, size_t num_args); |
| |
| // Writes a duration begin event record and a duration end event record with |
| // arguments into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |start_time| is the start time of the event, in ticks. |
| // |end_time| is the end time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_duration_event_record(trace_context_t* context, trace_ticks_t start_time, |
| trace_ticks_t end_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| const trace_arg_t* args, size_t num_args); |
| |
| // Writes a duration begin event record with arguments into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the start time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_duration_begin_event_record(trace_context_t* context, |
| trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| const trace_arg_t* args, size_t num_args); |
| |
| // Writes a duration end event record with arguments into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the end time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_duration_end_event_record(trace_context_t* context, |
| trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| const trace_arg_t* args, size_t num_args); |
| |
| // Writes an asynchronous begin event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the start time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |async_id| is the correlation id of the asynchronous operation. |
| // Must be unique for a given process, category, and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_async_begin_event_record( |
| trace_context_t* context, trace_ticks_t event_time, const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, const trace_string_ref_t* name_ref, |
| trace_async_id_t async_id, const trace_arg_t* args, size_t num_args); |
| |
| // Writes an asynchronous instant event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |async_id| is the correlation id of the asynchronous operation. |
| // Must be unique for a given process, category, and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_async_instant_event_record( |
| trace_context_t* context, trace_ticks_t event_time, const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, const trace_string_ref_t* name_ref, |
| trace_async_id_t async_id, const trace_arg_t* args, size_t num_args); |
| |
| // Writes an asynchronous end event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the end time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |async_id| is the correlation id of the asynchronous operation. |
| // Must be unique for a given process, category, and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_async_end_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_async_id_t async_id, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a flow begin event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the start time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |flow_id| is the correlation id of the flow. |
| // Must be unique for a given category and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_flow_begin_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_flow_id_t flow_id, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a flow step event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |flow_id| is the correlation id of the flow. |
| // Must be unique for a given category and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_flow_step_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_flow_id_t flow_id, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a flow end event record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the end time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |flow_id| is the correlation id of the flow. |
| // Must be unique for a given category and name combination. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_flow_end_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| trace_flow_id_t flow_id, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a large blob record with metadata into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |event_time| is the time of the event, in ticks. |
| // |thread_ref| is the thread on which the event occurred. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |blob| is a pointer to the data, and contains |blob_size| bytes. |
| // |args| contains |num_args| key/value pairs to include in the record, or NULL if none. |
| // |
| // This function is thread-safe. |
| void trace_context_write_blob_event_record(trace_context_t* context, trace_ticks_t event_time, |
| const trace_thread_ref_t* thread_ref, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, const void* blob, |
| size_t blob_size, const trace_arg_t* args, |
| size_t num_args); |
| |
| // Writes a large blob record without metadata into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |category_ref| is the category of the event. |
| // |name_ref| is the name of the event. |
| // |blob| is a pointer to the data, and contains |blob_size| bytes. |
| // |
| // This function is thread-safe. |
| void trace_context_write_blob_attachment_record(trace_context_t* context, |
| const trace_string_ref_t* category_ref, |
| const trace_string_ref_t* name_ref, |
| const void* blob, size_t blob_size); |
| |
| // Writes an initialization record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |ticks_per_second| is the number of |trace_ticks_t| per second used in the trace. |
| // |
| // This function is thread-safe. |
| void trace_context_write_initialization_record(trace_context_t* context, |
| zx_ticks_t ticks_per_second); |
| |
| // Writes a string record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |index| is the index of the string, between |TRACE_ENCODED_STRING_REF_MIN_INDEX| |
| // and |TRACE_ENCODED_STRING_REF_MAX_INDEX| inclusive. |
| // |string| is the content of the string. |
| // |length| is the length of the string; the string will be truncated if it is longer |
| // than |TRACE_ENCODED_STRING_REF_MAX_LENGTH|. |
| // |
| // This function is thread-safe. |
| void trace_context_write_string_record(trace_context_t* context, trace_string_index_t index, |
| const char* string, size_t length); |
| |
| // Writes a thread record into the trace buffer. |
| // Discards the record if it cannot be written. |
| // |
| // |context| must be a valid trace context reference. |
| // |index| is the index of the thread, between |TRACE_ENCODED_THREAD_REF_MIN_INDEX| |
| // and |TRACE_ENCODED_THREAD_REF_MAX_INDEX| inclusive. |
| // |process_koid| is the koid of the process which contains the thread. |
| // |thread_koid| is the koid of the thread being described. |
| // |
| // This function is thread-safe. |
| void trace_context_write_thread_record(trace_context_t* context, trace_thread_index_t index, |
| zx_koid_t process_koid, zx_koid_t thread_koid); |
| |
| // Allocates space for a record in the trace buffer. |
| // |
| // |context| must be a valid trace context reference. |
| // |num_bytes| must be a multiple of 8 bytes. |
| // |
| // Returns a pointer to the allocated space within the trace buffer with |
| // 8 byte alignment, or NULL if the trace buffer is full or if |num_bytes| |
| // exceeds |TRACE_ENCODED_RECORD_MAX_LENGTH|. |
| // |
| // This function is thread-safe, fail-fast, and lock-free. |
| void* trace_context_alloc_record(trace_context_t* context, size_t num_bytes); |
| |
| __END_CDECLS |
| |
| #endif // ZIRCON_SYSTEM_ULIB_LIB_TRACE_ENGINE_CONTEXT_H_ |