• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * wakeup_fd abstracts the concept of a file descriptor for the purpose of
21  * waking up a thread in select()/poll()/epoll_wait()/etc.
22 
23  * The poll() family of system calls provide a way for a thread to block until
24  * there is activity on one (or more) of a set of file descriptors. An
25  * application may wish to wake up this thread to do non file related work. The
26  * typical way to do this is to add a pipe to the set of file descriptors, then
27  * write to the pipe to wake up the thread in poll().
28  *
29  * Linux has a lighter weight eventfd specifically designed for this purpose.
30  * wakeup_fd abstracts the difference between the two.
31  *
32  * Setup:
33  * 1. Before calling anything, call global_init() at least once.
34  * 1. Call grpc_wakeup_fd_init() to set up a wakeup_fd.
35  * 2. Add the result of GRPC_WAKEUP_FD_FD to the set of monitored file
36  *    descriptors for the poll() style API you are using. Monitor the file
37  *    descriptor for readability.
38  * 3. To tear down, call grpc_wakeup_fd_destroy(). This closes the underlying
39  *    file descriptor.
40  *
41  * Usage:
42  * 1. To wake up a polling thread, call grpc_wakeup_fd_wakeup() on a wakeup_fd
43  *    it is monitoring.
44  * 2. If the polling thread was awakened by a wakeup_fd event, call
45  *    grpc_wakeup_fd_consume_wakeup() on it.
46  */
47 #ifndef GRPC_CORE_LIB_IOMGR_WAKEUP_FD_POSIX_H
48 #define GRPC_CORE_LIB_IOMGR_WAKEUP_FD_POSIX_H
49 
50 #include <grpc/support/port_platform.h>
51 
52 #include "src/core/lib/iomgr/error.h"
53 
54 void grpc_wakeup_fd_global_init(void);
55 void grpc_wakeup_fd_global_destroy(void);
56 
57 /* Force using the fallback implementation. This is intended for testing
58  * purposes only.*/
59 void grpc_wakeup_fd_global_init_force_fallback(void);
60 
61 int grpc_has_wakeup_fd(void);
62 int grpc_cv_wakeup_fds_enabled(void);
63 void grpc_enable_cv_wakeup_fds(int enable);
64 
65 typedef struct grpc_wakeup_fd grpc_wakeup_fd;
66 
67 typedef struct grpc_wakeup_fd_vtable {
68   grpc_error* (*init)(grpc_wakeup_fd* fd_info);
69   grpc_error* (*consume)(grpc_wakeup_fd* fd_info);
70   grpc_error* (*wakeup)(grpc_wakeup_fd* fd_info);
71   void (*destroy)(grpc_wakeup_fd* fd_info);
72   /* Must be called before calling any other functions */
73   int (*check_availability)(void);
74 } grpc_wakeup_fd_vtable;
75 
76 struct grpc_wakeup_fd {
77   int read_fd;
78   int write_fd;
79 };
80 
81 extern int grpc_allow_specialized_wakeup_fd;
82 extern int grpc_allow_pipe_wakeup_fd;
83 
84 #define GRPC_WAKEUP_FD_GET_READ_FD(fd_info) ((fd_info)->read_fd)
85 
86 grpc_error* grpc_wakeup_fd_init(grpc_wakeup_fd* fd_info) GRPC_MUST_USE_RESULT;
87 grpc_error* grpc_wakeup_fd_consume_wakeup(grpc_wakeup_fd* fd_info)
88     GRPC_MUST_USE_RESULT;
89 grpc_error* grpc_wakeup_fd_wakeup(grpc_wakeup_fd* fd_info) GRPC_MUST_USE_RESULT;
90 void grpc_wakeup_fd_destroy(grpc_wakeup_fd* fd_info);
91 
92 /* Defined in some specialized implementation's .c file, or by
93  * wakeup_fd_nospecial.c if no such implementation exists. */
94 extern const grpc_wakeup_fd_vtable grpc_specialized_wakeup_fd_vtable;
95 
96 #endif /* GRPC_CORE_LIB_IOMGR_WAKEUP_FD_POSIX_H */
97