/*
 * 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
#if __APPLE__
#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__
