1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>GRPC Core: include/grpc/support/sync.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">GRPC Core
 <span id="projectnumber">0.10.0.0</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Pages</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_9d7a14d6d9adcbe4c35dbdb88d867e2e.html">grpc</a></li><li class="navelem"><a class="el" href="dir_cad3142e04109052413f2d2a2d1813b0.html">support</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">sync.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="sync_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * Copyright 2015, Google Inc.</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * All rights reserved.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * modification, are permitted provided that the following conditions are</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * met:</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> * * Redistributions of source code must retain the above copyright</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> * notice, this list of conditions and the following disclaimer.</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"> * * Redistributions in binary form must reproduce the above</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment"> * copyright notice, this list of conditions and the following disclaimer</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment"> * in the documentation and/or other materials provided with the</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment"> * distribution.</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment"> * * Neither the name of Google Inc. nor the names of its</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment"> * contributors may be used to endorse or promote products derived from</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment"> * this software without specific prior written permission.</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment"> * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment"> * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"> * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> *</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#ifndef GRPC_SUPPORT_SYNC_H</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor"></span><span class="preprocessor">#define GRPC_SUPPORT_SYNC_H</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor"></span><span class="comment">/* Synchronization primitives for GPR.</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment"></span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment"> The type gpr_mu provides a non-reentrant mutex (lock).</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment"></span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"> The type gpr_cv provides a condition variable.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment"></span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"> The type gpr_once provides for one-time initialization.</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"></span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"> The type gpr_event provides one-time-setting, reading, and</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> waiting of a void*, with memory barriers.</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"></span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> The type gpr_refcount provides an object reference counter,</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> with memory barriers suitable to control</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> object lifetimes.</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"></span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment"> The type gpr_stats_counter provides an atomic statistics counter. It</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> provides no memory barriers.</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment">/* Platform-specific type declarations of gpr_mu and gpr_cv. */</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="preprocessor">#include <<a class="code" href="port__platform_8h.html">grpc/support/port_platform.h</a>></span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#include <<a class="code" href="sync__generic_8h.html">grpc/support/sync_generic.h</a>></span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="preprocessor">#if defined(GPR_POSIX_SYNC)</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="preprocessor"></span><span class="preprocessor">#include <<a class="code" href="sync__posix_8h.html">grpc/support/sync_posix.h</a>></span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="preprocessor">#elif defined(GPR_WIN32)</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="preprocessor"></span><span class="preprocessor">#include <<a class="code" href="sync__win32_8h.html">grpc/support/sync_win32.h</a>></span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="preprocessor">#elif !defined(GPR_CUSTOM_SYNC)</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="preprocessor"></span><span class="preprocessor">#error Unable to determine platform for sync</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="preprocessor">#include <<a class="code" href="time_8h.html">grpc/support/time.h</a>></span> <span class="comment">/* for gpr_timespec */</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor">#include <<a class="code" href="cancellable__platform_8h.html">grpc/support/cancellable_platform.h</a>></span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment">/* --- Mutex interface ---</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment"></span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment"> At most one thread may hold an exclusive lock on a mutex at any given time.</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment"> Actions taken by a thread that holds a mutex exclusively happen after</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment"> actions taken by all previous holders of the mutex. Variables of type</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment"> gpr_mu are uninitialized when first declared. */</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> </div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment">/* Initialize *mu. Requires: *mu uninitialized. */</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a16694f755266c254390b041a0f069094">gpr_mu_init</a>(<a class="code" href="structgpr__mu.html">gpr_mu</a> *mu);</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="comment">/* Cause *mu no longer to be initialized, freeing any memory in use. Requires:</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="comment"> *mu initialized; no other concurrent operation on *mu. */</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a52ae2524c7dade8cecb9f01ff4792c9e">gpr_mu_destroy</a>(<a class="code" href="structgpr__mu.html">gpr_mu</a> *mu);</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="comment">/* Wait until no thread has a lock on *mu, cause the calling thread to own an</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="comment"> exclusive lock on *mu, then return. May block indefinitely or crash if the</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment"> calling thread has a lock on *mu. Requires: *mu initialized. */</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a44b385455d169e6c84659adb222c1d42">gpr_mu_lock</a>(<a class="code" href="structgpr__mu.html">gpr_mu</a> *mu);</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="comment">/* Release an exclusive lock on *mu held by the calling thread. Requires: *mu</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="comment"> initialized; the calling thread holds an exclusive lock on *mu. */</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a91370fd0eb76bc1323c80815ad6e9cff">gpr_mu_unlock</a>(<a class="code" href="structgpr__mu.html">gpr_mu</a> *mu);</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="comment">/* Without blocking, attempt to acquire an exclusive lock on *mu for the</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="comment"> calling thread, then return non-zero iff success. Fail, if any thread holds</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="comment"> the lock; succeeds with high probability if no thread holds the lock.</span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="comment"> Requires: *mu initialized. */</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="keywordtype">int</span> <a class="code" href="sync_8h.html#a65a42bb7ca9072b0e7b581d715a8e777">gpr_mu_trylock</a>(<a class="code" href="structgpr__mu.html">gpr_mu</a> *mu);</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="comment">/* --- Condition variable interface ---</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="comment"></span></div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="comment"> A while-loop should be used with gpr_cv_wait() when waiting for conditions</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment"> to become true. See the example below. Variables of type gpr_cv are</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment"> uninitialized when first declared. */</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="comment">/* Initialize *cv. Requires: *cv uninitialized. */</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#ad24aac3d86113f0fcffc6c4595da9cb2">gpr_cv_init</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment">/* Cause *cv no longer to be initialized, freeing any memory in use. Requires:</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment"> *cv initialized; no other concurrent operation on *cv.*/</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a652900a910676d5cae9ccba052adb6b0">gpr_cv_destroy</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv);</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment">/* Atomically release *mu and wait on *cv. When the calling thread is woken</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"> from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu)</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment"> and return whether the deadline was exceeded. Use</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="comment"> abs_deadline==gpr_inf_future for no deadline. May return even when not</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="comment"> woken explicitly. Requires: *mu and *cv initialized; the calling thread</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="comment"> holds an exclusive lock on *mu. */</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="keywordtype">int</span> <a class="code" href="sync_8h.html#ad5d8d01509b75addc44e5a43783a826e">gpr_cv_wait</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv, <a class="code" href="structgpr__mu.html">gpr_mu</a> *mu, <a class="code" href="structgpr__timespec.html">gpr_timespec</a> abs_deadline);</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span> <span class="comment">/* Behave like gpr_cv_wait(cv, mu, abs_deadline), except behave as though</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="comment"> the deadline has expired if *c is cancelled. */</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="keywordtype">int</span> <a class="code" href="sync_8h.html#a5f1df649a9885ff2354dd4ce611017d9">gpr_cv_cancellable_wait</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv, <a class="code" href="structgpr__mu.html">gpr_mu</a> *mu, <a class="code" href="structgpr__timespec.html">gpr_timespec</a> abs_deadline,</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment">/* If any threads are waiting on *cv, wake at least one.</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="comment"> Clients may treat this as an optimization of gpr_cv_broadcast()</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="comment"> for use in the case where waking more than one waiter is not useful.</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="comment"> Requires: *cv initialized. */</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#aba119d0b92b0bd50e6efa9e2abe07a5f">gpr_cv_signal</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv);</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment">/* Wake all threads waiting on *cv. Requires: *cv initialized. */</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#ad5a4b4a5844668d188db89dda6ad205b">gpr_cv_broadcast</a>(<a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> *cv);</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span> <span class="comment">/* --- Cancellation ---</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="comment"> A gpr_cancellable can be used with gpr_cv_cancellable_wait()</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="comment"> or gpr_event_cancellable_wait() cancel pending waits. */</span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment">/* Initialize *c. */</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#aec0b0e9b9f084550cdec300da1f31add">gpr_cancellable_init</a>(<a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment">/* Cause *c no longer to be initialized, freeing any memory in use. Requires:</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment"> *c initialized; no other concurrent operation on *c. */</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#aa82b7172b992bd33bd6fd4b4dc89e338">gpr_cancellable_destroy</a>(<a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> </div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment">/* Return non-zero iff *c has been cancelled. Requires *c initialized.</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="comment"> This call is faster than acquiring a mutex on most platforms. */</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span> <span class="keywordtype">int</span> <a class="code" href="sync_8h.html#a1e53047443e5eb1f9895be0c90bc790b">gpr_cancellable_is_cancelled</a>(<a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="comment">/* Cancel *c. If *c was not previously cancelled, cause</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="comment"> gpr_cancellable_init() to return non-zero, and outstanding and future</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span> <span class="comment"> calls to gpr_cv_cancellable_wait() and gpr_event_cancellable_wait() to</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="comment"> return immediately indicating a timeout has occurred; otherwise do nothing.</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="comment"> Requires *c initialized.*/</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a895fb73161d2dd1fa19be10d5395001c">gpr_cancellable_cancel</a>(<a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> <span class="comment">/* --- One-time initialization ---</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span> <span class="comment"></span></div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="comment"> gpr_once must be declared with static storage class, and initialized with</span></div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="comment"> GPR_ONCE_INIT. e.g.,</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment"> static gpr_once once_var = GPR_ONCE_INIT; */</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span> </div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="comment">/* Ensure that (*init_routine)() has been called exactly once (for the</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="comment"> specified gpr_once instance) and then return.</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="comment"> If multiple threads call gpr_once() on the same gpr_once instance, one of</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="comment"> them will call (*init_routine)(), and the others will block until that call</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="comment"> finishes.*/</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#ad5c88872723a129b09200b1892d2323f">gpr_once_init</a>(<a class="code" href="sync__posix_8h.html#a28731dc17a4158343f58f453a4d5e37f">gpr_once</a> *once, <span class="keywordtype">void</span> (*init_routine)(<span class="keywordtype">void</span>));</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="comment">/* --- One-time event notification ---</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="comment"></span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="comment"> These operations act on a gpr_event, which should be initialized with</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="comment"> gpr_ev_init(), or with GPR_EVENT_INIT if static, e.g.,</span></div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="comment"> static gpr_event event_var = GPR_EVENT_INIT;</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <span class="comment"> It requires no destruction. */</span></div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> </div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="comment">/* Initialize *ev. */</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a93f37cd27964fda51acd4cd8e6737922">gpr_event_init</a>(<a class="code" href="structgpr__event.html">gpr_event</a> *ev);</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span> </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="comment">/* Set *ev so that gpr_event_get() and gpr_event_wait() will return value.</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="comment"> Requires: *ev initialized; value != NULL; no prior or concurrent calls to</span></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="comment"> gpr_event_set(ev, ...) since initialization. */</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a1b1d014640e00512f6789dacc4ff88bd">gpr_event_set</a>(<a class="code" href="structgpr__event.html">gpr_event</a> *ev, <span class="keywordtype">void</span> *<a class="code" href="hpack__table_8c.html#a8556878012feffc9e0beb86cd78f424d">value</a>);</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="comment">/* Return the value set by gpr_event_set(ev, ...), or NULL if no such call has</span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <span class="comment"> completed. If the result is non-NULL, all operations that occurred prior to</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="comment"> the gpr_event_set(ev, ...) set will be visible after this call returns.</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="comment"> Requires: *ev initialized. This operation is faster than acquiring a mutex</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="comment"> on most platforms. */</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="keywordtype">void</span> *<a class="code" href="sync_8h.html#ac0a2305d9e6575cc5a3d92bc3f12c161">gpr_event_get</a>(<a class="code" href="structgpr__event.html">gpr_event</a> *ev);</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="comment">/* Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is</span></div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment"> exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment"> abs_deadline==gpr_inf_future for no deadline. When the event has been</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment"> signalled before the call, this operation is faster than acquiring a mutex</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment"> on most platforms. */</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="keywordtype">void</span> *<a class="code" href="sync_8h.html#a01d442a76ff77f64d9f898b22ea33db7">gpr_event_wait</a>(<a class="code" href="structgpr__event.html">gpr_event</a> *ev, <a class="code" href="structgpr__timespec.html">gpr_timespec</a> abs_deadline);</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="comment">/* Behave like gpr_event_wait(ev, abs_deadline), except behave as though</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="comment"> the deadline has expired if *c is cancelled. */</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="keywordtype">void</span> *<a class="code" href="sync_8h.html#ae048c7e762b723821e35a07fd0d85e22">gpr_event_cancellable_wait</a>(<a class="code" href="structgpr__event.html">gpr_event</a> *ev, <a class="code" href="structgpr__timespec.html">gpr_timespec</a> abs_deadline,</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="structgpr__cancellable.html">gpr_cancellable</a> *c);</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="comment">/* --- Reference counting ---</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="comment"></span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="comment"> These calls act on the type gpr_refcount. It requires no destruction. */</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="comment">/* Initialize *r to value n. */</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a235584f36572b5410b042ee63cb0740b">gpr_ref_init</a>(<a class="code" href="structgpr__refcount.html">gpr_refcount</a> *r, <span class="keywordtype">int</span> n);</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <span class="comment">/* Increment the reference count *r. Requires *r initialized. */</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#ac0e52c6bfc7a04ba8a269f3227104571">gpr_ref</a>(<a class="code" href="structgpr__refcount.html">gpr_refcount</a> *r);</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="comment">/* Increment the reference count *r by n. Requires *r initialized, n > 0. */</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a516e26b66b1aa53fba8f5f52b249cb25">gpr_refn</a>(<a class="code" href="structgpr__refcount.html">gpr_refcount</a> *r, <span class="keywordtype">int</span> n);</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="comment">/* Decrement the reference count *r and return non-zero iff it has reached</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="comment"> zero. . Requires *r initialized. */</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span> <span class="keywordtype">int</span> <a class="code" href="sync_8h.html#a76b570c831b14070c37e708dde91b795">gpr_unref</a>(<a class="code" href="structgpr__refcount.html">gpr_refcount</a> *r);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span> <span class="comment">/* --- Stats counters ---</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="comment"></span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="comment"> These calls act on the integral type gpr_stats_counter. It requires no</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="comment"> destruction. Static instances may be initialized with</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> <span class="comment"> gpr_stats_counter c = GPR_STATS_INIT;</span></div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="comment"> Beware: These operations do not imply memory barriers. Do not use them to</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> <span class="comment"> synchronize other events. */</span></div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="comment">/* Initialize *c to the value n. */</span></div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a76b8e5de6e1baa4fd66c014417dc0a30">gpr_stats_init</a>(<a class="code" href="structgpr__stats__counter.html">gpr_stats_counter</a> *c, <a class="code" href="port__platform_8h.html#a72d9d0d00bd576cfc8eab61aaea76db2">gpr_intptr</a> n);</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span> <span class="comment">/* *c += inc. Requires: *c initialized. */</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span> <span class="keywordtype">void</span> <a class="code" href="sync_8h.html#a8e51ec3b46c7c03602e2279a802daa1c">gpr_stats_inc</a>(<a class="code" href="structgpr__stats__counter.html">gpr_stats_counter</a> *c, <a class="code" href="port__platform_8h.html#a72d9d0d00bd576cfc8eab61aaea76db2">gpr_intptr</a> inc);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> </div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> <span class="comment">/* Return *c. Requires: *c initialized. */</span></div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <a class="code" href="port__platform_8h.html#a72d9d0d00bd576cfc8eab61aaea76db2">gpr_intptr</a> <a class="code" href="sync_8h.html#abb2c58da7d0b785887266b3b1890764d">gpr_stats_read</a>(<span class="keyword">const</span> <a class="code" href="structgpr__stats__counter.html">gpr_stats_counter</a> *c);</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="comment">/* ==================Example use of interface===================</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="comment"> A producer-consumer queue of up to N integers,</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> <span class="comment"> illustrating the use of the calls in this interface. */</span></div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span> <span class="preprocessor">#if 0</span></div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span> <span class="preprocessor">#define N 4</span></div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keyword">typedef</span> <span class="keyword">struct </span>queue {</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> non_empty; <span class="comment">/* Signalled when length becomes non-zero. */</span></div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <a class="code" href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a> non_full; <span class="comment">/* Signalled when length becomes non-N. */</span></div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <a class="code" href="structgpr__mu.html">gpr_mu</a> mu; <span class="comment">/* Protects all fields below.</span></div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span> <span class="comment"> (That is, except during initialization or</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span> <span class="comment"> destruction, the fields below should be accessed</span></div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span> <span class="comment"> only by a thread that holds mu.) */</span></div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordtype">int</span> head; <span class="comment">/* Index of head of queue 0..N-1. */</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordtype">int</span> length; <span class="comment">/* Number of valid elements in queue 0..N. */</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordtype">int</span> elem[N]; <span class="comment">/* elem[head .. head+length-1] are queue elements. */</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  } queue;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">/* Initialize *q. */</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordtype">void</span> queue_init(queue *q) {</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <a class="code" href="sync_8h.html#a16694f755266c254390b041a0f069094">gpr_mu_init</a>(&q->mu);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="sync_8h.html#ad24aac3d86113f0fcffc6c4595da9cb2">gpr_cv_init</a>(&q->non_empty);</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="sync_8h.html#ad24aac3d86113f0fcffc6c4595da9cb2">gpr_cv_init</a>(&q->non_full);</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  q->head = 0;</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  q->length = 0;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  }</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">/* Free storage associated with *q. */</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordtype">void</span> queue_destroy(queue *q) {</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="sync_8h.html#a52ae2524c7dade8cecb9f01ff4792c9e">gpr_mu_destroy</a>(&q->mu);</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="sync_8h.html#a652900a910676d5cae9ccba052adb6b0">gpr_cv_destroy</a>(&q->non_empty);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <a class="code" href="sync_8h.html#a652900a910676d5cae9ccba052adb6b0">gpr_cv_destroy</a>(&q->non_full);</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  }</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span> </div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="comment">/* Wait until there is room in *q, then append x to *q. */</span></div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordtype">void</span> queue_append(queue *q, <span class="keywordtype">int</span> x) {</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="sync_8h.html#a44b385455d169e6c84659adb222c1d42">gpr_mu_lock</a>(&q->mu);</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="comment">/* To wait for a predicate without a deadline, loop on the negation of the</span></div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span> <span class="comment"> predicate, and use gpr_cv_wait(..., gpr_inf_future) inside the loop</span></div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span> <span class="comment"> to release the lock, wait, and reacquire on each iteration. Code that</span></div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span> <span class="comment"> makes the condition true should use gpr_cv_broadcast() on the</span></div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span> <span class="comment"> corresponding condition variable. The predicate must be on state</span></div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span> <span class="comment"> protected by the lock. */</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">while</span> (q->length == N) {</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <a class="code" href="sync_8h.html#ad5d8d01509b75addc44e5a43783a826e">gpr_cv_wait</a>(&q->non_full, &q->mu, <a class="code" href="time_8h.html#a9324a2b33d5d7686fb14714c59ff026d">gpr_inf_future</a>);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">if</span> (q->length == 0) { <span class="comment">/* Wake threads blocked in queue_remove(). */</span></div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">/* It's normal to use gpr_cv_broadcast() or gpr_signal() while</span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span> <span class="comment"> holding the lock. */</span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <a class="code" href="sync_8h.html#ad5a4b4a5844668d188db89dda6ad205b">gpr_cv_broadcast</a>(&q->non_empty);</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  q->elem[(q->head + q->length) % N] = x;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  q->length++;</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <a class="code" href="sync_8h.html#a91370fd0eb76bc1323c80815ad6e9cff">gpr_mu_unlock</a>(&q->mu);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">/* If it can be done without blocking, append x to *q and return non-zero.</span></div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span> <span class="comment"> Otherwise return 0. */</span></div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordtype">int</span> queue_try_append(queue *q, <span class="keywordtype">int</span> x) {</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordtype">int</span> result = 0;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">if</span> (<a class="code" href="sync_8h.html#a65a42bb7ca9072b0e7b581d715a8e777">gpr_mu_trylock</a>(&q->mu)) {</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">if</span> (q->length != N) {</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">if</span> (q->length == 0) { <span class="comment">/* Wake threads blocked in queue_remove(). */</span></div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="sync_8h.html#ad5a4b4a5844668d188db89dda6ad205b">gpr_cv_broadcast</a>(&q->non_empty);</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  q->elem[(q->head + q->length) % N] = x;</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  q->length++;</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  result = 1;</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  }</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <a class="code" href="sync_8h.html#a91370fd0eb76bc1323c80815ad6e9cff">gpr_mu_unlock</a>(&q->mu);</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  }</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  }</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="comment">/* Wait until the *q is non-empty or deadline abs_deadline passes. If the</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span> <span class="comment"> queue is non-empty, remove its head entry, place it in *head, and return</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span> <span class="comment"> non-zero. Otherwise return 0. */</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordtype">int</span> queue_remove(queue *q, <span class="keywordtype">int</span> *head, <a class="code" href="structgpr__timespec.html">gpr_timespec</a> abs_deadline) {</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordtype">int</span> result = 0;</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <a class="code" href="sync_8h.html#a44b385455d169e6c84659adb222c1d42">gpr_mu_lock</a>(&q->mu);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment">/* To wait for a predicate with a deadline, loop on the negation of the</span></div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="comment"> predicate or until gpr_cv_wait() returns true. Code that makes</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="comment"> the condition true should use gpr_cv_broadcast() on the corresponding</span></div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="comment"> condition variable. The predicate must be on state protected by the</span></div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="comment"> lock. */</span></div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">while</span> (q->length == 0 &&</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  !<a class="code" href="sync_8h.html#ad5d8d01509b75addc44e5a43783a826e">gpr_cv_wait</a>(&q->non_empty, &q->mu, abs_deadline)) {</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="keywordflow">if</span> (q->length != 0) { <span class="comment">/* Queue is non-empty. */</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  result = 1;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">if</span> (q->length == N) { <span class="comment">/* Wake threads blocked in queue_append(). */</span></div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <a class="code" href="sync_8h.html#ad5a4b4a5844668d188db89dda6ad205b">gpr_cv_broadcast</a>(&q->non_full);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  }</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  *head = q->elem[q->head];</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  q->head = (q->head + 1) % N;</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  q->length--;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  } <span class="comment">/* else deadline exceeded */</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <a class="code" href="sync_8h.html#a91370fd0eb76bc1323c80815ad6e9cff">gpr_mu_unlock</a>(&q->mu);</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  }</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="preprocessor">#endif </span><span class="comment">/* 0 */</span><span class="preprocessor"></span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="preprocessor"></span>}</div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="preprocessor"></span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="preprocessor">#endif </span><span class="comment">/* GRPC_SUPPORT_SYNC_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="sync__posix_8h_html"><div class="ttname"><a href="sync__posix_8h.html">sync_posix.h</a></div></div>
