2 * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
4 * @APPLE_APACHE_LICENSE_HEADER_START@
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * @APPLE_APACHE_LICENSE_HEADER_END@
22 * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
23 * which are subject to change in future releases of Mac OS X. Any applications
24 * relying on these interfaces WILL break.
28 * LEGACY: This header file describles LEGACY interfaces to libdispatch from an
29 * earlier revision of the API. These interfaces WILL be removed in the future.
32 #ifndef __DISPATCH_LEGACY__
33 #define __DISPATCH_LEGACY__
35 #ifndef __DISPATCH_INDIRECT__
36 #error "Please #include <dispatch/dispatch.h> instead of this file directly."
37 #include <dispatch/base.h> // for HeaderDoc
41 #include <mach/mach_types.h>
44 #define DISPATCH_DEPRECATED __attribute__((deprecated))
45 #define DISPATCH_PUBLIC_API __attribute__((visibility("default")))
47 typedef struct dispatch_item_s *dispatch_item_t;
49 struct dispatch_item_s {
50 void * di_objc_isa; /* FIXME -- someday... */
51 struct dispatch_item_s *volatile di_next;
52 dispatch_queue_t di_cback_q;
55 semaphore_t di_semaphore;
58 /* Legacy API not supported except with Mach semaphores. */
67 // Use: dispatch_source_t
68 typedef struct dispatch_source_s *dispatch_event_t;
72 typedef void (^dispatch_legacy_block_t)(dispatch_item_t);
73 typedef void (^dispatch_queue_deletion_block_t)(dispatch_queue_t queue);
74 typedef void (^dispatch_source_deletion_t)(dispatch_source_t source);
75 typedef void (^dispatch_event_callback_t)(dispatch_event_t event);
76 typedef void (^dispatch_source_handler_t)(dispatch_source_t source);
77 typedef dispatch_source_handler_t dispatch_event_handler_t;
78 typedef void (^dispatch_source_finalizer_t)(dispatch_source_t source);
79 #endif /* __BLOCKS__ */
82 typedef void (*dispatch_source_handler_function_t)(void *, dispatch_source_t);
83 typedef void (*dispatch_source_finalizer_function_t)(void *, dispatch_source_t);
84 typedef dispatch_source_handler_function_t dispatch_event_handler_function_t;
86 DISPATCH_DECL(dispatch_source_attr);
88 #define DISPATCH_SOURCE_CREATE_SUSPENDED ((dispatch_source_attr_t)~0ul)
91 typedef void (^dispatch_queue_finalizer_t)(dispatch_queue_t queue);
94 typedef void (*dispatch_queue_finalizer_function_t)(void *, dispatch_queue_t);
96 __DISPATCH_BEGIN_DECLS
99 * @function dispatch_queue_attr_create
102 * Creates a new dispatch queue attribute structure. These attributes may be
103 * provided at creation time to modify the default behavior of the queue.
106 * The values present in this structure are copied to newly created queues.
107 * The same attribute structure may be provided to multiple calls to
108 * dispatch_queue_create() but only the values in the structure at the time the
109 * call is made will be used.
112 * The new dispatch queue attribute structure, initialized to default values.
114 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
115 DISPATCH_MALLOC DISPATCH_WARN_RESULT DISPATCH_NOTHROW
116 dispatch_queue_attr_t
117 dispatch_queue_attr_create(void);
120 * @function dispatch_queue_attr_set_priority
123 * Set the priority level for a dispatch queue.
126 * Priority levels may be:
127 * - DISPATCH_QUEUE_PRIORITY_HIGH
128 * - DISPATCH_QUEUE_PRIORITY_DEFAULT
129 * - DISPATCH_QUEUE_PRIORITY_LOW
130 * Queues set to high priority will be processed
131 * before queues set to default priority or low priority.
132 * Queues set to low priority will be processed only if all
133 * high priority and default priority queues are empty.
135 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
136 DISPATCH_NONNULL1 DISPATCH_NOTHROW
138 dispatch_queue_attr_set_priority(dispatch_queue_attr_t attr, int priority);
141 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
142 DISPATCH_NONNULL1 DISPATCH_NOTHROW
144 dispatch_queue_attr_set_finalizer(
145 dispatch_queue_attr_t attr,
146 dispatch_queue_finalizer_t finalizer);
149 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
150 DISPATCH_NONNULL1 DISPATCH_NOTHROW
152 dispatch_queue_attr_set_finalizer_f(dispatch_queue_attr_t attr, void *context, dispatch_queue_finalizer_function_t finalizer);
155 * @function dispatch_get_concurrent_queue
158 * Returns a well-known global concurrent queue of a given priority level.
161 * Blocks submitted to the returned queue may be invoked concurrently with
162 * respect to each other.
164 * These queues are useful for performing one-shot asynchronous operations,
165 * e.g. dispatch_async() to an "anonymous" queue; or for performing parallel
166 * loops concurrently on multiple processors, e.g. dispatch_apply().
168 * The dispatch queues returned by this function are managed by the system for
169 * the lifetime of the application, and need not be retained or released
170 * directly by the application. Furthermore, dispatch_suspend() and
171 * dispatch_queue_resume() are not supported on these global queues, and will
175 * The requested priority level for the queue (default is zero):
176 * - DISPATCH_QUEUE_PRIORITY_HIGH
177 * - DISPATCH_QUEUE_PRIORITY_DEFAULT
178 * - DISPATCH_QUEUE_PRIORITY_LOW
181 * Returns a concurrent dispatch queue for use with dispatch_async(),
182 * dispatch_apply(), et al.
184 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
185 DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW
187 dispatch_get_concurrent_queue(long priority);
189 DISPATCH_PUBLIC_API //DISPATCH_DEPRECATED
191 dispatch_queue_attr_set_flags(dispatch_queue_attr_t attr, uint64_t flags);
194 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 DISPATCH_NONNULL2 DISPATCH_DEPRECATED
196 dispatch_call(dispatch_queue_t, dispatch_legacy_block_t work, dispatch_legacy_block_t completion)
197 __asm__("_dispatch_call2");
198 #endif /* __BLOCKS__ */
200 DISPATCH_PUBLIC_API DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_DEPRECATED
202 dispatch_queue_get_current(void);
204 // Use: dispatch_retain
205 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
207 dispatch_queue_retain(dispatch_queue_t);
209 // Use: dispatch_release
210 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
212 dispatch_queue_release(dispatch_queue_t);
214 // Use: dispatch_resume
215 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
217 dispatch_queue_resume(dispatch_queue_t);
219 // Use: dispatch_release
220 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
222 dispatch_source_release(dispatch_source_t);
224 // Use: dispatch_suspend
225 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
227 dispatch_source_suspend(dispatch_source_t);
229 // Use: dispatch_resume
230 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
232 dispatch_source_resume(dispatch_source_t);
234 // Use: dispatch_release
235 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
237 dispatch_queue_attr_release(dispatch_queue_attr_t);
239 // Use: dispatch_release
240 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
242 dispatch_source_attr_release(dispatch_source_attr_t);
244 // Use: dispatch_source_get_handle
245 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_DEPRECATED
247 dispatch_event_get_signals(dispatch_event_t event);
249 // Use: dispatch_get_context
250 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL //DISPATCH_DEPRECATED
252 dispatch_queue_get_context(dispatch_queue_t queue);
254 // Use: dispatch_set_context
255 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 //DISPATCH_DEPRECATED
257 dispatch_queue_set_context(dispatch_queue_t queue, void *context);
259 // Use: dispatch_get_context
260 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL //DISPATCH_DEPRECATED
262 dispatch_source_get_context(dispatch_source_t source);
264 // Use: dispatch_set_context
265 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 //DISPATCH_DEPRECATED
267 dispatch_source_set_context(dispatch_source_t source, void * context);
269 // Use: dispatch_source_merge_data
270 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
272 dispatch_source_custom_trigger(dispatch_source_t ds);
274 // Use: dispatch_source_cancel
275 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
276 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
278 dispatch_cancel(dispatch_source_t);
280 // Use: dispatch_source_testcancel
281 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
282 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
284 dispatch_testcancel(dispatch_source_t);
286 // Use: dispatch_source_set_timer
287 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
288 DISPATCH_NONNULL1 DISPATCH_NOTHROW
290 dispatch_source_timer_set_time(dispatch_source_t ds,
291 uint64_t nanoseconds,
294 // Use: dispatch_source_merge_data
295 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
296 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
298 dispatch_source_trigger(dispatch_source_t source, unsigned long value);
301 DISPATCH_ERROR_DOMAIN_NO_ERROR = 0,
302 DISPATCH_ERROR_DOMAIN_POSIX = 1,
303 DISPATCH_ERROR_DOMAIN_MACH = 2,
307 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
308 DISPATCH_NONNULL1 DISPATCH_WARN_RESULT DISPATCH_NOTHROW
310 dispatch_source_get_error(dispatch_source_t source, long* error);
313 // Use: dispatch_source_get_handle
314 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
315 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
317 dispatch_source_get_machport(dispatch_source_t source);
320 // Use: dispatch_source_get_handle
321 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
322 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
324 dispatch_source_get_descriptor(dispatch_source_t source);
326 // Use: dispatch_source_get_handle
327 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
328 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
330 dispatch_source_get_pid(dispatch_source_t source);
332 // Use: dispatch_source_get_mask
333 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
334 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
336 dispatch_source_get_flags(dispatch_source_t source);
338 // LEGACY: dispatch_event_t == dispatch_source_t
339 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
340 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
342 dispatch_event_get_source(dispatch_event_t event);
344 // Use: dispatch_source_get_error
345 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
346 DISPATCH_NONNULL1 DISPATCH_WARN_RESULT DISPATCH_NOTHROW
348 dispatch_event_get_error(dispatch_event_t event, long* error);
350 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
351 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
353 dispatch_event_get_nanoseconds(dispatch_event_t event);
355 // Use: dispatch_source_get_handle
356 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
357 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
359 dispatch_event_get_signal(dispatch_event_t event);
361 // Use: dispatch_source_get_data
362 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
363 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
365 dispatch_event_get_flags(dispatch_event_t event);
367 // Use: dispatch_source_get_data
368 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
369 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
371 dispatch_event_get_bytes_available(dispatch_event_t event);
373 // Use: dispatch_source_get_data
374 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
375 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
377 dispatch_event_get_count(dispatch_event_t event);
380 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
381 DISPATCH_MALLOC DISPATCH_WARN_RESULT DISPATCH_NOTHROW
382 dispatch_source_attr_t
383 dispatch_source_attr_create(void);
386 #if defined(__BLOCKS__)
387 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
389 dispatch_source_finalizer_t
390 dispatch_source_attr_get_finalizer(dispatch_source_attr_t attr);
391 #endif /* __BLOCKS__ */
394 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
395 DISPATCH_MALLOC DISPATCH_WARN_RESULT DISPATCH_NOTHROW
396 dispatch_source_attr_t
397 dispatch_source_attr_copy(dispatch_source_attr_t proto);
401 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
402 DISPATCH_NONNULL1 DISPATCH_NOTHROW
404 dispatch_source_attr_set_finalizer(
405 dispatch_source_attr_t attr,
406 dispatch_source_finalizer_t finalizer);
407 #endif /* __BLOCKS__ */
410 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
411 DISPATCH_NONNULL1 DISPATCH_NOTHROW
413 dispatch_source_attr_set_finalizer_f(
414 dispatch_source_attr_t attr,
416 dispatch_source_finalizer_function_t finalizer);
419 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
420 DISPATCH_NONNULL1 DISPATCH_NOTHROW
422 dispatch_source_attr_set_context(
423 dispatch_source_attr_t attr,
427 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, ...)
428 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
429 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL5 DISPATCH_NOTHROW
431 dispatch_source_mig_create(
434 dispatch_source_attr_t attr,
435 dispatch_queue_t queue,
436 dispatch_mig_callback_t mig_callback);
440 DISPATCH_TIMER_WALL_CLOCK = 0x4,
444 DISPATCH_TIMER_INTERVAL = 0x0,
445 DISPATCH_TIMER_ONESHOT = 0x1,
446 DISPATCH_TIMER_ABSOLUTE = 0x3,
449 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, ...)
451 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
452 DISPATCH_MALLOC DISPATCH_NONNULL5 DISPATCH_NONNULL6 DISPATCH_NOTHROW
454 dispatch_source_timer_create(
456 uint64_t nanoseconds,
458 dispatch_source_attr_t attr,
459 dispatch_queue_t queue,
460 dispatch_source_handler_t handler);
461 #endif /* __BLOCKS__ */
463 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, ...)
464 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
465 DISPATCH_MALLOC DISPATCH_NONNULL5 DISPATCH_NONNULL7 DISPATCH_NOTHROW
467 dispatch_source_timer_create_f(
469 uint64_t nanoseconds,
471 dispatch_source_attr_t attr,
472 dispatch_queue_t queue,
474 dispatch_source_handler_function_t handler);
476 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, ...)
478 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
479 DISPATCH_MALLOC DISPATCH_NOTHROW
481 dispatch_source_signal_create(
483 dispatch_source_attr_t attr,
484 dispatch_queue_t queue,
485 dispatch_source_handler_t handler);
486 #endif /* __BLOCKS__ */
488 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, ...)
489 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
490 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL5 DISPATCH_NOTHROW
492 dispatch_source_signal_create_f(
494 dispatch_source_attr_t attr,
495 dispatch_queue_t queue,
497 dispatch_source_handler_function_t handler);
499 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)
501 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
502 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
504 dispatch_source_read_create(
506 dispatch_source_attr_t attr,
507 dispatch_queue_t queue,
508 dispatch_source_handler_t handler);
509 #endif /* __BLOCKS__ */
511 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)
512 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
513 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL5 DISPATCH_NOTHROW
515 dispatch_source_read_create_f(
517 dispatch_source_attr_t attr,
518 dispatch_queue_t queue,
520 dispatch_source_handler_function_t handler);
522 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, ...)
524 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
525 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
527 dispatch_source_write_create(
529 dispatch_source_attr_t attr,
530 dispatch_queue_t queue,
531 dispatch_source_handler_t handler);
532 #endif /* __BLOCKS__ */
534 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, ...)
535 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
536 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL5 DISPATCH_NOTHROW
538 dispatch_source_write_create_f(
540 dispatch_source_attr_t attr,
541 dispatch_queue_t queue,
543 dispatch_source_handler_function_t handler);
545 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, ...)
547 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
548 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL5 DISPATCH_NOTHROW
550 dispatch_source_vnode_create(
553 dispatch_source_attr_t attr,
554 dispatch_queue_t queue,
555 dispatch_source_handler_t handler);
556 #endif /* __BLOCKS__ */
558 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, ...)
559 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
560 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL6 DISPATCH_NOTHROW
562 dispatch_source_vnode_create_f(
565 dispatch_source_attr_t attr,
566 dispatch_queue_t queue,
568 dispatch_source_handler_function_t handler);
570 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, ...)
572 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
573 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL5 DISPATCH_NOTHROW
575 dispatch_source_proc_create(
578 dispatch_source_attr_t attr,
579 dispatch_queue_t queue,
580 dispatch_source_handler_t handler);
581 #endif /* __BLOCKS__ */
583 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, ...)
584 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
585 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL6 DISPATCH_NOTHROW
587 dispatch_source_proc_create_f(
590 dispatch_source_attr_t attr,
591 dispatch_queue_t queue,
593 dispatch_source_handler_function_t handler);
596 DISPATCH_MACHPORT_DEAD = 0x1,
597 DISPATCH_MACHPORT_RECV = 0x2,
598 DISPATCH_MACHPORT_DELETED = 0x4,
601 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, ...)
604 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
605 DISPATCH_MALLOC DISPATCH_NOTHROW
607 dispatch_source_machport_create(
610 dispatch_source_attr_t attr,
611 dispatch_queue_t queue,
612 dispatch_source_handler_t handler);
613 #endif /* __BLOCKS__ */
615 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, ...)
616 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
617 DISPATCH_MALLOC DISPATCH_NOTHROW
619 dispatch_source_machport_create_f(
622 dispatch_source_attr_t attr,
623 dispatch_queue_t queue,
625 dispatch_source_handler_function_t handler);
626 #endif /* HAVE_MACH */
629 DISPATCH_SOURCE_DATA_ADD = 1,
630 DISPATCH_SOURCE_DATA_OR,
633 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
635 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
636 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
638 dispatch_source_data_create(
639 unsigned long behavior,
640 dispatch_source_attr_t attr,
641 dispatch_queue_t queue,
642 dispatch_source_handler_t handler);
643 #endif /* __BLOCKS__ */
645 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
646 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
647 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL5 DISPATCH_NOTHROW
649 dispatch_source_data_create_f(
650 unsigned long behavior,
651 dispatch_source_attr_t attr,
652 dispatch_queue_t queue,
654 dispatch_source_handler_function_t handler);
657 DISPATCH_SOURCE_CUSTOM_ADD = DISPATCH_SOURCE_DATA_ADD,
658 DISPATCH_SOURCE_CUSTOM_OR = DISPATCH_SOURCE_DATA_OR,
661 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
663 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
664 DISPATCH_MALLOC DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NOTHROW
666 dispatch_source_custom_create(
667 unsigned long behavior,
668 dispatch_source_attr_t attr,
669 dispatch_queue_t queue,
670 dispatch_event_handler_t handler);
671 #endif /* __BLOCKS__ */
673 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
674 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
675 DISPATCH_MALLOC DISPATCH_NONNULL2 DISPATCH_NONNULL4 DISPATCH_NOTHROW
677 dispatch_source_custom_create_f(
678 unsigned long behavior,
679 dispatch_source_attr_t attr,
680 dispatch_queue_t queue,
682 dispatch_event_handler_function_t handler);
684 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_VFS, ...)
685 #if defined(__BLOCKS__)
686 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
687 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4
689 dispatch_source_vfs_create(
691 dispatch_source_attr_t attr,
692 dispatch_queue_t queue,
693 dispatch_source_handler_t handler);
694 #endif /* __BLOCKS__ */
696 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_VFS, ...)
697 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
698 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL5
700 dispatch_source_vfs_create_f(
702 dispatch_source_attr_t attr,
703 dispatch_queue_t queue,
705 dispatch_source_handler_function_t handler);
709 * Raw Mach message support from MIG source.
711 * It is possible to use the following callback style with the MIG source to
712 * obtain the raw mach message (and send no reply) similar to CFMachPort.
713 * (For more specific CFMachPort compatibility, see below).
715 * void handle_mach_msg(mach_msg_header *msg) { ... }
717 * DISPATCH_MACHPORT_CALLBACK_DECL(mig_compat_callback, handle_mach_msg);
719 * mig = dispatch_source_mig_create(mp, MY_MAX_MSG_SIZE, NULL,
720 * queue, mig_compat_callback);
722 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
724 _dispatch_machport_callback(mach_msg_header_t *msg, mach_msg_header_t *reply, void (*callback)(mach_msg_header_t *));
726 #define DISPATCH_MACHPORT_CALLBACK_DECL(new_callback, existing_callback) \
727 __private_extern__ boolean_t \
728 new_callback(mach_msg_header_t *msg, mach_msg_header_t *reply) \
729 { return _dispatch_machport_callback(msg, reply, existing_callback); }
732 * CFMachPort compatibility.
734 * It is possible to use existing CFMachPort callbacks with dispatch mig sources
735 * by delcaring the following shim and using the shim as the mig server callback
736 * to dispatch_source_mig_create().
737 * The CFMachPortRef "port" parameter of the CFMachPortCallBack will be NULL.
738 * If mach_port_set_context() is used, that value will be passed into the "info"
739 * parameter of the CFMachPortCallBack.
741 * DISPATCH_CFMACHPORT_CALLBACK_DECL(mig_callback, MyCFMachPortCallBack);
745 * kr = mach_port_set_context(mach_task_self(), mp, (mach_vm_address_t)context);
746 * mig = dispatch_source_mig_create(mp, MY_MAX_MSG_SIZE, NULL,
747 * queue, mig_callback);
751 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
753 _dispatch_CFMachPortCallBack(mach_msg_header_t *msg, mach_msg_header_t *reply, void (*callback)(struct __CFMachPort *, void *msg, signed long size, void *));
755 #define DISPATCH_CFMACHPORT_CALLBACK_DECL(new_callback, existing_callback) \
756 __private_extern__ boolean_t \
757 new_callback(mach_msg_header_t *msg, mach_msg_header_t *reply) \
758 { return _dispatch_CFMachPortCallBack(msg, reply, existing_callback); }
760 #endif /* HAVE_MACH */