From patchwork Sun Apr 20 08:23:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masashi Honma X-Patchwork-Id: 340515 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from maxx.maxx.shmoo.com (maxx.shmoo.com [205.134.188.171]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3E9501400D4 for ; Sun, 20 Apr 2014 18:23:59 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id E9FCB17C15B; Sun, 20 Apr 2014 04:23:53 -0400 (EDT) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id s3NRR7L8gy8E; Sun, 20 Apr 2014 04:23:53 -0400 (EDT) Received: from maxx.shmoo.com (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 171AD17C09D; Sun, 20 Apr 2014 04:23:48 -0400 (EDT) X-Original-To: mailman-post+hostap@maxx.shmoo.com Delivered-To: mailman-post+hostap@maxx.shmoo.com Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 7CC4117C09D for ; Sun, 20 Apr 2014 04:23:46 -0400 (EDT) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hASjc5RMIwG3 for ; Sun, 20 Apr 2014 04:23:40 -0400 (EDT) Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (not verified)) by maxx.maxx.shmoo.com (Postfix) with ESMTPS id 43CD417C006 for ; Sun, 20 Apr 2014 04:23:40 -0400 (EDT) Received: by mail-pa0-f48.google.com with SMTP id hz1so2767755pad.21 for ; Sun, 20 Apr 2014 01:23:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jda0nNBBUq/JHCrlZn0MT0K4iG9nBuutNuICtsqLDZs=; b=PRBJ+1S5bGIrH8H/g5KCikjMDWf6yKjGRV0zq40+T/+auLOsQdJH7EM0zPu4ir0o79 kvrbdQc52bEqGi8XDIpyvtpVmmO8Rc/mJNZJiY+9MjKjAzPJLHVmeEIMluN6MxLsZ+JJ 7Wg/oNhp0o4Xn+aGwaLfnF4wxYEZkdcyKt3OWWBst3c8J3mJn2qoNJzTFLTZ0VTePYhO AgU9AH1mnsnvKzC8biRlFXfobk4vIdVp0UFZJmkeBC6z1JIXoZt2L9FdcF+RTFdKTh5o AXYkh8LSnRspaF9zhuxyxAIFLae5Bn2e/Bk9VJtVFBnaSKa1n62nOpT3nrzESld2IGnL yIIQ== X-Received: by 10.66.166.233 with SMTP id zj9mr3812245pab.75.1397982218103; Sun, 20 Apr 2014 01:23:38 -0700 (PDT) Received: from localhost.localdomain (pc661ac.kngwnt01.ap.so-net.ne.jp. [123.198.97.172]) by mx.google.com with ESMTPSA id qv9sm63540142pbc.71.2014.04.20.01.23.36 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 20 Apr 2014 01:23:37 -0700 (PDT) From: Masashi Honma To: hostap@lists.shmoo.com Subject: [PATCH] Separate event loop implementation by specific macros Date: Sun, 20 Apr 2014 17:23:03 +0900 Message-Id: <1397982183-4070-1-git-send-email-masashi.honma@gmail.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <20140413211608.GA5067@w1.fi> References: <20140413211608.GA5067@w1.fi> X-BeenThere: hostap@lists.shmoo.com X-Mailman-Version: 2.1.11 Precedence: list List-Id: HostAP Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: hostap-bounces@lists.shmoo.com Errors-To: hostap-bounces@lists.shmoo.com This patch separates event loop implementation by macros to introduce following epoll() option. > Close, but I wanted to switch it the other way around, i.e., the > CONFIG_ELOOP= should work for all other cases than > eloop.c and not just that eloop_win.c (i.e., for any version that is not > included in this repository as well). In addition, CONFIG_ELOOP_POLL=y > should remain to work like it used to work before. OK, I considered backward compatibility. If CONFIG_ELOOP=eloop, CONFIG_ELOOP_POLL should be worked. Because eloop is traditional value and backward compatibility is required. If CONFIG_ELOOP=select/poll/epoll, CONFIG_ELOOP_POLL should be ignored. Because select/poll/epoll are new value and backward compatibility is not required. This is a table of the policy. +--------------+-------------+-------------+ | | CONFIG_ELOOP_POLL | +--------------+-------------+-------------+ | CONFIG_ELOOP | (undefined) | Y | +==============+=============+=============+ | (undefined) | eloop.c | eloop.c | | | select | poll | +--------------+-------------+-------------+ | eloop | eloop.c | eloop.c | | | select | poll | +--------------+-------------+-------------+ | eloop_win | eloop_win.c | eloop_win.c | | | | | +--------------+-------------+-------------+ | select | eloop.c | eloop.c | | | select | select | +--------------+-------------+-------------+ | poll | eloop.c | eloop.c | | | poll | poll | +--------------+-------------+-------------+ | epoll | eloop.c | eloop.c | | | epoll | epoll | +--------------+-------------+-------------+ Signed-off-by: Masashi Honma --- hostapd/Makefile | 33 ++++++++++++++++++++++++++++----- src/utils/eloop.c | 39 +++++++++++++++++++++++---------------- wpa_supplicant/Android.mk | 27 +++++++++++++++++++++------ wpa_supplicant/Makefile | 40 ++++++++++++++++++++++++++++++---------- wpa_supplicant/android.config | 10 ++++------ wpa_supplicant/defconfig | 10 ++++------ 6 files changed, 110 insertions(+), 49 deletions(-) diff --git a/hostapd/Makefile b/hostapd/Makefile index ac6373e..dceccc3 100644 --- a/hostapd/Makefile +++ b/hostapd/Makefile @@ -89,20 +89,43 @@ LIBS_h += -lbfd -ldl -liberty -lz endif endif -ifndef CONFIG_ELOOP -CONFIG_ELOOP=eloop +ifdef CONFIG_ELOOP +ifeq ($(CONFIG_ELOOP), eloop) +ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select +endif +endif +else +ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select +endif endif -OBJS += ../src/utils/$(CONFIG_ELOOP).o -OBJS_c += ../src/utils/$(CONFIG_ELOOP).o -ifeq ($(CONFIG_ELOOP), eloop) +ifeq ($(CONFIG_ELOOP), select) +CFLAGS += -DCONFIG_ELOOP_SELECT +ELOOP_SHARED=y +endif +ifeq ($(CONFIG_ELOOP), poll) +CFLAGS += -DCONFIG_ELOOP_POLL +ELOOP_SHARED=y +endif + +ifdef ELOOP_SHARED # Using glibc < 2.17 requires -lrt for clock_gettime() LIBS += -lrt LIBS_c += -lrt LIBS_h += -lrt LIBS_n += -lrt +ELOOP_FILE=eloop endif +OBJS += ../src/utils/$(ELOOP_FILE).o +OBJS_c += ../src/utils/$(ELOOP_FILE).o + OBJS += ../src/utils/common.o OBJS += ../src/utils/wpa_debug.o OBJS_c += ../src/utils/wpa_debug.o diff --git a/src/utils/eloop.c b/src/utils/eloop.c index 2667c8c..fa7cb81 100644 --- a/src/utils/eloop.c +++ b/src/utils/eloop.c @@ -362,7 +362,9 @@ static void eloop_sock_table_dispatch(struct eloop_sock_table *readers, max_pollfd_map, POLLERR | POLLHUP); } -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ + +#ifdef CONFIG_ELOOP_SELECT static void eloop_sock_table_set_fds(struct eloop_sock_table *table, fd_set *fds) @@ -401,7 +403,7 @@ static void eloop_sock_table_dispatch(struct eloop_sock_table *table, } } -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ static void eloop_sock_table_destroy(struct eloop_sock_table *table) @@ -776,20 +778,21 @@ void eloop_run(void) #ifdef CONFIG_ELOOP_POLL int num_poll_fds; int timeout_ms = 0; -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ +#ifdef CONFIG_ELOOP_SELECT fd_set *rfds, *wfds, *efds; struct timeval _tv; -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ int res; struct os_reltime tv, now; -#ifndef CONFIG_ELOOP_POLL +#ifdef CONFIG_ELOOP_SELECT rfds = os_malloc(sizeof(*rfds)); wfds = os_malloc(sizeof(*wfds)); efds = os_malloc(sizeof(*efds)); if (rfds == NULL || wfds == NULL || efds == NULL) goto out; -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ while (!eloop.terminate && (!dl_list_empty(&eloop.timeout) || eloop.readers.count > 0 || @@ -805,10 +808,11 @@ void eloop_run(void) tv.sec = tv.usec = 0; #ifdef CONFIG_ELOOP_POLL timeout_ms = tv.sec * 1000 + tv.usec / 1000; -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ +#ifdef CONFIG_ELOOP_SELECT _tv.tv_sec = tv.sec; _tv.tv_usec = tv.usec; -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ } #ifdef CONFIG_ELOOP_POLL @@ -824,7 +828,8 @@ void eloop_run(void) strerror(errno)); goto out; } -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ +#ifdef CONFIG_ELOOP_SELECT eloop_sock_table_set_fds(&eloop.readers, rfds); eloop_sock_table_set_fds(&eloop.writers, wfds); eloop_sock_table_set_fds(&eloop.exceptions, efds); @@ -835,7 +840,7 @@ void eloop_run(void) strerror(errno)); goto out; } -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ eloop_process_pending_signals(); /* check if some registered timeouts have occurred */ @@ -861,20 +866,21 @@ void eloop_run(void) eloop_sock_table_dispatch(&eloop.readers, &eloop.writers, &eloop.exceptions, eloop.pollfds_map, eloop.max_pollfd_map); -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ +#ifdef CONFIG_ELOOP_SELECT eloop_sock_table_dispatch(&eloop.readers, rfds); eloop_sock_table_dispatch(&eloop.writers, wfds); eloop_sock_table_dispatch(&eloop.exceptions, efds); -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ } eloop.terminate = 0; out: -#ifndef CONFIG_ELOOP_POLL +#ifdef CONFIG_ELOOP_SELECT os_free(rfds); os_free(wfds); os_free(efds); -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ return; } @@ -940,7 +946,8 @@ void eloop_wait_for_read_sock(int sock) pfd.events = POLLIN; poll(&pfd, 1, -1); -#else /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_POLL */ +#ifdef CONFIG_ELOOP_SELECT fd_set rfds; if (sock < 0) @@ -949,5 +956,5 @@ void eloop_wait_for_read_sock(int sock) FD_ZERO(&rfds); FD_SET(sock, &rfds); select(sock + 1, &rfds, NULL, NULL, NULL); -#endif /* CONFIG_ELOOP_POLL */ +#endif /* CONFIG_ELOOP_SELECT */ } diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk index a60a26a..268e48d 100644 --- a/wpa_supplicant/Android.mk +++ b/wpa_supplicant/Android.mk @@ -130,13 +130,28 @@ LIBS_c += -lbfd endif endif -ifndef CONFIG_ELOOP -CONFIG_ELOOP=eloop +ifdef CONFIG_ELOOP +ifeq ($(CONFIG_ELOOP), eloop) +ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select endif -OBJS += src/utils/$(CONFIG_ELOOP).c -OBJS_c += src/utils/$(CONFIG_ELOOP).c - +endif +else ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select +endif +endif +OBJS += src/utils/eloop.c +OBJS_c += src/utils/eloop.c + +ifeq ($(CONFIG_ELOOP), select) +L_CFLAGS += -DCONFIG_ELOOP_SELECT +endif +ifeq ($(CONFIG_ELOOP), poll) L_CFLAGS += -DCONFIG_ELOOP_POLL endif @@ -1492,7 +1507,7 @@ ifdef CONFIG_PRIVSEP OBJS_priv += $(OBJS_d) src/drivers/drivers.c OBJS_priv += $(OBJS_l2) OBJS_priv += src/utils/os_$(CONFIG_OS).c -OBJS_priv += src/utils/$(CONFIG_ELOOP).c +OBJS_priv += src/utils/eloop.c OBJS_priv += src/utils/common.c OBJS_priv += src/utils/wpa_debug.c OBJS_priv += src/utils/wpabuf.c diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index 19dae70..0a68f9b 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -121,23 +121,43 @@ LIBS_c += -lbfd -ldl -liberty -lz endif endif -ifndef CONFIG_ELOOP -CONFIG_ELOOP=eloop +ifdef CONFIG_ELOOP +ifeq ($(CONFIG_ELOOP), eloop) +ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select +endif +endif +else +ifdef CONFIG_ELOOP_POLL +CONFIG_ELOOP=poll +else +CONFIG_ELOOP=select +endif endif -OBJS += ../src/utils/$(CONFIG_ELOOP).o -OBJS_c += ../src/utils/$(CONFIG_ELOOP).o -ifeq ($(CONFIG_ELOOP), eloop) +ifeq ($(CONFIG_ELOOP), select) +CFLAGS += -DCONFIG_ELOOP_SELECT +ELOOP_SHARED=y +endif +ifeq ($(CONFIG_ELOOP), poll) +CFLAGS += -DCONFIG_ELOOP_POLL +ELOOP_SHARED=y +endif + +ifdef ELOOP_SHARED # Using glibc < 2.17 requires -lrt for clock_gettime() LIBS += -lrt LIBS_c += -lrt LIBS_p += -lrt +ELOOP_FILE=eloop +else +ELOOP_FILE=$(CONFIG_ELOOP) endif -ifdef CONFIG_ELOOP_POLL -CFLAGS += -DCONFIG_ELOOP_POLL -endif - +OBJS += ../src/utils/$(ELOOP_FILE).o +OBJS_c += ../src/utils/$(ELOOP_FILE).o ifdef CONFIG_EAPOL_TEST CFLAGS += -Werror -DEAPOL_TEST @@ -1510,7 +1530,7 @@ ifdef CONFIG_PRIVSEP OBJS_priv += $(OBJS_d) ../src/drivers/drivers.o OBJS_priv += $(OBJS_l2) OBJS_priv += ../src/utils/os_$(CONFIG_OS).o -OBJS_priv += ../src/utils/$(CONFIG_ELOOP).o +OBJS_priv += ../src/utils/$(ELOOP_FILE).o OBJS_priv += ../src/utils/common.o OBJS_priv += ../src/utils/wpa_debug.o OBJS_priv += ../src/utils/wpabuf.o diff --git a/wpa_supplicant/android.config b/wpa_supplicant/android.config index ffa2f01..7f2fe9e 100644 --- a/wpa_supplicant/android.config +++ b/wpa_supplicant/android.config @@ -237,19 +237,17 @@ CONFIG_BACKEND=file # main_none = Very basic example (development use only) #CONFIG_MAIN=main -# Select wrapper for operatins system and C library specific functions +# Select wrapper for operating system and C library specific functions # unix = UNIX/POSIX like systems (default) # win32 = Windows systems # none = Empty template CONFIG_OS=unix # Select event loop implementation -# eloop = select() loop (default) +# select = select() loop (default) +# poll = poll() loop # eloop_win = Windows events and WaitForMultipleObject() loop -CONFIG_ELOOP=eloop - -# Should we use poll instead of select? Select is used by default. -#CONFIG_ELOOP_POLL=y +#CONFIG_ELOOP=select # Select layer 2 packet implementation # linux = Linux packet socket (default) diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig index d194eb8..2a1cfa3 100644 --- a/wpa_supplicant/defconfig +++ b/wpa_supplicant/defconfig @@ -253,19 +253,17 @@ CONFIG_BACKEND=file # main_none = Very basic example (development use only) #CONFIG_MAIN=main -# Select wrapper for operatins system and C library specific functions +# Select wrapper for operating system and C library specific functions # unix = UNIX/POSIX like systems (default) # win32 = Windows systems # none = Empty template #CONFIG_OS=unix # Select event loop implementation -# eloop = select() loop (default) +# select = select() loop (default) +# poll = poll() loop # eloop_win = Windows events and WaitForMultipleObject() loop -#CONFIG_ELOOP=eloop - -# Should we use poll instead of select? Select is used by default. -#CONFIG_ELOOP_POLL=y +#CONFIG_ELOOP=select # Select layer 2 packet implementation # linux = Linux packet socket (default)