/*
 * Copyright (c) 2013-2015 Apple Inc. All rights reserved.
 *
 * @APPLE_APACHE_LICENSE_HEADER_START@
 *
 * 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.
 *
 * @APPLE_APACHE_LICENSE_HEADER_END@
 */

#ifndef __OS_VOUCHER_ACTIVITY_PRIVATE__
#define __OS_VOUCHER_ACTIVITY_PRIVATE__

#if OS_VOUCHER_ACTIVITY_SPI
#if __has_include(<mach/mach_time.h>)
#include <mach/mach_time.h>
#include <firehose/tracepoint_private.h>
#endif
#ifndef __linux__
#include <os/base.h>
#include <os/availability.h>
#endif
#include <sys/uio.h>
#include <os/object.h>
#include "voucher_private.h"

#define OS_VOUCHER_ACTIVITY_SPI_VERSION 20161003

#if OS_VOUCHER_WEAK_IMPORT
#define OS_VOUCHER_EXPORT OS_EXPORT OS_WEAK_IMPORT
#else
#define OS_VOUCHER_EXPORT OS_EXPORT
#endif

__BEGIN_DECLS

/*!
 * @const VOUCHER_CURRENT
 * Shorthand for the currently adopted voucher
 *
 * This value can only be used as an argument to functions, and is never
 * actually returned. It looks enough like a tagged pointer object that ARC
 * won't crash if this is assigned to a temporary variable.
 */
#define VOUCHER_CURRENT		((OS_OBJECT_BRIDGE voucher_t)(void *)~2ul)

/*!
 * @function voucher_get_activity_id
 *
 * @abstract
 * Returns the activity_id associated with the specified voucher at the time
 * of the call.
 *
 * @discussion
 * When the passed voucher is VOUCHER_CURRENT this returns the current
 * activity ID.
 *
 * @param voucher
 * The specified voucher.
 *
 * @param parent_id
 * An out parameter to return the parent ID of the returned activity ID.
 *
 * @result
 * The current activity identifier, if any. When 0 is returned, parent_id will
 * also always be 0.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW
firehose_activity_id_t
voucher_get_activity_id(voucher_t voucher, firehose_activity_id_t *parent_id);

/*!
 * @function voucher_get_activity_id_and_creator
 *
 * @abstract
 * Returns the activity_id associated with the specified voucher at the time
 * of the call.
 *
 * @discussion
 * When the passed voucher is VOUCHER_CURRENT this returns the current
 * activity ID.
 *
 * @param voucher
 * The specified voucher.
 *
 * @param creator_pid
 * The unique pid of the process that created the returned activity ID if any.
 *
 * @param parent_id
 * An out parameter to return the parent ID of the returned activity ID.
 *
 * @result
 * The current activity identifier, if any. When 0 is returned, parent_id will
 * also always be 0.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW
firehose_activity_id_t
voucher_get_activity_id_and_creator(voucher_t voucher, uint64_t *creator_pid,
		firehose_activity_id_t *parent_id);

/*!
 * @function voucher_activity_create_with_data
 *
 * @abstract
 * Creates a voucher object with a new activity identifier.
 *
 * @discussion
 * As part of voucher transport, activities are automatically propagated by the
 * system to other threads and processes (across IPC).
 *
 * When a voucher with an activity identifier is applied to a thread, work
 * on that thread is done on behalf of this activity.
 *
 * @param trace_id
 * Tracepoint identifier returned by voucher_activity_trace_id(), intended for
 * identification of the automatic tracepoint generated as part of creating the
 * new activity.
 *
 * @param base
 * The base voucher used to create the activity. If the base voucher has an
 * activity identifier, then the created activity will be parented to that one.
 * If the passed in base has no activity identifier, the activity identifier
 * will be a top-level one, on behalf of the process that created the base
 * voucher.
 *
 * If base is VOUCHER_NONE, the activity is a top-level one, on behalf of the
 * current process.
 *
 * If base is VOUCHER_CURRENT, then the activity is naturally based on the
 * one currently applied to the current thread (the one voucher_copy() would
 * return).
 *
 * @param flags
 * See voucher_activity_flag_t documentation for effect.
 *
 * @param pubdata
 * Pointer to packed buffer of tracepoint data.
 *
 * @param publen
 * Length of data at 'pubdata'.
 *
 * @result
 * A new voucher with an activity identifier.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NOTHROW
voucher_t
voucher_activity_create_with_data(firehose_tracepoint_id_t *trace_id,
		voucher_t base, firehose_activity_flags_t flags,
		const void *pubdata, size_t publen);

API_DEPRECATED_WITH_REPLACEMENT("voucher_activity_create_with_data",
		macos(10.12,10.12), ios(10.0,10.0), tvos(10.0,10.0), watchos(3.0,3.0))
OS_VOUCHER_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NOTHROW
voucher_t
voucher_activity_create_with_location(firehose_tracepoint_id_t *trace_id,
		voucher_t base, firehose_activity_flags_t flags, uint64_t location);

/*!
 * @group Voucher Activity Trace SPI
 * SPI intended for libtrace only
 */

