/*
 * Copyright (c) 2014 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 __DISPATCH_LAYOUT_PRIVATE__
#define __DISPATCH_LAYOUT_PRIVATE__

#ifndef __DISPATCH_INDIRECT__
#error "Please #include <dispatch/private.h> instead of this file directly."
#include <dispatch/base.h> // for HeaderDoc
#endif

__BEGIN_DECLS

#if !TARGET_OS_WIN32
API_AVAILABLE(macos(10.6), ios(4.0))
DISPATCH_EXPORT const struct dispatch_queue_offsets_s {
	// always add new fields at the end
	const uint16_t dqo_version;
	const uint16_t dqo_label;
	const uint16_t dqo_label_size;
	const uint16_t dqo_flags;
	const uint16_t dqo_flags_size;
	const uint16_t dqo_serialnum;
	const uint16_t dqo_serialnum_size;
	const uint16_t dqo_width;
	const uint16_t dqo_width_size;
	const uint16_t dqo_running;
	const uint16_t dqo_running_size;
	// fields added in dqo_version 5:
	const uint16_t dqo_suspend_cnt;
	const uint16_t dqo_suspend_cnt_size;
	const uint16_t dqo_target_queue;
	const uint16_t dqo_target_queue_size;
	const uint16_t dqo_priority;
	const uint16_t dqo_priority_size;
} dispatch_queue_offsets;
#endif

#if DISPATCH_LAYOUT_SPI

/*!
 * @group Data Structure Layout SPI
 * SPI intended for CoreSymbolication only
 */

API_AVAILABLE(macos(10.10), ios(8.0))
DISPATCH_EXPORT const struct dispatch_tsd_indexes_s {
	// always add new fields at the end
	const uint16_t dti_version;
	const uint16_t dti_queue_index;
	const uint16_t dti_voucher_index;
	const uint16_t dti_qos_class_index;
} dispatch_tsd_indexes;

#endif // DISPATCH_LAYOUT_SPI

__END_DECLS

#endif // __DISPATCH_LAYOUT_PRIVATE__
