/*
 * Copyright (c) 2016 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_EVENT_EVENT_CONFIG__
#define __DISPATCH_EVENT_EVENT_CONFIG__

#if defined(__linux__)
#	include <sys/eventfd.h>
#	define DISPATCH_EVENT_BACKEND_EPOLL 1
#	define DISPATCH_EVENT_BACKEND_KEVENT 0
#elif __has_include(<sys/event.h>)
#	include <sys/event.h>
#	define DISPATCH_EVENT_BACKEND_EPOLL 0
#	define DISPATCH_EVENT_BACKEND_KEVENT 1
#else
#	error unsupported event loop
#endif

#if DISPATCH_DEBUG
#define DISPATCH_MGR_QUEUE_DEBUG 1
#define DISPATCH_WLH_DEBUG 1
#endif

#ifndef DISPATCH_MGR_QUEUE_DEBUG
#define DISPATCH_MGR_QUEUE_DEBUG 0
#endif

#ifndef DISPATCH_WLH_DEBUG
#define DISPATCH_WLH_DEBUG 0
#endif

#ifndef DISPATCH_MACHPORT_DEBUG
#define DISPATCH_MACHPORT_DEBUG 0
#endif

#ifndef DISPATCH_TIMER_ASSERTIONS
#if DISPATCH_DEBUG
#define DISPATCH_TIMER_ASSERTIONS 1
#else
#define DISPATCH_TIMER_ASSERTIONS 0
#endif
#endif

#if DISPATCH_TIMER_ASSERTIONS
#define DISPATCH_TIMER_ASSERT(a, op, b, text) ({ \
		typeof(a) _a = (a); \
		if (unlikely(!(_a op (b)))) { \
			DISPATCH_CLIENT_CRASH(_a, "Timer: " text); \
		} \
	})
#else
#define DISPATCH_TIMER_ASSERT(a, op, b, text) ((void)0)
#endif

#ifndef EV_VANISHED
#define EV_VANISHED 0x0200
#endif

#if DISPATCH_EVENT_BACKEND_KEVENT
#	if defined(EV_SET_QOS)
#		define DISPATCH_USE_KEVENT_QOS 1
#		ifndef KEVENT_FLAG_IMMEDIATE
#		define KEVENT_FLAG_IMMEDIATE 0x001
#		endif
#		ifndef KEVENT_FLAG_ERROR_EVENTS
#		define KEVENT_FLAG_ERROR_EVENTS 0x002
#		endif
#	else
#		define DISPATCH_USE_KEVENT_QOS 0
#	endif

#	ifdef NOTE_LEEWAY
#		define DISPATCH_HAVE_TIMER_COALESCING 1
#   else
#		define NOTE_LEEWAY 0
#		define DISPATCH_HAVE_TIMER_COALESCING 0
#	endif // !NOTE_LEEWAY
#	if defined(NOTE_CRITICAL) && defined(NOTE_BACKGROUND)
#		define DISPATCH_HAVE_TIMER_QOS 1
#	else
#		undef  NOTE_CRITICAL
#		define NOTE_CRITICAL 0
#		undef  NOTE_BACKGROUND
#		define NOTE_BACKGROUND 0
#		define DISPATCH_HAVE_TIMER_QOS 0
#	endif // !defined(NOTE_CRITICAL) || !defined(NOTE_BACKGROUND)

#	ifndef NOTE_FUNLOCK
#	define NOTE_FUNLOCK 0x00000100
#	endif

#	if HAVE_DECL_NOTE_REAP
#	if defined(NOTE_REAP) && defined(__APPLE__)
#	undef NOTE_REAP
#	define NOTE_REAP 0x10000000 // <rdar://problem/13338526>
#	endif
#	endif // HAVE_DECL_NOTE_REAP

#	ifndef VQ_QUOTA
#	undef HAVE_DECL_VQ_QUOTA // rdar://problem/24160982
#	endif // VQ_QUOTA

#	ifndef VQ_NEARLOWDISK
#	undef HAVE_DECL_VQ_NEARLOWDISK
#	endif // VQ_NEARLOWDISK

#	ifndef VQ_DESIRED_DISK
#	undef HAVE_DECL_VQ_DESIRED_DISK
#	endif // VQ_DESIRED_DISK

#	if !defined(EVFILT_NW_CHANNEL) && defined(__APPLE__)
#	define EVFILT_NW_CHANNEL       (-16)
#	define NOTE_FLOW_ADV_UPDATE    	0x1
#	endif
#else // DISPATCH_EVENT_BACKEND_KEVENT
#	define EV_ADD					0x0001
#	define EV_DELETE				0x0002
#	define EV_ENABLE				0x0004

#	define EV_ONESHOT				0x0010
#	define EV_CLEAR					0x0020
#	define EV_DISPATCH				0x0080

#	define EVFILT_READ				(-1)
#	define EVFILT_WRITE				(-2)
#	define EVFILT_SIGNAL			(-3)
#	define EVFILT_TIMER				(-4)
#	define EVFILT_SYSCOUNT			4

#	define DISPATCH_HAVE_TIMER_QOS 0
#	define DISPATCH_HAVE_TIMER_COALESCING 0
#	define KEVENT_FLAG_IMMEDIATE 0x001
#endif // !DISPATCH_EVENT_BACKEND_KEVENT

#ifdef EV_UDATA_SPECIFIC
#	define DISPATCH_EV_DIRECT		(EV_UDATA_SPECIFIC|EV_DISPATCH)
#else
#	define DISPATCH_EV_DIRECT		0x0000
#	define EV_UDATA_SPECIFIC		0x0000
#	undef  EV_VANISHED
#	define EV_VANISHED				0x0000
#endif

#define DISPATCH_EV_MSG_NEEDS_FREE	0x10000 // mach message needs to be freed()

#define DISPATCH_EVFILT_TIMER				(-EVFILT_SYSCOUNT - 1)
#define DISPATCH_EVFILT_CUSTOM_ADD			(-EVFILT_SYSCOUNT - 2)
#define DISPATCH_EVFILT_CUSTOM_OR			(-EVFILT_SYSCOUNT - 3)
#define DISPATCH_EVFILT_CUSTOM_REPLACE		(-EVFILT_SYSCOUNT - 4)
#define DISPATCH_EVFILT_MACH_NOTIFICATION	(-EVFILT_SYSCOUNT - 5)
#define DISPATCH_EVFILT_SYSCOUNT			( EVFILT_SYSCOUNT + 5)

#if HAVE_MACH
#	if !EV_UDATA_SPECIFIC
#	error mach support requires EV_UDATA_SPECIFIC
#	endif

#	ifndef MACH_RCV_VOUCHER
#	define MACH_RCV_VOUCHER 0x00000800
#	endif

#	ifndef MACH_NOTIFY_SEND_POSSIBLE
#	undef  MACH_NOTIFY_SEND_POSSIBLE
#	define MACH_NOTIFY_SEND_POSSIBLE MACH_NOTIFY_DEAD_NAME
#	endif

#	ifndef NOTE_MACH_CONTINUOUS_TIME
#	define NOTE_MACH_CONTINUOUS_TIME 0
#	endif // NOTE_MACH_CONTINUOUS_TIME

#	ifndef HOST_NOTIFY_CALENDAR_SET
#	define HOST_NOTIFY_CALENDAR_SET HOST_NOTIFY_CALENDAR_CHANGE
#	endif // HOST_NOTIFY_CALENDAR_SET

#	ifndef HOST_CALENDAR_SET_REPLYID
#	define HOST_CALENDAR_SET_REPLYID 951
#	endif // HOST_CALENDAR_SET_REPLYID

#	ifndef MACH_SEND_OVERRIDE
#	define MACH_SEND_OVERRIDE 0x00000020
typedef unsigned int mach_msg_priority_t;
#	define MACH_MSG_PRIORITY_UNSPECIFIED ((mach_msg_priority_t)0)
#	endif // MACH_SEND_OVERRIDE

#	ifndef MACH_SEND_SYNC_OVERRIDE
#	define MACH_SEND_SYNC_OVERRIDE 0x00100000
#	endif // MACH_SEND_SYNC_OVERRIDE

#	ifndef MACH_RCV_SYNC_WAIT
#	define MACH_RCV_SYNC_WAIT 0x00004000
#	endif // MACH_RCV_SYNC_WAIT

#	define DISPATCH_MACH_TRAILER_SIZE sizeof(dispatch_mach_trailer_t)
#	define DISPATCH_MACH_RCV_TRAILER MACH_RCV_TRAILER_CTX
#	define DISPATCH_MACH_RCV_OPTIONS ( \
		MACH_RCV_MSG | MACH_RCV_LARGE | MACH_RCV_LARGE_IDENTITY | \
		MACH_RCV_TRAILER_ELEMENTS(DISPATCH_MACH_RCV_TRAILER) | \
		MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0) | \
		MACH_RCV_VOUCHER)
#endif // HAVE_MACH

#endif // __DISPATCH_EVENT_EVENT_CONFIG__
