/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INCLUDE_PERFETTO_PUBLIC_ABI_STREAM_WRITER_ABI_H_ #define INCLUDE_PERFETTO_PUBLIC_ABI_STREAM_WRITER_ABI_H_ #include <stddef.h> #include <stdint.h> #include "perfetto/public/abi/export.h" #ifdef __cplusplus extern "C" { #endif // An opaque structure used to represent the internal implementation of a // protozero stream writer. struct PerfettoStreamWriterImpl; // A `PerfettoStreamWriter` owns a chunk of memory that the user can write // to. The section from `begin` (inclusive) to `write_ptr` (non inclusive) // already contains valid data. The section from `write_ptr` (inclusive) to // `end` (non inclusive) is empty and can be used for new data. // // -------------------------------------------------------------------------- // |wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww | // -------------------------------------------------------------------------- // ^ ^ ^ // \ | / // `begin` `write_ptr` `end` struct PerfettoStreamWriter { … }; // Tells the writer that the current chunk has been written until `write_ptr` // (non inclusive). // // Returns the new state of the writer. PERFETTO_SDK_EXPORT void PerfettoStreamWriterUpdateWritePtr( struct PerfettoStreamWriter*); // Commits the current chunk and gets a new chunk. PERFETTO_SDK_EXPORT void PerfettoStreamWriterNewChunk( struct PerfettoStreamWriter*); // Appends `size` from `src` to the writer. PERFETTO_SDK_EXPORT void PerfettoStreamWriterAppendBytesSlowpath( struct PerfettoStreamWriter*, const uint8_t* src, size_t size); #define PERFETTO_STREAM_WRITER_PATCH_SIZE … // Tells the stream writer that the part of the current chunk pointed by // `patch_addr` (until `patch_addr`+`PERFETTO_STREAM_WRITER_PATCH_SIZE`) needs // to be changed after the current chunk goes away. // // The caller can write to the returned location (which may have been redirected // by the stream writer) after the current chunk has gone away. The caller // **must write a non-zero value as the first byte** eventually. // // The stream writer can also return NULL, in which case the caller should not // write anything. // // This can be used to backfill the size of a protozero message. PERFETTO_SDK_EXPORT uint8_t* PerfettoStreamWriterAnnotatePatch( struct PerfettoStreamWriter*, uint8_t* patch_addr); // Returns a pointer to an area of the chunk long `size` for writing. The // returned area is considered already written by the writer (it will not be // used again). // // WARNING: `size` should be smaller than the chunk size returned by the // `delegate`. PERFETTO_SDK_EXPORT void PerfettoStreamWriterReserveBytesSlowpath(struct PerfettoStreamWriter*, size_t size); #ifdef __cplusplus } #endif #endif // INCLUDE_PERFETTO_PUBLIC_ABI_STREAM_WRITER_ABI_H_