/*
 * Copyright (c) 2008-2013 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@
 */

#include <mach/std_types.defs>
#include <mach/mach_types.defs>

// '64' is used to align with Mach notifications and so that we don't fight
// with the notify symbols in Libsystem
subsystem libdispatch_internal_protocol 64;

serverprefix _dispatch_;
userprefix _dispatch_send_;

skip; /* was MACH_NOTIFY_FIRST: 64 */

/* MACH_NOTIFY_PORT_DELETED: 65 */
simpleroutine
mach_notify_port_deleted(
					_notify	: mach_port_move_send_once_t;
					_name	: mach_port_name_t
);

/* MACH_NOTIFY_SEND_POSSIBLE: 66 */
simpleroutine
mach_notify_send_possible(
					_notify	: mach_port_move_send_once_t;
					_name	: mach_port_name_t
);

skip;   /* was NOTIFY_OWNERSHIP_RIGHTS: 67 */

skip;   /* was NOTIFY_RECEIVE_RIGHTS: 68 */

/* MACH_NOTIFY_PORT_DESTROYED: 69 */
simpleroutine
mach_notify_port_destroyed(
					_notify	: mach_port_move_send_once_t;
					_rights	: mach_port_move_receive_t
);

/* MACH_NOTIFY_NO_SENDERS: 70 */
simpleroutine
mach_notify_no_senders(
					_notify	: mach_port_move_send_once_t;
					_mscnt	: mach_port_mscount_t
);

/* MACH_NOTIFY_SEND_ONCE: 71 */
simpleroutine
mach_notify_send_once(
					_notify	: mach_port_move_send_once_t
);

/* MACH_NOTIFY_DEAD_NAME: 72 */
simpleroutine
mach_notify_dead_name(
					_notify	: mach_port_move_send_once_t;
					_name	: mach_port_name_t
);

/* highly unlikely additional Mach notifications */
skip;
skip;
skip;
skip;
skip;

simpleroutine
wakeup_runloop_thread(
					_port	: mach_port_t;
	WaitTime _waitTimeout	: natural_t
);

simpleroutine
consume_send_once_right(
					_port	: mach_port_move_send_once_t
);