/*!
 * @function voucher_activity_id_allocate
 *
 * @abstract
 * Allocate a new system-wide unique activity ID.
 *
 * @param flags
 * The bottom-most 8 bits of the flags will be used to generate the ID.
 * See firehose_activity_flags_t.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW
firehose_activity_id_t
voucher_activity_id_allocate(firehose_activity_flags_t flags);

/*!
 * @function voucher_activity_flush
 *
 * @abstract
 * Force flushing the specified stream.
 *
 * @discussion
 * This maks all the buffers currently being written to as full, so that
 * their current content is pushed in a timely fashion.
 *
 * When this call returns, the actual flush may or may not yet have happened.
 *
 * @param stream
 * The stream to flush.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW
void
voucher_activity_flush(firehose_stream_t stream);

/*!
 * @function voucher_activity_trace
 *
 * @abstract
 * Add a tracepoint to the specified stream.
 *
 * @param stream
 * The stream to trace this entry into.
 *
 * @param trace_id
 * Tracepoint identifier returned by voucher_activity_trace_id()
 *
 * @param timestamp
 * The mach_approximate_time()/mach_absolute_time() value for this tracepoint.
 *
 * @param pubdata
 * Pointer to packed buffer of tracepoint data.
 *
 * @param publen
 * Length of data at 'pubdata'.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW OS_NONNULL4
firehose_tracepoint_id_t
voucher_activity_trace(firehose_stream_t stream,
		firehose_tracepoint_id_t trace_id, uint64_t timestamp,
		const void *pubdata, size_t publen);

/*!
 * @function voucher_activity_trace_v
 *
 * @abstract
 * Add a tracepoint to the specified stream, with private data.
 *
 * @param stream
 * The stream to trace this entry into.
 *
 * @param trace_id
 * Tracepoint identifier returned by voucher_activity_trace_id()
 *
 * @param timestamp
 * The mach_approximate_time()/mach_absolute_time() value for this tracepoint.
 *
 * @param iov
 * Array of `struct iovec` pointing to the data to layout.
 * The total size of this iovec must span exactly `publen + privlen` bytes.
 * The `publen` boundary must coincide with the end of an iovec (each iovec
 * must either be pure public or pure private data).
 *
 * @param publen
 * Total length of data to read from the iovec for the public data.
 *
 * @param privlen
 * Length of data to read from the iovec after the public data for the private
 * data.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW OS_NONNULL4
firehose_tracepoint_id_t
voucher_activity_trace_v(firehose_stream_t stream,
		firehose_tracepoint_id_t trace_id, uint64_t timestamp,
		const struct iovec *iov, size_t publen, size_t privlen);


API_DEPRECATED_WITH_REPLACEMENT("voucher_activity_trace_v",
		macos(10.12,10.12), ios(10.0,10.0), tvos(10.0,10.0), watchos(3.0,3.0))
OS_VOUCHER_EXPORT OS_NOTHROW OS_NONNULL4 OS_NONNULL6
firehose_tracepoint_id_t
voucher_activity_trace_with_private_strings(firehose_stream_t stream,
		firehose_tracepoint_id_t trace_id, uint64_t timestamp,
		const void *pubdata, size_t publen,
		const void *privdata, size_t privlen);

typedef const struct voucher_activity_hooks_s {
#define VOUCHER_ACTIVITY_HOOKS_VERSION     5
	long vah_version;
	mach_port_t (*vah_get_logd_port)(void);
	dispatch_mach_handler_function_t vah_debug_channel_handler;
	kern_return_t (*vah_get_reconnect_info)(mach_vm_address_t *, mach_vm_size_t *);
	void (*vah_metadata_init)(void *metadata_buffer, size_t size);
	void (*vah_quarantine_starts)(void);
} *voucher_activity_hooks_t;

/*!
 * @function voucher_activity_initialize_4libtrace
 *
 * @abstract
 * Configure upcall hooks for libtrace.
 *
 * @param hooks
 * A pointer to a voucher_activity_hooks_s structure.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_NOTHROW OS_NONNULL_ALL
void
voucher_activity_initialize_4libtrace(voucher_activity_hooks_t hooks);

/*!
 * @function voucher_activity_get_metadata_buffer
 *
 * @abstract
 * Return address and length of buffer in the process trace memory area
 * reserved for libtrace metadata.
 *
 * @param length
 * Pointer to size_t variable, filled with length of metadata buffer.
 *
 * @result
 * Address of metadata buffer.
 */
API_AVAILABLE(macos(10.10), ios(8.0))
OS_VOUCHER_EXPORT OS_WARN_RESULT OS_NOTHROW OS_NONNULL_ALL
void*
voucher_activity_get_metadata_buffer(size_t *length);

/*!
 * @function voucher_get_activity_id_4dyld
 *
 * @abstract
 * Return the current voucher activity ID. Available for the dyld client stub
 * only.
 */
API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))
OS_VOUCHER_EXPORT OS_WARN_RESULT OS_NOTHROW
firehose_activity_id_t
voucher_get_activity_id_4dyld(void);

__END_DECLS

#endif // OS_VOUCHER_ACTIVITY_SPI

#endif // __OS_VOUCHER_ACTIVITY_PRIVATE__
