]>
Commit | Line | Data |
---|---|---|
517da941 | 1 | .\" Copyright (c) 2008-2012 Apple Inc. All rights reserved. |
0ab74447 A |
2 | .Dd May 1, 2009 |
3 | .Dt dispatch_semaphore_create 3 | |
4 | .Os Darwin | |
5 | .Sh NAME | |
6 | .Nm dispatch_semaphore_create , | |
7 | .Nm dispatch_semaphore_signal , | |
8 | .Nm dispatch_semaphore_wait | |
9 | .Nd synchronized counting semaphore | |
10 | .Sh SYNOPSIS | |
11 | .Fd #include <dispatch/dispatch.h> | |
12 | .Ft dispatch_semaphore_t | |
13 | .Fo dispatch_semaphore_create | |
14 | .Fa "long count" | |
15 | .Fc | |
16 | .Ft long | |
17 | .Fo dispatch_semaphore_signal | |
18 | .Fa "dispatch_semaphore_t semaphore" | |
19 | .Fc | |
20 | .Ft long | |
21 | .Fo dispatch_semaphore_wait | |
22 | .Fa "dispatch_semaphore_t semaphore" "dispatch_time_t timeout" | |
23 | .Fc | |
24 | .Sh DESCRIPTION | |
25 | Dispatch semaphores are used to synchronize threads. | |
26 | The | |
27 | .Fa timeout | |
28 | parameter is creatable with the | |
29 | .Xr dispatch_time 3 | |
30 | or | |
31 | .Xr dispatch_walltime 3 | |
32 | functions. | |
33 | .Sh COMPLETION SYNCHRONIZATION | |
34 | If the | |
35 | .Fa count | |
e85f4437 A |
36 | parameter is equal to zero, then the semaphore is useful for synchronizing |
37 | completion of work. | |
0ab74447 A |
38 | For example: |
39 | .Bd -literal -offset indent | |
40 | sema = dispatch_semaphore_create(0); | |
41 | ||
42 | dispatch_async(queue, ^{ | |
43 | foo(); | |
44 | dispatch_semaphore_signal(sema); | |
45 | }); | |
46 | ||
47 | bar(); | |
48 | ||
49 | dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); | |
50 | .Ed | |
51 | .Sh FINITE RESOURCE POOL | |
52 | If the | |
53 | .Fa count | |
e85f4437 A |
54 | parameter is greater than zero, then the semaphore is useful for managing a |
55 | finite pool of resources. | |
0ab74447 A |
56 | For example, a library that wants to limit Unix descriptor usage: |
57 | .Bd -literal -offset indent | |
58 | sema = dispatch_semaphore_create(getdtablesize() / 4); | |
59 | .Ed | |
60 | .Pp | |
61 | At each Unix FD allocation: | |
62 | .Bd -literal -offset indent | |
63 | dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); | |
64 | fd = open("/etc/services", O_RDONLY); | |
65 | .Ed | |
66 | .Pp | |
67 | When each FD is closed: | |
68 | .Bd -literal -offset indent | |
69 | close(fd); | |
70 | dispatch_semaphore_signal(sema); | |
71 | .Ed | |
72 | .Sh RETURN VALUES | |
73 | The | |
74 | .Fn dispatch_semaphore_create | |
75 | function returns NULL if no memory is available or if the | |
76 | .Fa count | |
77 | parameter is less than zero. | |
78 | .Pp | |
79 | The | |
80 | .Fn dispatch_semaphore_signal | |
81 | function returns non-zero when a thread is woken. | |
82 | Otherwise, zero is returned. | |
83 | .Pp | |
84 | The | |
85 | .Fn dispatch_semaphore_wait | |
e85f4437 A |
86 | function returns zero upon success and non-zero after the timeout expires. If |
87 | the timeout is DISPATCH_TIME_FOREVER, then | |
0ab74447 A |
88 | .Fn dispatch_semaphore_wait |
89 | waits forever and always returns zero. | |
90 | .Sh MEMORY MODEL | |
91 | Dispatch semaphores are retained and released via calls to | |
92 | .Fn dispatch_retain | |
93 | and | |
94 | .Fn dispatch_release . | |
95 | .Sh CAVEATS | |
e85f4437 A |
96 | Unbalanced dispatch semaphores cannot be released. |
97 | For a given semaphore, calls to | |
98 | .Fn dispatch_semaphore_signal | |
99 | and | |
100 | .Fn dispatch_semaphore_wait | |
101 | must be balanced before | |
102 | .Fn dispatch_release | |
103 | is called on it. | |
0ab74447 | 104 | .Sh SEE ALSO |
e85f4437 | 105 | .Xr dispatch 3 , |
0ab74447 | 106 | .Xr dispatch_object 3 |