blob: 0f685ef49dfe2c3ebd95852413f8a9901e46b237 [file] [log] [blame]
/*
* 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 {
struct PerfettoStreamWriterImpl* impl;
// Points to the first byte of the current chunk.
uint8_t* begin;
// Points to the first byte after the end of the current chunk (STL-style).
uint8_t* end;
// Write pointer: points to the first not-yet-written byte of the current
// chunk.
uint8_t* write_ptr;
// Keeps track of all the bytes written in previous chunks (bytes written in
// the current chunk are not included here).
size_t written_previously;
};
// 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 4
// 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_