Tizen 2.1 base
[platform/upstream/gcd.git] / dispatch-1.0 / src / legacy.h
1 /*
2  * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
3  *
4  * @APPLE_APACHE_LICENSE_HEADER_START@
5  * 
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
9  * 
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  * 
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.
17  * 
18  * @APPLE_APACHE_LICENSE_HEADER_END@
19  */
20
21 /*
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.
25  */
26
27 /*
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.
30  */
31  
32 #ifndef __DISPATCH_LEGACY__
33 #define __DISPATCH_LEGACY__
34
35 #ifndef __DISPATCH_INDIRECT__
36 #error "Please #include <dispatch/dispatch.h> instead of this file directly."
37 #include <dispatch/base.h> // for HeaderDoc
38 #endif
39
40 #if HAVE_MACH
41 #include <mach/mach_types.h>
42 #endif
43
44 #define DISPATCH_DEPRECATED __attribute__((deprecated))
45 #define DISPATCH_PUBLIC_API __attribute__((visibility("default")))
46
47 typedef struct dispatch_item_s *dispatch_item_t;
48
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;
53         uint32_t                                di_flags;
54 #if USE_MACH_SEM
55         semaphore_t                             di_semaphore;
56 #endif
57 #if USE_POSIX_SEM
58         /* Legacy API not supported except with Mach semaphores. */
59 #endif
60         void *                                  di_work_func;
61         void *                                  di_work_ctxt;
62         void *                                  di_cback_func;
63         void *                                  di_cback_ctxt;
64         void *                                  di_ctxt;
65 };
66
67 // Use: dispatch_source_t
68 typedef struct dispatch_source_s *dispatch_event_t;
69
70 // Obsolete
71 #ifdef __BLOCKS__
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__ */
80
81 // Obsolete
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;
85
86 DISPATCH_DECL(dispatch_source_attr);
87
88 #define DISPATCH_SOURCE_CREATE_SUSPENDED        ((dispatch_source_attr_t)~0ul)
89
90 #ifdef __BLOCKS__
91 typedef void (^dispatch_queue_finalizer_t)(dispatch_queue_t queue);
92 #endif
93
94 typedef void (*dispatch_queue_finalizer_function_t)(void *, dispatch_queue_t);
95
96 __DISPATCH_BEGIN_DECLS
97
98 /*!
99  * @function dispatch_queue_attr_create
100  *
101  * @abstract
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.
104  *
105  * @discussion
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.
110  *
111  * @result
112  * The new dispatch queue attribute structure, initialized to default values.
113  */
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);
118
119 /*!
120  * @function dispatch_queue_attr_set_priority
121  *
122  * @abstract
123  * Set the priority level for a dispatch queue.
124  *
125  * @discussion
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.
134  */
135 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
136 DISPATCH_NONNULL1 DISPATCH_NOTHROW
137 void
138 dispatch_queue_attr_set_priority(dispatch_queue_attr_t attr, int priority);
139
140 #ifdef __BLOCKS__
141 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
142 DISPATCH_NONNULL1 DISPATCH_NOTHROW
143 long
144 dispatch_queue_attr_set_finalizer(
145                                                                   dispatch_queue_attr_t attr,
146                                                                   dispatch_queue_finalizer_t finalizer);
147 #endif
148
149 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
150 DISPATCH_NONNULL1 DISPATCH_NOTHROW
151 void
152 dispatch_queue_attr_set_finalizer_f(dispatch_queue_attr_t attr, void *context, dispatch_queue_finalizer_function_t finalizer);
153
154 /*!
155  * @function dispatch_get_concurrent_queue
156  *
157  * @abstract
158  * Returns a well-known global concurrent queue of a given priority level.
159  *
160  * @discussion
161  * Blocks submitted to the returned queue may be invoked concurrently with
162  * respect to each other.
163  *
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().
167  *
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
172  * be ignored.
173  *
174  * @param priority
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
179  *
180  * @result
181  * Returns a concurrent dispatch queue for use with dispatch_async(),
182  * dispatch_apply(), et al.
183  */
184 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
185 DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW
186 dispatch_queue_t
187 dispatch_get_concurrent_queue(long priority);
188
189 DISPATCH_PUBLIC_API //DISPATCH_DEPRECATED
190 void
191 dispatch_queue_attr_set_flags(dispatch_queue_attr_t attr, uint64_t flags);
192
193 #ifdef __BLOCKS__
194 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 DISPATCH_NONNULL2 DISPATCH_DEPRECATED
195 dispatch_item_t
196 dispatch_call(dispatch_queue_t, dispatch_legacy_block_t work, dispatch_legacy_block_t completion)
197 __asm__("_dispatch_call2");
198 #endif /* __BLOCKS__ */
199
200 DISPATCH_PUBLIC_API DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_DEPRECATED
201 dispatch_queue_t
202 dispatch_queue_get_current(void);
203
204 // Use: dispatch_retain
205 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
206 void
207 dispatch_queue_retain(dispatch_queue_t);
208
209 // Use: dispatch_release
210 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
211 void
212 dispatch_queue_release(dispatch_queue_t);
213
214 // Use: dispatch_resume
215 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
216 void
217 dispatch_queue_resume(dispatch_queue_t);
218
219 // Use: dispatch_release
220 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
221 void
222 dispatch_source_release(dispatch_source_t);
223
224 // Use: dispatch_suspend
225 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
226 void
227 dispatch_source_suspend(dispatch_source_t);
228
229 // Use: dispatch_resume
230 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
231 void
232 dispatch_source_resume(dispatch_source_t);
233
234 // Use: dispatch_release
235 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
236 void
237 dispatch_queue_attr_release(dispatch_queue_attr_t);
238
239 // Use: dispatch_release
240 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
241 void
242 dispatch_source_attr_release(dispatch_source_attr_t);
243
244 // Use: dispatch_source_get_handle
245 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_DEPRECATED
246 sigset_t
247 dispatch_event_get_signals(dispatch_event_t event);
248
249 // Use: dispatch_get_context
250 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL //DISPATCH_DEPRECATED
251 void *
252 dispatch_queue_get_context(dispatch_queue_t queue);
253   
254 // Use: dispatch_set_context
255 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 //DISPATCH_DEPRECATED
256 void
257 dispatch_queue_set_context(dispatch_queue_t queue, void *context);
258
259 // Use: dispatch_get_context
260 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL //DISPATCH_DEPRECATED
261 void *
262 dispatch_source_get_context(dispatch_source_t source);
263
264 // Use: dispatch_set_context
265 DISPATCH_PUBLIC_API DISPATCH_NONNULL1 //DISPATCH_DEPRECATED
266 void
267 dispatch_source_set_context(dispatch_source_t source, void * context);
268
269 // Use: dispatch_source_merge_data
270 DISPATCH_PUBLIC_API DISPATCH_NONNULL_ALL DISPATCH_DEPRECATED
271 void
272 dispatch_source_custom_trigger(dispatch_source_t ds);
273
274 // Use: dispatch_source_cancel
275 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
276 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
277 void
278 dispatch_cancel(dispatch_source_t);
279
280 // Use: dispatch_source_testcancel
281 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
282 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
283 long
284 dispatch_testcancel(dispatch_source_t);
285
286 // Use: dispatch_source_set_timer
287 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
288 DISPATCH_NONNULL1 DISPATCH_NOTHROW
289 long
290 dispatch_source_timer_set_time(dispatch_source_t ds,
291                                                            uint64_t nanoseconds,
292                                                            uint64_t leeway);
293
294 // Use: dispatch_source_merge_data
295 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
296 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
297 void
298 dispatch_source_trigger(dispatch_source_t source, unsigned long value);
299
300 enum {
301         DISPATCH_ERROR_DOMAIN_NO_ERROR = 0,
302         DISPATCH_ERROR_DOMAIN_POSIX = 1,
303         DISPATCH_ERROR_DOMAIN_MACH = 2,
304 };
305
306 // Obsolete
307 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
308 DISPATCH_NONNULL1 DISPATCH_WARN_RESULT DISPATCH_NOTHROW
309 long
310 dispatch_source_get_error(dispatch_source_t source, long* error);
311
312 #if HAVE_MACH
313 // Use: dispatch_source_get_handle
314 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
315 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
316 mach_port_t
317 dispatch_source_get_machport(dispatch_source_t source);
318 #endif
319
320 // Use: dispatch_source_get_handle
321 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
322 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
323 pid_t
324 dispatch_source_get_descriptor(dispatch_source_t source);
325
326 // Use: dispatch_source_get_handle
327 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
328 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
329 pid_t
330 dispatch_source_get_pid(dispatch_source_t source);
331
332 // Use: dispatch_source_get_mask
333 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
334 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
335 uint64_t
336 dispatch_source_get_flags(dispatch_source_t source);
337
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
341 dispatch_source_t
342 dispatch_event_get_source(dispatch_event_t event);
343
344 // Use: dispatch_source_get_error
345 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
346 DISPATCH_NONNULL1 DISPATCH_WARN_RESULT DISPATCH_NOTHROW
347 long
348 dispatch_event_get_error(dispatch_event_t event, long* error);
349
350 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
351 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
352 uint64_t
353 dispatch_event_get_nanoseconds(dispatch_event_t event);
354
355 // Use: dispatch_source_get_handle
356 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
357 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
358 long
359 dispatch_event_get_signal(dispatch_event_t event);
360
361 // Use: dispatch_source_get_data
362 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
363 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
364 uint64_t
365 dispatch_event_get_flags(dispatch_event_t event);
366
367 // Use: dispatch_source_get_data
368 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
369 DISPATCH_NONNULL_ALL DISPATCH_WARN_RESULT DISPATCH_NOTHROW
370 size_t
371 dispatch_event_get_bytes_available(dispatch_event_t event);
372
373 // Use: dispatch_source_get_data
374 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
375 DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
376 unsigned long
377 dispatch_event_get_count(dispatch_event_t event);
378
379 // Obsolete
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);
384
385 // Obsolete
386 #if defined(__BLOCKS__)
387 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
388 DISPATCH_NOTHROW
389 dispatch_source_finalizer_t
390 dispatch_source_attr_get_finalizer(dispatch_source_attr_t attr);
391 #endif /* __BLOCKS__ */
392
393 // Obsolete
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);
398
399 // Obsolete
400 #ifdef __BLOCKS__
401 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
402 DISPATCH_NONNULL1 DISPATCH_NOTHROW
403 long
404 dispatch_source_attr_set_finalizer(
405         dispatch_source_attr_t attr,
406         dispatch_source_finalizer_t finalizer);
407 #endif /* __BLOCKS__ */
408
409 // Obsolete
410 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
411 DISPATCH_NONNULL1 DISPATCH_NOTHROW
412 void
413 dispatch_source_attr_set_finalizer_f(
414         dispatch_source_attr_t attr,
415         void *context,
416         dispatch_source_finalizer_function_t finalizer);
417
418 // Obsolete
419 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
420 DISPATCH_NONNULL1 DISPATCH_NOTHROW
421 void
422 dispatch_source_attr_set_context(
423         dispatch_source_attr_t attr,
424         void *context);
425
426 #if HAVE_MACH
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
430 dispatch_source_t
431 dispatch_source_mig_create(
432         mach_port_t mport, 
433         size_t max_size,
434         dispatch_source_attr_t attr,
435         dispatch_queue_t queue,
436         dispatch_mig_callback_t mig_callback);
437 #endif
438
439 enum {
440         DISPATCH_TIMER_WALL_CLOCK       = 0x4,
441 };
442
443 enum {
444         DISPATCH_TIMER_INTERVAL = 0x0,
445         DISPATCH_TIMER_ONESHOT  = 0x1,
446         DISPATCH_TIMER_ABSOLUTE = 0x3,
447 };
448
449 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, ...)
450 #ifdef __BLOCKS__
451 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
452 DISPATCH_MALLOC DISPATCH_NONNULL5 DISPATCH_NONNULL6 DISPATCH_NOTHROW
453 dispatch_source_t
454 dispatch_source_timer_create(
455         uint64_t flags,
456         uint64_t nanoseconds,
457         uint64_t leeway,
458         dispatch_source_attr_t attr,
459         dispatch_queue_t queue,
460         dispatch_source_handler_t handler);
461 #endif /* __BLOCKS__ */
462
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
466 dispatch_source_t
467 dispatch_source_timer_create_f(
468         uint64_t flags,
469         uint64_t nanoseconds,
470         uint64_t leeway,
471         dispatch_source_attr_t attr,
472         dispatch_queue_t queue,
473         void *h_context,
474         dispatch_source_handler_function_t handler);
475
476 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, ...)
477 #ifdef __BLOCKS__
478 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
479 DISPATCH_MALLOC DISPATCH_NOTHROW
480 dispatch_source_t
481 dispatch_source_signal_create(
482         unsigned long signo,
483         dispatch_source_attr_t attr,
484         dispatch_queue_t queue,
485         dispatch_source_handler_t handler);
486 #endif /* __BLOCKS__ */
487
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
491 dispatch_source_t
492 dispatch_source_signal_create_f(
493         unsigned long sig,
494         dispatch_source_attr_t attr,
495         dispatch_queue_t queue,
496         void *h_context,
497         dispatch_source_handler_function_t handler);
498
499 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, ...)
500 #ifdef __BLOCKS__
501 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
502 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
503 dispatch_source_t
504 dispatch_source_read_create(
505         int descriptor,
506         dispatch_source_attr_t attr,
507         dispatch_queue_t queue,
508         dispatch_source_handler_t handler);
509 #endif /* __BLOCKS__ */
510
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
514 dispatch_source_t
515 dispatch_source_read_create_f(
516         int descriptor,
517         dispatch_source_attr_t attr,
518         dispatch_queue_t queue,
519         void *h_context,
520         dispatch_source_handler_function_t handler);
521
522 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, ...)
523 #ifdef __BLOCKS__
524 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
525 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
526 dispatch_source_t
527 dispatch_source_write_create(
528         int descriptor, 
529         dispatch_source_attr_t attr,
530         dispatch_queue_t queue,
531         dispatch_source_handler_t handler);
532 #endif /* __BLOCKS__ */
533
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
537 dispatch_source_t
538 dispatch_source_write_create_f(
539         int descriptor, 
540         dispatch_source_attr_t attr,
541         dispatch_queue_t queue,
542         void *h_context,
543         dispatch_source_handler_function_t handler);
544
545 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, ...)
546 #ifdef __BLOCKS__
547 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
548 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL5 DISPATCH_NOTHROW
549 dispatch_source_t
550 dispatch_source_vnode_create(
551         int descriptor,
552         uint64_t flags,
553         dispatch_source_attr_t attr,
554         dispatch_queue_t queue,
555         dispatch_source_handler_t handler);
556 #endif /* __BLOCKS__ */
557
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
561 dispatch_source_t
562 dispatch_source_vnode_create_f(
563         int descriptor,
564         uint64_t flags,
565         dispatch_source_attr_t attr,
566         dispatch_queue_t queue,
567         void *h_context,
568         dispatch_source_handler_function_t handler);
569
570 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, ...)
571 #ifdef __BLOCKS__
572 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
573 DISPATCH_MALLOC DISPATCH_NONNULL4 DISPATCH_NONNULL5 DISPATCH_NOTHROW
574 dispatch_source_t
575 dispatch_source_proc_create(
576         pid_t pid,
577         uint64_t flags,
578         dispatch_source_attr_t attr,
579         dispatch_queue_t queue,
580         dispatch_source_handler_t handler);
581 #endif /* __BLOCKS__ */
582
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
586 dispatch_source_t
587 dispatch_source_proc_create_f(
588         pid_t pid,
589         uint64_t flags, 
590         dispatch_source_attr_t attr,
591         dispatch_queue_t queue,
592         void *h_context,
593         dispatch_source_handler_function_t handler);
594
595 enum {
596         DISPATCH_MACHPORT_DEAD = 0x1,
597         DISPATCH_MACHPORT_RECV = 0x2,
598         DISPATCH_MACHPORT_DELETED = 0x4,
599 };
600
601 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, ...)
602 #if HAVE_MACH
603 #ifdef __BLOCKS__
604 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
605 DISPATCH_MALLOC DISPATCH_NOTHROW
606 dispatch_source_t
607 dispatch_source_machport_create(
608         mach_port_t mport,
609         uint64_t flags, 
610         dispatch_source_attr_t attr,
611         dispatch_queue_t queue,
612         dispatch_source_handler_t handler);
613 #endif /* __BLOCKS__ */
614
615 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, ...)
616 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
617 DISPATCH_MALLOC DISPATCH_NOTHROW
618 dispatch_source_t
619 dispatch_source_machport_create_f(
620         mach_port_t mport,
621         uint64_t flags, 
622         dispatch_source_attr_t attr,
623         dispatch_queue_t queue,
624         void *h_context,
625         dispatch_source_handler_function_t handler);
626 #endif /* HAVE_MACH */
627
628 enum {
629         DISPATCH_SOURCE_DATA_ADD = 1,
630         DISPATCH_SOURCE_DATA_OR,
631 };
632
633 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
634 #ifdef __BLOCKS__
635 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
636 DISPATCH_MALLOC DISPATCH_NONNULL3 DISPATCH_NONNULL4 DISPATCH_NOTHROW
637 dispatch_source_t
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__ */
644
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
648 dispatch_source_t
649 dispatch_source_data_create_f(
650         unsigned long behavior,
651         dispatch_source_attr_t attr,
652         dispatch_queue_t queue,
653         void *h_context,
654         dispatch_source_handler_function_t handler);
655
656 enum {
657         DISPATCH_SOURCE_CUSTOM_ADD = DISPATCH_SOURCE_DATA_ADD,
658         DISPATCH_SOURCE_CUSTOM_OR = DISPATCH_SOURCE_DATA_OR,
659 };
660
661 // Use: dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA..., ...)
662 #ifdef __BLOCKS__
663 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
664 DISPATCH_MALLOC DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NOTHROW
665 dispatch_source_t
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__ */
672
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
676 dispatch_source_t
677 dispatch_source_custom_create_f(
678                                                                 unsigned long behavior,
679                                                                 dispatch_source_attr_t attr,
680                                                                 dispatch_queue_t queue,
681                                                                 void *h_context,
682                                                                 dispatch_event_handler_function_t handler);
683
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
688 dispatch_source_t
689 dispatch_source_vfs_create(
690                                                    uint64_t flags,
691                                                    dispatch_source_attr_t attr,
692                                                    dispatch_queue_t queue,
693                                                    dispatch_source_handler_t handler);
694 #endif /* __BLOCKS__ */
695
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
699 dispatch_source_t
700 dispatch_source_vfs_create_f(
701                                                          uint64_t flags,
702                                                          dispatch_source_attr_t attr,
703                                                          dispatch_queue_t queue,
704                                                          void *h_context,
705                                                          dispatch_source_handler_function_t handler);
706
707 #if HAVE_MACH
708 /*
709  * Raw Mach message support from MIG source.
710  *
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).
714  *
715  * void handle_mach_msg(mach_msg_header *msg) { ... }
716  * ...
717  * DISPATCH_MACHPORT_CALLBACK_DECL(mig_compat_callback, handle_mach_msg);
718  * ...
719  * mig = dispatch_source_mig_create(mp, MY_MAX_MSG_SIZE, NULL,
720  *         queue, mig_compat_callback);
721  */
722 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
723 boolean_t
724 _dispatch_machport_callback(mach_msg_header_t *msg, mach_msg_header_t *reply, void (*callback)(mach_msg_header_t *));
725
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); }
730
731 /*
732  * CFMachPort compatibility.
733  *
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.
740  *
741  * DISPATCH_CFMACHPORT_CALLBACK_DECL(mig_callback, MyCFMachPortCallBack);
742  *
743  * ...
744  * {
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);
748  */
749 struct __CFMachPort;
750
751 __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
752 boolean_t
753 _dispatch_CFMachPortCallBack(mach_msg_header_t *msg, mach_msg_header_t *reply, void (*callback)(struct __CFMachPort *, void *msg, signed long size, void *));
754
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); }
759
760 #endif /* HAVE_MACH */
761
762 __DISPATCH_END_DECLS
763
764 #endif