<div class="ttc" id="hpack__table_8c_html_a8556878012feffc9e0beb86cd78f424d"><div class="ttname"><a href="hpack__table_8c.html#a8556878012feffc9e0beb86cd78f424d">value</a></div><div class="ttdeci">const char * value</div><div class="ttdef"><b>Definition:</b> hpack_table.c:44</div></div>
<div class="ttc" id="sync_8h_html_a44b385455d169e6c84659adb222c1d42"><div class="ttname"><a href="sync_8h.html#a44b385455d169e6c84659adb222c1d42">gpr_mu_lock</a></div><div class="ttdeci">void gpr_mu_lock(gpr_mu *mu)</div></div>
<div class="ttc" id="sync_8h_html_ac0e52c6bfc7a04ba8a269f3227104571"><div class="ttname"><a href="sync_8h.html#ac0e52c6bfc7a04ba8a269f3227104571">gpr_ref</a></div><div class="ttdeci">void gpr_ref(gpr_refcount *r)</div><div class="ttdef"><b>Definition:</b> sync.c:114</div></div>
<div class="ttc" id="sync_8h_html_a8e51ec3b46c7c03602e2279a802daa1c"><div class="ttname"><a href="sync_8h.html#a8e51ec3b46c7c03602e2279a802daa1c">gpr_stats_inc</a></div><div class="ttdeci">void gpr_stats_inc(gpr_stats_counter *c, gpr_intptr inc)</div><div class="ttdef"><b>Definition:</b> sync.c:130</div></div>
<div class="ttc" id="sync_8h_html_ac0a2305d9e6575cc5a3d92bc3f12c161"><div class="ttname"><a href="sync_8h.html#ac0a2305d9e6575cc5a3d92bc3f12c161">gpr_event_get</a></div><div class="ttdeci">void * gpr_event_get(gpr_event *ev)</div><div class="ttdef"><b>Definition:</b> sync.c:80</div></div>
<div class="ttc" id="port__platform_8h_html"><div class="ttname"><a href="port__platform_8h.html">port_platform.h</a></div></div>
<div class="ttc" id="sync_8h_html_a1e53047443e5eb1f9895be0c90bc790b"><div class="ttname"><a href="sync_8h.html#a1e53047443e5eb1f9895be0c90bc790b">gpr_cancellable_is_cancelled</a></div><div class="ttdeci">int gpr_cancellable_is_cancelled(gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> cancellable.c:51</div></div>
<div class="ttc" id="port__platform_8h_html_a72d9d0d00bd576cfc8eab61aaea76db2"><div class="ttname"><a href="port__platform_8h.html#a72d9d0d00bd576cfc8eab61aaea76db2">gpr_intptr</a></div><div class="ttdeci">intptr_t gpr_intptr</div><div class="ttdef"><b>Definition:</b> port_platform.h:312</div></div>
<div class="ttc" id="sync_8h_html_a516e26b66b1aa53fba8f5f52b249cb25"><div class="ttname"><a href="sync_8h.html#a516e26b66b1aa53fba8f5f52b249cb25">gpr_refn</a></div><div class="ttdeci">void gpr_refn(gpr_refcount *r, int n)</div><div class="ttdef"><b>Definition:</b> sync.c:116</div></div>
<div class="ttc" id="structgpr__refcount_html"><div class="ttname"><a href="structgpr__refcount.html">gpr_refcount</a></div><div class="ttdef"><b>Definition:</b> sync_generic.h:49</div></div>
<div class="ttc" id="sync_8h_html_ad5c88872723a129b09200b1892d2323f"><div class="ttname"><a href="sync_8h.html#ad5c88872723a129b09200b1892d2323f">gpr_once_init</a></div><div class="ttdeci">void gpr_once_init(gpr_once *once, void(*init_routine)(void))</div></div>
<div class="ttc" id="sync__generic_8h_html"><div class="ttname"><a href="sync__generic_8h.html">sync_generic.h</a></div></div>
<div class="ttc" id="sync_8h_html_abb2c58da7d0b785887266b3b1890764d"><div class="ttname"><a href="sync_8h.html#abb2c58da7d0b785887266b3b1890764d">gpr_stats_read</a></div><div class="ttdeci">gpr_intptr gpr_stats_read(const gpr_stats_counter *c)</div><div class="ttdef"><b>Definition:</b> sync.c:134</div></div>
<div class="ttc" id="sync_8h_html_a652900a910676d5cae9ccba052adb6b0"><div class="ttname"><a href="sync_8h.html#a652900a910676d5cae9ccba052adb6b0">gpr_cv_destroy</a></div><div class="ttdeci">void gpr_cv_destroy(gpr_cv *cv)</div></div>
<div class="ttc" id="time_8h_html"><div class="ttname"><a href="time_8h.html">time.h</a></div></div>
<div class="ttc" id="sync_8h_html_a5f1df649a9885ff2354dd4ce611017d9"><div class="ttname"><a href="sync_8h.html#a5f1df649a9885ff2354dd4ce611017d9">gpr_cv_cancellable_wait</a></div><div class="ttdeci">int gpr_cv_cancellable_wait(gpr_cv *cv, gpr_mu *mu, gpr_timespec abs_deadline, gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> cancellable.c:133</div></div>
<div class="ttc" id="sync__win32_8h_html"><div class="ttname"><a href="sync__win32_8h.html">sync_win32.h</a></div></div>
<div class="ttc" id="sync_8h_html_a65a42bb7ca9072b0e7b581d715a8e777"><div class="ttname"><a href="sync_8h.html#a65a42bb7ca9072b0e7b581d715a8e777">gpr_mu_trylock</a></div><div class="ttdeci">int gpr_mu_trylock(gpr_mu *mu)</div></div>
<div class="ttc" id="sync_8h_html_ad5d8d01509b75addc44e5a43783a826e"><div class="ttname"><a href="sync_8h.html#ad5d8d01509b75addc44e5a43783a826e">gpr_cv_wait</a></div><div class="ttdeci">int gpr_cv_wait(gpr_cv *cv, gpr_mu *mu, gpr_timespec abs_deadline)</div></div>
<div class="ttc" id="sync_8h_html_a01d442a76ff77f64d9f898b22ea33db7"><div class="ttname"><a href="sync_8h.html#a01d442a76ff77f64d9f898b22ea33db7">gpr_event_wait</a></div><div class="ttdeci">void * gpr_event_wait(gpr_event *ev, gpr_timespec abs_deadline)</div><div class="ttdef"><b>Definition:</b> sync.c:84</div></div>
<div class="ttc" id="time_8h_html_a9324a2b33d5d7686fb14714c59ff026d"><div class="ttname"><a href="time_8h.html#a9324a2b33d5d7686fb14714c59ff026d">gpr_inf_future</a></div><div class="ttdeci">gpr_timespec gpr_inf_future(gpr_clock_type type)</div><div class="ttdef"><b>Definition:</b> time.c:83</div></div>
<div class="ttc" id="sync_8h_html_a1b1d014640e00512f6789dacc4ff88bd"><div class="ttname"><a href="sync_8h.html#a1b1d014640e00512f6789dacc4ff88bd">gpr_event_set</a></div><div class="ttdeci">void gpr_event_set(gpr_event *ev, void *value)</div><div class="ttdef"><b>Definition:</b> sync.c:70</div></div>
<div class="ttc" id="sync__posix_8h_html_a28731dc17a4158343f58f453a4d5e37f"><div class="ttname"><a href="sync__posix_8h.html#a28731dc17a4158343f58f453a4d5e37f">gpr_once</a></div><div class="ttdeci">pthread_once_t gpr_once</div><div class="ttdef"><b>Definition:</b> sync_posix.h:43</div></div>
<div class="ttc" id="structgpr__stats__counter_html"><div class="ttname"><a href="structgpr__stats__counter.html">gpr_stats_counter</a></div><div class="ttdef"><b>Definition:</b> sync_generic.h:54</div></div>
<div class="ttc" id="sync__posix_8h_html_a1ad613e07180c0459cda9f3f6d881885"><div class="ttname"><a href="sync__posix_8h.html#a1ad613e07180c0459cda9f3f6d881885">gpr_cv</a></div><div class="ttdeci">pthread_cond_t gpr_cv</div><div class="ttdef"><b>Definition:</b> sync_posix.h:42</div></div>
<div class="ttc" id="sync_8h_html_a16694f755266c254390b041a0f069094"><div class="ttname"><a href="sync_8h.html#a16694f755266c254390b041a0f069094">gpr_mu_init</a></div><div class="ttdeci">void gpr_mu_init(gpr_mu *mu)</div></div>
<div class="ttc" id="structgpr__cancellable_html"><div class="ttname"><a href="structgpr__cancellable.html">gpr_cancellable</a></div><div class="ttdef"><b>Definition:</b> cancellable_platform.h:50</div></div>
<div class="ttc" id="sync_8h_html_a76b570c831b14070c37e708dde91b795"><div class="ttname"><a href="sync_8h.html#a76b570c831b14070c37e708dde91b795">gpr_unref</a></div><div class="ttdeci">int gpr_unref(gpr_refcount *r)</div><div class="ttdef"><b>Definition:</b> sync.c:120</div></div>
<div class="ttc" id="structgpr__mu_html"><div class="ttname"><a href="structgpr__mu.html">gpr_mu</a></div><div class="ttdef"><b>Definition:</b> sync_win32.h:39</div></div>
<div class="ttc" id="sync_8h_html_aa82b7172b992bd33bd6fd4b4dc89e338"><div class="ttname"><a href="sync_8h.html#aa82b7172b992bd33bd6fd4b4dc89e338">gpr_cancellable_destroy</a></div><div class="ttdeci">void gpr_cancellable_destroy(gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> cancellable.c:49</div></div>
<div class="ttc" id="sync_8h_html_a91370fd0eb76bc1323c80815ad6e9cff"><div class="ttname"><a href="sync_8h.html#a91370fd0eb76bc1323c80815ad6e9cff">gpr_mu_unlock</a></div><div class="ttdeci">void gpr_mu_unlock(gpr_mu *mu)</div></div>
<div class="ttc" id="sync_8h_html_aba119d0b92b0bd50e6efa9e2abe07a5f"><div class="ttname"><a href="sync_8h.html#aba119d0b92b0bd50e6efa9e2abe07a5f">gpr_cv_signal</a></div><div class="ttdeci">void gpr_cv_signal(gpr_cv *cv)</div></div>
<div class="ttc" id="sync_8h_html_aec0b0e9b9f084550cdec300da1f31add"><div class="ttname"><a href="sync_8h.html#aec0b0e9b9f084550cdec300da1f31add">gpr_cancellable_init</a></div><div class="ttdeci">void gpr_cancellable_init(gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> cancellable.c:40</div></div>
<div class="ttc" id="sync_8h_html_a895fb73161d2dd1fa19be10d5395001c"><div class="ttname"><a href="sync_8h.html#a895fb73161d2dd1fa19be10d5395001c">gpr_cancellable_cancel</a></div><div class="ttdeci">void gpr_cancellable_cancel(gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> cancellable.c:81</div></div>
<div class="ttc" id="cancellable__platform_8h_html"><div class="ttname"><a href="cancellable__platform_8h.html">cancellable_platform.h</a></div></div>
<div class="ttc" id="sync_8h_html_ad24aac3d86113f0fcffc6c4595da9cb2"><div class="ttname"><a href="sync_8h.html#ad24aac3d86113f0fcffc6c4595da9cb2">gpr_cv_init</a></div><div class="ttdeci">void gpr_cv_init(gpr_cv *cv)</div></div>
<div class="ttc" id="sync_8h_html_a76b8e5de6e1baa4fd66c014417dc0a30"><div class="ttname"><a href="sync_8h.html#a76b8e5de6e1baa4fd66c014417dc0a30">gpr_stats_init</a></div><div class="ttdeci">void gpr_stats_init(gpr_stats_counter *c, gpr_intptr n)</div><div class="ttdef"><b>Definition:</b> sync.c:126</div></div>
<div class="ttc" id="sync_8h_html_ae048c7e762b723821e35a07fd0d85e22"><div class="ttname"><a href="sync_8h.html#ae048c7e762b723821e35a07fd0d85e22">gpr_event_cancellable_wait</a></div><div class="ttdeci">void * gpr_event_cancellable_wait(gpr_event *ev, gpr_timespec abs_deadline, gpr_cancellable *c)</div><div class="ttdef"><b>Definition:</b> sync.c:97</div></div>
<div class="ttc" id="sync_8h_html_a93f37cd27964fda51acd4cd8e6737922"><div class="ttname"><a href="sync_8h.html#a93f37cd27964fda51acd4cd8e6737922">gpr_event_init</a></div><div class="ttdeci">void gpr_event_init(gpr_event *ev)</div><div class="ttdef"><b>Definition:</b> sync.c:65</div></div>
<div class="ttc" id="sync_8h_html_a52ae2524c7dade8cecb9f01ff4792c9e"><div class="ttname"><a href="sync_8h.html#a52ae2524c7dade8cecb9f01ff4792c9e">gpr_mu_destroy</a></div><div class="ttdeci">void gpr_mu_destroy(gpr_mu *mu)</div></div>
<div class="ttc" id="structgpr__timespec_html"><div class="ttname"><a href="structgpr__timespec.html">gpr_timespec</a></div><div class="ttdef"><b>Definition:</b> time.h:60</div></div>
<div class="ttc" id="structgpr__event_html"><div class="ttname"><a href="structgpr__event.html">gpr_event</a></div><div class="ttdef"><b>Definition:</b> sync_generic.h:41</div></div>
<div class="ttc" id="sync_8h_html_ad5a4b4a5844668d188db89dda6ad205b"><div class="ttname"><a href="sync_8h.html#ad5a4b4a5844668d188db89dda6ad205b">gpr_cv_broadcast</a></div><div class="ttdeci">void gpr_cv_broadcast(gpr_cv *cv)</div></div>
<div class="ttc" id="sync_8h_html_a235584f36572b5410b042ee63cb0740b"><div class="ttname"><a href="sync_8h.html#a235584f36572b5410b042ee63cb0740b">gpr_ref_init</a></div><div class="ttdeci">void gpr_ref_init(gpr_refcount *r, int n)</div><div class="ttdef"><b>Definition:</b> sync.c:112</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Aug 5 2015 08:17:07 for GRPC Core by  <a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.6
</small></address>
</body>
</html>
|