From c8fd2d1c01f81c4a4f8a6b8a239e0f809fd1001d Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Fri, 30 Jan 2015 20:23:27 +0100 Subject: [PATCH] Properly selecting chunks of code for the wakeup fd codepath. --- include/grpc/support/port_platform.h | 6 ++- src/core/iomgr/wakeup_fd.h | 59 ++++++++++++++++++++++++++++ src/core/iomgr/wakeup_fd_nospecial.c | 5 ++- src/core/iomgr/wakeup_fd_pipe.c | 8 +++- src/core/iomgr/wakeup_fd_pipe.h | 2 +- src/core/iomgr/wakeup_fd_posix.c | 6 +++ src/core/iomgr/wakeup_fd_posix.h | 18 +-------- 7 files changed, 81 insertions(+), 23 deletions(-) create mode 100644 src/core/iomgr/wakeup_fd.h diff --git a/include/grpc/support/port_platform.h b/include/grpc/support/port_platform.h index 58fce64ff18..2bf53483157 100644 --- a/include/grpc/support/port_platform.h +++ b/include/grpc/support/port_platform.h @@ -56,6 +56,8 @@ #define GPR_CPU_LINUX 1 #define GPR_GCC_SYNC 1 #define GPR_POSIX_MULTIPOLL_WITH_POLL 1 +#define GPR_POSIX_WAKEUP_FD 1 +#define GPR_LINUX_EVENTFD 1 #define GPR_POSIX_SOCKET 1 #define GPR_POSIX_SOCKETADDR 1 #define GPR_POSIX_SOCKETUTILS 1 @@ -68,7 +70,7 @@ #define GPR_GCC_ATOMIC 1 #define GPR_LINUX 1 #define GPR_POSIX_MULTIPOLL_WITH_POLL 1 -#define GPR_POSIX_HAS_SPECIAL_WAKEUP_FD 1 +#define GPR_POSIX_WAKEUP_FD 1 #define GPR_LINUX_EVENTFD 1 #define GPR_POSIX_SOCKET 1 #define GPR_POSIX_SOCKETADDR 1 @@ -86,6 +88,8 @@ #define GPR_GCC_ATOMIC 1 #define GPR_POSIX_LOG 1 #define GPR_POSIX_MULTIPOLL_WITH_POLL 1 +#define GPR_POSIX_WAKEUP_FD 1 +#define GPR_POSIX_NO_SPECIAL_WAKEUP_FD 1 #define GPR_POSIX_SOCKET 1 #define GPR_POSIX_SOCKETADDR 1 #define GPR_POSIX_SOCKETUTILS 1 diff --git a/src/core/iomgr/wakeup_fd.h b/src/core/iomgr/wakeup_fd.h new file mode 100644 index 00000000000..2c6f79608db --- /dev/null +++ b/src/core/iomgr/wakeup_fd.h @@ -0,0 +1,59 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef __GRPC_INTERNAL_IOMGR_WAKEUP_FD_H_ +#define __GRPC_INTERNAL_IOMGR_WAKEUP_FD_H_ + +typedef struct grpc_wakeup_fd_info grpc_wakeup_fd_info; + +typedef struct grpc_wakeup_fd_vtable { + void (*create)(grpc_wakeup_fd_info *fd_info); + void (*consume)(grpc_wakeup_fd_info *fd_info); + void (*wakeup)(grpc_wakeup_fd_info *fd_info); + void (*destroy)(grpc_wakeup_fd_info *fd_info); + /* Must be called before calling any other functions */ + int (*check_availability)(void); +} grpc_wakeup_fd_vtable; + +/* Private structures; don't access their fields directly outside of wakeup fd + * code. */ +struct grpc_wakeup_fd_info { + int read_fd; + int write_fd; +}; + +/* Defined in some specialized implementation's .c file, or by + * wakeup_fd_nospecial.c if no such implementation exists. */ +extern const grpc_wakeup_fd_vtable specialized_wakeup_fd_vtable; + +#endif /* __GRPC_INTERNAL_IOMGR_WAKEUP_FD_POSIX_H_ */ diff --git a/src/core/iomgr/wakeup_fd_nospecial.c b/src/core/iomgr/wakeup_fd_nospecial.c index 21e8074d50e..c98c117188e 100644 --- a/src/core/iomgr/wakeup_fd_nospecial.c +++ b/src/core/iomgr/wakeup_fd_nospecial.c @@ -38,9 +38,10 @@ #include -#ifndef GPR_POSIX_HAS_SPECIAL_WAKEUP_FD +#ifdef GPR_POSIX_NO_SPECIAL_WAKEUP_FD #include "src/core/iomgr/wakeup_fd.h" +#include static int check_availability_invalid(void) { return 0; @@ -50,4 +51,4 @@ const grpc_wakeup_fd_vtable specialized_wakeup_fd_vtable = { NULL, NULL, NULL, NULL, check_availability_invalid }; -#endif /* GPR_POSIX_HAS_SPECIAL_WAKEUP */ +#endif /* GPR_POSIX_NO_SPECIAL_WAKEUP_FD */ diff --git a/src/core/iomgr/wakeup_fd_pipe.c b/src/core/iomgr/wakeup_fd_pipe.c index f36e6eeb9f5..63be51133e7 100644 --- a/src/core/iomgr/wakeup_fd_pipe.c +++ b/src/core/iomgr/wakeup_fd_pipe.c @@ -31,8 +31,11 @@ * */ -/* TODO(klempner): Allow this code to be disabled. */ -#include "src/core/iomgr/wakeup_fd_posix.h" +#include + +#ifdef GPR_POSIX_WAKEUP_FD + +#include "src/core/iomgr/wakeup_fd.h" #include #include @@ -91,3 +94,4 @@ const grpc_wakeup_fd_vtable pipe_wakeup_fd_vtable = { pipe_create, pipe_consume, pipe_wakeup, pipe_destroy, pipe_check_availability }; +#endif /* GPR_POSIX_WAKUP_FD */ diff --git a/src/core/iomgr/wakeup_fd_pipe.h b/src/core/iomgr/wakeup_fd_pipe.h index fc2898f570e..8e2ed85885b 100644 --- a/src/core/iomgr/wakeup_fd_pipe.h +++ b/src/core/iomgr/wakeup_fd_pipe.h @@ -34,7 +34,7 @@ #ifndef __GRPC_INTERNAL_IOMGR_WAKEUP_FD_PIPE_H_ #define __GRPC_INTERNAL_IOMGR_WAKEUP_FD_PIPE_H_ -#include "src/core/iomgr/wakeup_fd_posix.h" +#include "src/core/iomgr/wakeup_fd.h" extern grpc_wakeup_fd_vtable pipe_wakeup_fd_vtable; diff --git a/src/core/iomgr/wakeup_fd_posix.c b/src/core/iomgr/wakeup_fd_posix.c index 9107cf37b1e..f495fb1fd70 100644 --- a/src/core/iomgr/wakeup_fd_posix.c +++ b/src/core/iomgr/wakeup_fd_posix.c @@ -31,6 +31,10 @@ * */ +#include + +#ifdef GPR_POSIX_WAKEUP_FD + #include "src/core/iomgr/wakeup_fd_posix.h" #include "src/core/iomgr/wakeup_fd_pipe.h" #include @@ -68,3 +72,5 @@ void grpc_wakeup_fd_wakeup(grpc_wakeup_fd_info *fd_info) { void grpc_wakeup_fd_destroy(grpc_wakeup_fd_info *fd_info) { wakeup_fd_vtable->destroy(fd_info); } + +#endif /* GPR_POSIX_WAKEUP_FD */ diff --git a/src/core/iomgr/wakeup_fd_posix.h b/src/core/iomgr/wakeup_fd_posix.h index c2769afb2a4..3aed98ff595 100644 --- a/src/core/iomgr/wakeup_fd_posix.h +++ b/src/core/iomgr/wakeup_fd_posix.h @@ -62,7 +62,7 @@ #ifndef __GRPC_INTERNAL_IOMGR_WAKEUP_FD_POSIX_H_ #define __GRPC_INTERNAL_IOMGR_WAKEUP_FD_POSIX_H_ -typedef struct grpc_wakeup_fd_info grpc_wakeup_fd_info; +#include "src/core/iomgr/wakeup_fd.h" void grpc_wakeup_fd_global_init(void); void grpc_wakeup_fd_global_destroy(void); @@ -79,22 +79,6 @@ void grpc_wakeup_fd_destroy(grpc_wakeup_fd_info *fd_info); * purposes only.*/ void grpc_wakeup_fd_global_init_force_fallback(void); -/* Private structures; don't access their fields directly outside of wakeup fd - * code. */ -struct grpc_wakeup_fd_info { - int read_fd; - int write_fd; -}; - -typedef struct grpc_wakeup_fd_vtable { - void (*create)(grpc_wakeup_fd_info *fd_info); - void (*consume)(grpc_wakeup_fd_info *fd_info); - void (*wakeup)(grpc_wakeup_fd_info *fd_info); - void (*destroy)(grpc_wakeup_fd_info *fd_info); - /* Must be called before calling any other functions */ - int (*check_availability)(void); -} grpc_wakeup_fd_vtable; - /* Defined in some specialized implementation's .c file, or by * wakeup_fd_nospecial.c if no such implementation exists. */ extern const grpc_wakeup_fd_vtable specialized_wakeup_fd_vtable;