GRPC Core 0.10.0.0

- Main Page
- Data Structures
- Files

- File List
- Globals

All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pollset_kick_posix.h
Go to the documentation of this file.
1 /*
2 *
3 * Copyright 2015, Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34 #ifndef GRPC_INTERNAL_CORE_IOMGR_POLLSET_KICK_POSIX_H
35 #define GRPC_INTERNAL_CORE_IOMGR_POLLSET_KICK_POSIX_H
36
37 #include "src/core/iomgr/wakeup_fd_posix.h"
38 #include <grpc/support/sync.h>
39
40 /* pollset kicking allows breaking a thread out of polling work for
41 a given pollset.
42 writing a byte to a pipe is used as a posix-ly portable base
43 mechanism, and eventfds are utilized on Linux for better performance. */
44
45 typedef struct grpc_kick_fd_info {
46 grpc_wakeup_fd_info wakeup_fd;
47 /* used for polling list and free list */
48 struct grpc_kick_fd_info *next;
49 /* only used when polling */
50 struct grpc_kick_fd_info *prev;
51 } grpc_kick_fd_info;
52
53 typedef struct grpc_pollset_kick_state {
54 gpr_mu mu;
55 int kicked;
56 struct grpc_kick_fd_info fd_list;
57 } grpc_pollset_kick_state;
58
59 #define GRPC_POLLSET_KICK_GET_FD(kick_fd_info) \
60 GRPC_WAKEUP_FD_GET_READ_FD(&(kick_fd_info)->wakeup_fd)
61
62 /* This is an abstraction around the typical pipe mechanism for waking up a
63 thread sitting in a poll() style call. */
64
65 void grpc_pollset_kick_global_init(void);
66 void grpc_pollset_kick_global_destroy(void);
67
68 void grpc_pollset_kick_init(grpc_pollset_kick_state *kick_state);
69 void grpc_pollset_kick_destroy(grpc_pollset_kick_state *kick_state);
70
71 /* Guarantees a pure posix implementation rather than a specialized one, if
72 * applicable. Intended for testing. */
73 void grpc_pollset_kick_global_init_fallback_fd(void);
74
75 /* Must be called before entering poll(). If return value is NULL, this consumed
76 an existing kick. Otherwise the return value is an FD to add to the poll set.
77 */
78 grpc_kick_fd_info *grpc_pollset_kick_pre_poll(
79 grpc_pollset_kick_state *kick_state);
80
81 /* Consume an existing kick. Must be called after poll returns that the fd was
82 readable, and before calling kick_post_poll. */
83 void grpc_pollset_kick_consume(grpc_pollset_kick_state *kick_state,
84 grpc_kick_fd_info *fd_info);
85
86 /* Must be called after pre_poll, and after consume if applicable */
87 void grpc_pollset_kick_post_poll(grpc_pollset_kick_state *kick_state,
88 grpc_kick_fd_info *fd_info);
89
90 /* Actually kick */
91 void grpc_pollset_kick_kick(grpc_pollset_kick_state *kick_state);
92
93 #endif /* GRPC_INTERNAL_CORE_IOMGR_POLLSET_KICK_POSIX_H */
grpc_pollset_kick_state::mu
gpr_mu mu
Definition: pollset_kick_posix.h:54
grpc_wakeup_fd_info
Definition: wakeup_fd_posix.h:83
grpc_pollset_kick_post_poll
void grpc_pollset_kick_post_poll(grpc_pollset_kick_state *kick_state, grpc_kick_fd_info *fd_info)
grpc_pollset_kick_state
struct grpc_pollset_kick_state grpc_pollset_kick_state
wakeup_fd_posix.h
grpc_kick_fd_info::wakeup_fd
grpc_wakeup_fd_info wakeup_fd
Definition: pollset_kick_posix.h:46
grpc_pollset_kick_state::fd_list
struct grpc_kick_fd_info fd_list
Definition: pollset_kick_posix.h:56
grpc_pollset_kick_global_init
void grpc_pollset_kick_global_init(void)
grpc_pollset_kick_init
void grpc_pollset_kick_init(grpc_pollset_kick_state *kick_state)
grpc_pollset_kick_global_destroy
void grpc_pollset_kick_global_destroy(void)
gpr_mu
Definition: sync_win32.h:39
grpc_pollset_kick_kick
void grpc_pollset_kick_kick(grpc_pollset_kick_state *kick_state)
grpc_pollset_kick_consume
void grpc_pollset_kick_consume(grpc_pollset_kick_state *kick_state, grpc_kick_fd_info *fd_info)
grpc_pollset_kick_pre_poll
grpc_kick_fd_info * grpc_pollset_kick_pre_poll(grpc_pollset_kick_state *kick_state)
grpc_pollset_kick_state::kicked
int kicked
Definition: pollset_kick_posix.h:55
grpc_kick_fd_info
struct grpc_kick_fd_info grpc_kick_fd_info
sync.h
grpc_pollset_kick_state
Definition: pollset_kick_posix.h:53
grpc_kick_fd_info::next
struct grpc_kick_fd_info * next
Definition: pollset_kick_posix.h:48
grpc_pollset_kick_destroy
void grpc_pollset_kick_destroy(grpc_pollset_kick_state *kick_state)
grpc_kick_fd_info::prev
struct grpc_kick_fd_info * prev
Definition: pollset_kick_posix.h:50
grpc_pollset_kick_global_init_fallback_fd
void grpc_pollset_kick_global_init_fallback_fd(void)
grpc_kick_fd_info
Definition: pollset_kick_posix.h:45