/*
 * 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
#endif

#ifndef DISPATCH_MGR_QUEUE_DEBUG
#define DISPATCH_MGR_QUEUE_DEBUG 0
#endif

#ifndef DISPATCH_MACHPORT_DEBUG
#define DISPATCH_MACHPORT_DEBUG 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

#	ifndef NOTE_MEMORYSTATUS_LOW_SWAP
#	define NOTE_MEMORYSTATUS_LOW_SWAP 0x8
#	endif

#	if !defined(NOTE_MEMORYSTATUS_PROC_LIMIT_WARN) || \
		!DISPATCH_MIN_REQUIRED_OSX_AT_LEAST(101200)
#	undef NOTE_MEMORYSTATUS_PROC_LIMIT_WARN
#	define NOTE_MEMORYSTATUS_PROC_LIMIT_WARN 0
#	endif // NOTE_MEMORYSTATUS_PROC_LIMIT_WARN

#	if !defined(NOTE_MEMORYSTATUS_PROC_LIMIT_CRITICAL) || \
		!DISPATCH_MIN_REQUIRED_OSX_AT_LEAST(101200)
#	undef NOTE_MEMORYSTATUS_PROC_LIMIT_CRITICAL
#	define NOTE_MEMORYSTATUS_PROC_LIMIT_CRITICAL 0
#	endif // NOTE_MEMORYSTATUS_PROC_LIMIT_CRITICAL

#	ifndef DISPATCH_KEVENT_TREAT_ENOENT_AS_EINPROGRESS
#	if TARGET_OS_MAC && !DISPATCH_MIN_REQUIRED_OSX_AT_LEAST(101200)
	// deferred delete can return bogus ENOENTs on older kernels
#	define DISPATCH_KEVENT_TREAT_ENOENT_AS_EINPROGRESS 1
#	else
#	define DISPATCH_KEVENT_TREAT_ENOENT_AS_EINPROGRESS 0
#	endif
#	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

#	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__
