From 71615260f4e0d7a58bf64a837c081af2d155ef9d Mon Sep 17 00:00:00 2001 From: David Goulet Date: Mon, 12 Sep 2011 10:53:26 -0400 Subject: [PATCH 1/1] Add epoll check to autoconf and Makefile Adds two m4 macros to check for epoll(7) API and change the gitignore to fit thoses changes. Also change the Makefile to add COMPAT_EPOLL value in order to select the right source file at compile time. Signed-off-by: David Goulet --- .gitignore | 6 +- config/config_feature.m4 | 157 +++++++++++++++++++++++++++++++++++++++ config/epoll.m4 | 105 ++++++++++++++++++++++++++ configure.ac | 13 ++++ ltt-sessiond/Makefile.am | 8 ++ 5 files changed, 288 insertions(+), 1 deletion(-) create mode 100644 config/config_feature.m4 create mode 100644 config/epoll.m4 diff --git a/.gitignore b/.gitignore index aee127091..660c87739 100644 --- a/.gitignore +++ b/.gitignore @@ -19,13 +19,17 @@ aclocal.m4 autom4te.cache/ config.h config.h.in -config/ config.log config.status stamp-h1 libtool tags +# m4 macros not automatically generated +config/ +!config/epoll.m4 +!config/config_feature.m4 + ltt-sessiond/ltt-sessiond lttng/lttng ltt-kconsumerd/ltt-kconsumerd diff --git a/config/config_feature.m4 b/config/config_feature.m4 new file mode 100644 index 000000000..db229f241 --- /dev/null +++ b/config/config_feature.m4 @@ -0,0 +1,157 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_config_feature.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CONFIG_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, DEFINE, DEFINE-DESCRIPTION, [ACTION-IF-ENABLED [, ACTION-IF-NOT-ENABLED]]) +# +# DESCRIPTION +# +# AX_CONFIG_FEATURE is a simple wrapper for AC_ARG_ENABLE, it enables the +# feature FEATURE-NAME and AC_DEFINEs the passed DEFINE, depending on the +# user choice. DESCRIPTION will be used for AC_DEFINEs. ACTION-IF-ENABLED +# and ACTION-IF-NOT-ENABLED are the actions that will be run. A feature is +# enabled by default, in order to change this behaviour use the +# AX_CONFIG_FEATURE_DEFAULT_ENABLED and AX_CONFIG_FEATURE_DEFAULT_DISABLED +# macros. +# +# A simple example: +# +# AX_CONFIG_FEATURE_DEFAULT_ENABLED +# AX_CONFIG_FEATURE(feature_xxxxx, [turns on/off XXXXX support], +# HAVE_XXXXX, [Define if you want XXXXX support]) +# +# ... +# +# AX_CONFIG_FEATURE_DEFAULT_DISABLED +# AX_CONFIG_FEATURE(feature_yyyyy, [turns on/off YYYYY support], +# HAVE_YYYYY, [Define if you want YYYYY support], +# [enable_yyyyy="yes"], [enable_yyyyy="no"]) +# AM_CONDITIONAL(YYYYY, [test "$enable_yyyyy" = "yes"]) +# +# AX_CONFIG_FEATURE_DEFAULT_ENABLED +# AX_CONFIG_FEATURE(...) +# +# ... +# +# If you have lot of features and you want a verbose dumping of each user +# selection use AX_CONFIG_FEATURE_VERBOSE. Use AX_CONFIG_FEATURE_SILENT in +# order to remove a previously AX_CONFIG_FEATURE_VERBOSE. By default +# features are silent. +# +# Use AX_CONFIG_FEATURE_ENABLE or AX_CONFIG_FEATURE_DISABLE in order to +# enable or disable a specific feature. +# +# Another simple example: +# +# AS_IF([some_test_here],[AX_CONFIG_FEATURE_ENABLE(feature_xxxxx)],[]) +# +# AX_CONFIG_FEATURE(feature_xxxxx, [turns on/off XXXXX support], +# HAVE_XXXXX, [Define if you want XXXXX support]) +# AX_CONFIG_FEATURE(feature_yyyyy, [turns on/off YYYYY support], +# HAVE_YYYYY, [Define if you want YYYYY support], +# [enable_yyyyy="yes"], [enable_yyyyy="no"]) +# +# ... +# +# NOTE: AX_CONFIG_FEATURE_ENABLE() must be placed first of the relative +# AX_CONFIG_FEATURE() macro ... +# +# LICENSE +# +# Copyright (c) 2008 Francesco Salvestrini +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 10 + +AC_DEFUN([AX_CONFIG_FEATURE],[ dnl +m4_pushdef([FEATURE], patsubst([$1], -, _))dnl + +AC_ARG_ENABLE([$1],AS_HELP_STRING([--enable-$1],[$2]),[ +case "${enableval}" in + yes) + ax_config_feature_[]FEATURE[]="yes" + ;; + no) + ax_config_feature_[]FEATURE[]="no" + ;; + *) + AC_MSG_ERROR([bad value ${enableval} for feature --$1]) + ;; +esac +]) + +AS_IF([test "$ax_config_feature_[]FEATURE[]" = yes],[ dnl + AC_DEFINE([$3]) + $5 + AS_IF([test "$ax_config_feature_verbose" = yes],[ dnl + AC_MSG_NOTICE([Feature $1 is enabled]) + ]) +],[ dnl + $6 + AS_IF([test "$ax_config_feature_verbose" = yes],[ dnl + AC_MSG_NOTICE([Feature $1 is disabled]) + ]) +]) + +AH_TEMPLATE([$3],[$4]) + +m4_popdef([FEATURE])dnl +]) + +dnl Feature global +AC_DEFUN([AX_CONFIG_FEATURE_VERBOSE],[ dnl + ax_config_feature_verbose=yes +]) + +dnl Feature global +AC_DEFUN([AX_CONFIG_FEATURE_SILENT],[ dnl + ax_config_feature_verbose=no +]) + +dnl Feature specific +AC_DEFUN([AX_CONFIG_FEATURE_DEFAULT_ENABLED], [ + ax_config_feature_[]FEATURE[]_default=yes +]) + +dnl Feature specific +AC_DEFUN([AX_CONFIG_FEATURE_DEFAULT_DISABLED], [ + ax_config_feature_[]FEATURE[]_default=no +]) + +dnl Feature specific +AC_DEFUN([AX_CONFIG_FEATURE_ENABLE],[ dnl + ax_config_feature_[]patsubst([$1], -, _)[]=yes +]) + +dnl Feature specific +AC_DEFUN([AX_CONFIG_FEATURE_DISABLE],[ dnl + ax_config_feature_[]patsubst([$1], -, _)[]=no +]) + diff --git a/config/epoll.m4 b/config/epoll.m4 new file mode 100644 index 000000000..6508a2012 --- /dev/null +++ b/config/epoll.m4 @@ -0,0 +1,105 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_have_epoll.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_HAVE_EPOLL([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# AX_HAVE_EPOLL_PWAIT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# DESCRIPTION +# +# This macro determines whether the system supports the epoll I/O event +# interface. A neat usage example would be: +# +# AX_HAVE_EPOLL( +# [AX_CONFIG_FEATURE_ENABLE(epoll)], +# [AX_CONFIG_FEATURE_DISABLE(epoll)]) +# AX_CONFIG_FEATURE( +# [epoll], [This platform supports epoll(7)], +# [HAVE_EPOLL], [This platform supports epoll(7).]) +# +# The epoll interface was added to the Linux kernel in version 2.5.45, and +# the macro verifies that a kernel newer than this is installed. This +# check is somewhat unreliable if doesn't match the +# running kernel, but it is necessary regardless, because glibc comes with +# stubs for the epoll_create(), epoll_wait(), etc. that allow programs to +# compile and link even if the kernel is too old; the problem would then +# be detected only at runtime. +# +# Linux kernel version 2.6.19 adds the epoll_pwait() call in addition to +# epoll_wait(). The availability of that function can be tested with the +# second macro. Generally speaking, it is safe to assume that +# AX_HAVE_EPOLL would succeed if AX_HAVE_EPOLL_PWAIT has, but not the +# other way round. +# +# LICENSE +# +# Copyright (c) 2008 Peter Simons +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 10 + +AC_DEFUN([AX_HAVE_EPOLL], [dnl + ax_have_epoll_cppflags="${CPPFLAGS}" + AC_CHECK_HEADER([linux/version.h], [CPPFLAGS="${CPPFLAGS} -DHAVE_LINUX_VERSION_H"]) + AC_MSG_CHECKING([for Linux epoll(7) interface]) + AC_CACHE_VAL([ax_cv_have_epoll], [dnl + AC_LINK_IFELSE([dnl + AC_LANG_PROGRAM([dnl +#include +#ifdef HAVE_LINUX_VERSION_H +# include +# if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,45) +# error linux kernel version is too old to have epoll +# endif +#endif +], [dnl +int fd, rc; +struct epoll_event ev; +fd = epoll_create(128); +rc = epoll_wait(fd, &ev, 1, 0);])], + [ax_cv_have_epoll=yes], + [ax_cv_have_epoll=no])]) + CPPFLAGS="${ax_have_epoll_cppflags}" + AS_IF([test "${ax_cv_have_epoll}" = "yes"], + [AC_MSG_RESULT([yes]) +$1],[AC_MSG_RESULT([no]) +$2]) +])dnl + +AC_DEFUN([AX_HAVE_EPOLL_PWAIT], [dnl + ax_have_epoll_cppflags="${CPPFLAGS}" + AC_CHECK_HEADER([linux/version.h], + [CPPFLAGS="${CPPFLAGS} -DHAVE_LINUX_VERSION_H"]) + AC_MSG_CHECKING([for Linux epoll(7) interface with signals extension]) + AC_CACHE_VAL([ax_cv_have_epoll_pwait], [dnl + AC_LINK_IFELSE([dnl + AC_LANG_PROGRAM([dnl +#ifdef HAVE_LINUX_VERSION_H +# include +# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +# error linux kernel version is too old to have epoll_pwait +# endif +#endif +#include +#include +], [dnl +int fd, rc; +struct epoll_event ev; +fd = epoll_create(128); +rc = epoll_wait(fd, &ev, 1, 0); +rc = epoll_pwait(fd, &ev, 1, 0, (sigset_t const *)(0));])], + [ax_cv_have_epoll_pwait=yes], + [ax_cv_have_epoll_pwait=no])]) + CPPFLAGS="${ax_have_epoll_cppflags}" + AS_IF([test "${ax_cv_have_epoll_pwait}" = "yes"], + [AC_MSG_RESULT([yes]) +$1],[AC_MSG_RESULT([no]) +$2]) +])dnl + diff --git a/configure.ac b/configure.ac index f30b8329d..e5f4a6c6c 100644 --- a/configure.ac +++ b/configure.ac @@ -38,6 +38,19 @@ AC_CHECK_DECL([futex_async], [], [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include ]] ) +AX_HAVE_EPOLL( + [AX_CONFIG_FEATURE_ENABLE(epoll)], + [AX_CONFIG_FEATURE_DISABLE(epoll)] +) + +AX_CONFIG_FEATURE( + [epoll], [This platform supports epoll(7)], + [HAVE_EPOLL], [This platform supports epoll(7).], + [enable_epoll="yes"], [enable_epoll="no"] +) + +AM_CONDITIONAL([COMPAT_EPOLL], [ test "$enable_epoll" = "yes" ]) + AC_PROG_CC AC_PROG_LIBTOOL diff --git a/ltt-sessiond/Makefile.am b/ltt-sessiond/Makefile.am index d19fe3caa..e1b42ca09 100644 --- a/ltt-sessiond/Makefile.am +++ b/ltt-sessiond/Makefile.am @@ -5,6 +5,12 @@ AM_CFLAGS = -fno-strict-aliasing bin_PROGRAMS = ltt-sessiond +if COMPAT_EPOLL +COMPAT=compat-epoll.c +else +COMPAT=compat-poll.c +endif + ltt_sessiond_SOURCES = utils.c utils.h \ trace-kernel.c trace-kernel.h \ trace-ust.c trace-ust.h \ @@ -15,6 +21,8 @@ ltt_sessiond_SOURCES = utils.c utils.h \ context.c context.h \ futex.c futex.h \ shm.c shm.h \ + poll.h \ + $(COMPAT) \ session.c session.h \ ltt-sessiond.h main.c -- 2.34.1