gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [libmicrohttpd] branch master updated: Added autoconf modul


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] branch master updated: Added autoconf module for detection of select() trigger on shutdown of listening socket.
Date: Sun, 19 Mar 2017 22:57:17 +0100

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

The following commit(s) were added to refs/heads/master by this push:
     new f3dd2a63 Added autoconf module for detection of select() trigger on 
shutdown of listening socket.
f3dd2a63 is described below

commit f3dd2a630369473fe3bc0ac86983e59f64457a97
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Mon Mar 20 00:54:22 2017 +0300

    Added autoconf module for detection of select() trigger on shutdown of 
listening socket.
---
 ChangeLog                         |   5 +
 configure.ac                      |  13 +-
 m4/mhd_shutdown_socket_trigger.m4 | 338 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 348 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6e9ee2b0..6881370f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Mar 20 0:51:24 MSK 2017
+       Added autoconf module for detection whatever shutdown of listening 
socket
+       trigger select. This is only reliable method to use such feature as some
+       platforms change behaviour from version to version. -EG
+
 Sun Mar 19 13:57:30 MSK 2017
        Rewritten logic of handling "upgraded" TLS connections in epoll mode:
        used edge trigger instead of level trigger,
diff --git a/configure.ac b/configure.ac
index f44802bf..5442ed85 100644
--- a/configure.ac
+++ b/configure.ac
@@ -246,21 +246,18 @@ freebsd*)
      AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system])
      AC_DEFINE_UNQUOTED(FREEBSD,1,[This is a FreeBSD system])
      mhd_host_os='FreeBSD'
-     shutdown_trig_select='no'
      AC_MSG_RESULT([[$mhd_host_os]])
      ;;
 openbsd*)
      AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system])
      AC_DEFINE_UNQUOTED(OPENBSD,1,[This is an OpenBSD system])
      mhd_host_os='OpenBSD'
-     shutdown_trig_select='yes'
      AC_MSG_RESULT([[$mhd_host_os]])
      ;;
 netbsd*)
      AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system])
      AC_DEFINE_UNQUOTED(NETBSD,1,[This is a NetBSD system])
      mhd_host_os='NetBSD'
-     shutdown_trig_select='yes'
      AC_MSG_RESULT([[$mhd_host_os]])
      ;;
 *solaris*)
@@ -273,14 +270,12 @@ netbsd*)
      ;;
 *arm-linux*)
      AC_DEFINE_UNQUOTED(LINUX,1,[This is a Linux kernel])
-     shutdown_trig_select='yes'
      mhd_host_os='ARM Linux'
      AC_MSG_RESULT([[$mhd_host_os]])
      CFLAGS="-fPIC -pipe $CFLAGS"
      ;;
 *linux*)
      AC_DEFINE_UNQUOTED(LINUX,1,[This is a Linux kernel])
-     shutdown_trig_select='yes'
      mhd_host_os='Linux'
      AC_MSG_RESULT([[$mhd_host_os]])
      ;;
@@ -329,9 +324,6 @@ netbsd*)
 ;;
 esac
 
-AM_CONDITIONAL([HAVE_LISTEN_SHUTDOWN], [test "x$shutdown_trig_select" = 
"xyes"])
-AS_IF([test "x$shutdown_trig_select" = "xyes"], 
[AC_DEFINE([HAVE_LISTEN_SHUTDOWN],[1],[can use shutdown on listen sockets])])
-
 AC_ARG_WITH([threads],
    [AS_HELP_STRING([--with-threads=LIB],[choose threading library (posix, w32, 
auto) [auto]])],
    [], [with_threads='auto'])
@@ -603,6 +595,9 @@ fi
 AM_CONDITIONAL(W32_SHARED_LIB_EXP, [test "x$w32_shared_lib_exp" = "xyes"])
 AM_CONDITIONAL(USE_MS_LIB_TOOL, [test "x$ac_cv_use_ms_lib_tool" = "xyes"])
 
+MHD_CHECK_SOCKET_SHUTDOWN_TRIGGER([AC_DEFINE([HAVE_LISTEN_SHUTDOWN],[1],[can 
use shutdown on listen sockets])])
+AM_CONDITIONAL([HAVE_LISTEN_SHUTDOWN], [test 
"x$mhd_cv_host_shtdwn_trgr_select" = "xyes"])
+
 # set GCC options
 # use '-fno-strict-aliasing', but only if the compiler
 # and linker can take it
@@ -1444,6 +1439,8 @@ AC_MSG_NOTICE([libmicrohttpd ${PACKAGE_VERSION} 
Configuration Summary:
   Inter-thread comm: ${use_itc}
   libcurl (testing): ${MSG_CURL}
   Target directory:  ${prefix}
+  Shutdown of listening socket
+  trigger select:    ${mhd_cv_host_shtdwn_trgr_select}
   Messages:          ${enable_messages}
   Basic auth.:       ${enable_bauth}
   Digest auth.:      ${enable_dauth}
diff --git a/m4/mhd_shutdown_socket_trigger.m4 
b/m4/mhd_shutdown_socket_trigger.m4
new file mode 100644
index 00000000..d6dfd77a
--- /dev/null
+++ b/m4/mhd_shutdown_socket_trigger.m4
@@ -0,0 +1,338 @@
+# SYNOPSIS
+#
+#   MHD_CHECK_SOCKET_SHUTDOWN_TRIGGER([ACTION-IF-TRIGGER], [ACTION-IF-NOT],
+#                                     [ACTIION-IF-UNKNOWN])
+#
+# DESCRIPTION
+#
+#   Check whether shutdown of listen socket triggers waiting select().
+#   If cross-compiling, result may be unknown (third action).
+#   Result is cached in $mhd_cv_host_shtdwn_trgr_select variable.
+#
+# LICENSE
+#
+#   Copyright (c) 2017 Karlson2k (Evgeny Grin) <address@hidden>
+#
+#   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 1
+
+AC_DEFUN([MHD_CHECK_SOCKET_SHUTDOWN_TRIGGER],[dnl
+  AC_PREREQ([2.64])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AX_PTHREAD])dnl
+  AC_CHECK_HEADERS([sys/time.h],[AC_CHECK_FUNCS([[gettimeofday]])],[], 
[AC_INCLUDES_DEFAULT])
+  AC_CHECK_HEADERS([time.h],[AC_CHECK_FUNCS([[nanosleep]])],[], 
[AC_INCLUDES_DEFAULT])
+  AC_CHECK_HEADERS([unistd.h],[AC_CHECK_FUNCS([[usleep]])],[], 
[AC_INCLUDES_DEFAULT])
+  AC_CHECK_HEADERS([string.h sys/types.h sys/socket.h netinet/in.h time.h 
sys/select.h netinet/tcp.h],[],[], [AC_INCLUDES_DEFAULT])
+  AC_CACHE_CHECK([[whether shutdown of listen socket trigger select()]],
+    [[mhd_cv_host_shtdwn_trgr_select]], [dnl
+    _MHD_OS_KNOWN_SOCKET_SHUTDOWN_TRIGGER([[mhd_cv_host_shtdwn_trgr_select]])
+    AS_VAR_IF([mhd_cv_host_shtdwn_trgr_select], [["maybe"]],
+      
[_MHD_RUN_CHECK_SOCKET_SHUTDOWN_TRIGGER([[mhd_cv_host_shtdwn_trgr_select]])])
+    ]
+  )
+  AS_IF([[test "x$mhd_cv_host_shtdwn_trgr_select" = "xyes"]], [$1],
+    [[test "x$mhd_cv_host_shtdwn_trgr_select" = "xno"]], [$2], [$3])
+  ]
+)
+
+#
+# _MHD_OS_KNOWN_SOCKET_SHUTDOWN_TRIGGER(VAR)
+#
+# Sets VAR to 'yes', 'no' or 'maybe'.
+
+AC_DEFUN([_MHD_OS_KNOWN_SOCKET_SHUTDOWN_TRIGGER],[dnl
+[#] On Linux shutdown of listen socket always trigger select().
+[#] On Windows select() always ignore shutdown of listen socket.
+[#] On other paltforms result may vary depending on platform version.
+  AS_CASE([[$host_os]],
+    [[linux | linux-* | *-linux | *-linux-*]], [$1='yes'],
+    [[mingw*]], [$1='no'],
+    [[cygwin* | msys*]], [$1='no'],
+    [[winnt* | interix*]], [$1='no'],
+    [[mks]], [$1='no'],
+    [[uwin]], [$1='no'],
+    [$1='maybe']
+  )
+  ]
+)
+
+#
+# _MHD_RUN_CHECK_SOCKET_SHUTDOWN_TRIGGER(VAR)
+#
+# Sets VAR to 'yes', 'no' or 'guessing no'.
+
+AC_DEFUN([_MHD_RUN_CHECK_SOCKET_SHUTDOWN_TRIGGER],[dnl
+  AC_LANG_PUSH([C])
+  MHD_CST_SAVE_CC="$CC"
+  MHD_CST_SAVE_CFLAGS="$CFLAGS"
+  MHD_CST_SAVE_LIBS="$LIBS"
+  CC="$PTHREAD_CC"
+  CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+  LIBS="$PTHREAD_LIBS $LIBS"
+  AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#ifdef HAVE_TIME_H
+#  include <time.h>
+#endif
+#ifdef HAVE_STRING_H
+#  include <string.h>
+#endif
+
+#if !defined(_WIN32) || defined(__CYGWIN__)
+#  ifdef HAVE_SYS_TYPES_H
+#    include <sys/types.h>
+#  endif
+#  ifdef HAVE_SYS_SOCKET_H
+#    include <sys/socket.h>
+#  endif
+#  ifdef HAVE_NETINET_IN_H
+#    include <netinet/in.h>
+#  endif
+#  ifdef HAVE_SYS_TIME_H
+#    include <sys/time.h>
+#  endif
+#  ifdef HAVE_SYS_SELECT_H
+#    include <sys/select.h>
+#  endif
+#  ifdef HAVE_NETINET_TCP_H
+#    include <netinet/tcp.h>
+#  endif
+   typedef int MHD_socket;
+#  define MHD_INVALID_SOCKET (-1)
+#  define MHD_POSIX_SOCKETS 1
+#else
+#  include <winsock2.h>
+#  include <ws2tcpip.h>
+#  include <windows.h>
+   typedef SOCKET MHD_socket;
+#  define MHD_INVALID_SOCKET (INVALID_SOCKET)
+#  define MHD_WINSOCK_SOCKETS 1
+#endif
+
+#include <pthread.h>
+
+   #ifndef SHUT_RD
+#  define SHUT_RD 0
+#endif
+#ifndef SHUT_WR
+#  define SHUT_WR 1
+#endif
+#ifndef SHUT_RDWR
+#  define SHUT_RDWR 2
+#endif
+
+#ifndef NULL
+#  define NULL ((void*)0)
+#endif
+
+#ifdef HAVE_GETTIMEOFDAY
+#  if defined(_WIN32) && !defined(__CYGWIN__)
+#    undef HAVE_GETTIMEOFDAY
+#  endif
+#endif
+
+#ifdef HAVE_NANOSLEEP
+static const struct timespec sm_tmout = {0, 100000};
+#  define short_sleep() nanosleep(&sm_tmout, NULL)
+#elif HAVE_USLEEP
+#  define short_sleep() usleep(100)
+#else
+#  define short_sleep() (void)0
+#endif
+
+static volatile int going_select = 0;
+static volatile int select_ends = 0;
+static volatile int gerror = 0;
+static int timeout_mils;
+
+static void* select_thrd_func(void* param)
+{
+  fd_set rs;
+  struct timeval tmot = {0, 0};
+  MHD_socket fd = *((MHD_socket*)param);
+
+  FD_ZERO(&rs);
+  FD_SET(fd, &rs);
+  tmot.tv_usec = timeout_mils * 1000;
+  going_select = 1;
+  if (0 > select ((int)(fd) + 1, &rs, NULL, NULL, &tmot))
+    gerror = 1;
+  select_ends = 1;
+  return NULL;
+}
+
+
+static MHD_socket create_socket(void)
+{
+  return socket (AF_INET, SOCK_STREAM, 0);
+}
+
+static void close_socket(MHD_socket fd)
+{
+#ifdef MHD_POSIX_SOCKETS
+  close(fd);
+#else
+  closesocket(fd);
+#endif
+}
+
+static MHD_socket
+create_socket_listen(int port)
+{
+  MHD_socket fd;
+  struct sockaddr_in sock_addr;
+  fd = create_socket();
+  if (MHD_INVALID_SOCKET == fd)
+    return fd;
+
+  memset (&sock_addr, 0, sizeof (struct sockaddr_in));
+  sock_addr.sin_family = AF_INET;
+  sock_addr.sin_port = htons(port);
+  sock_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+  if (bind (fd, (const struct sockaddr*) &sock_addr, sizeof(sock_addr)) < 0 ||
+      listen(fd, SOMAXCONN) < 0)
+    {
+      close_socket(fd);
+      return MHD_INVALID_SOCKET;
+    }
+  return fd;
+}
+
+#ifdef HAVE_GETTIMEOFDAY
+#define diff_time(tv1, tv2) ((long long)(tv1.tv_sec-tv2.tv_sec)*10000 + (long 
long)(tv1.tv_usec-tv2.tv_usec)/100)
+#else
+#define diff_time(tv1, tv2) ((long long)(tv1-tv2))
+#endif
+
+static long long test_run_select(int timeout_millsec, int use_shutdown, long 
long delay_before_shutdown)
+{
+  pthread_t select_thrd;
+  MHD_socket fd;
+#ifdef HAVE_GETTIMEOFDAY
+  struct timeval start, stop;
+#else
+  clock_t start, stop;
+  if (-1 == clock())
+    return 0;
+#endif
+
+  fd = create_socket_listen(0);
+  if (MHD_INVALID_SOCKET == fd)
+    return 0;
+  going_select = 0;
+  select_ends = 0;
+  gerror = 0;
+  timeout_mils = timeout_millsec;
+  if (0 != pthread_create (&select_thrd, NULL, select_thrd_func, (void*)&fd))
+    return 0;
+#ifdef HAVE_GETTIMEOFDAY
+  while (!going_select) {short_sleep();}
+  gettimeofday (&start, NULL);
+#else
+  while (!going_select)
+  { start = clock(); short_sleep(); }
+#endif
+  if (use_shutdown)
+    {
+#ifdef HAVE_GETTIMEOFDAY
+      struct timeval current;
+      do {gettimeofday(&current, NULL); short_sleep();} while 
(delay_before_shutdown > diff_time(current, start));
+#else
+      while (delay_before_shutdown > clock() - start) {short_sleep();}
+#endif
+      shutdown(fd, SHUT_RDWR);
+    }
+#ifdef HAVE_GETTIMEOFDAY
+  while (!select_ends) {short_sleep();}
+  gettimeofday (&stop, NULL);
+#else
+  while (!select_ends)
+  { stop = clock(); short_sleep();}
+#endif
+  if (0 != pthread_join(select_thrd, NULL))
+    return 0;
+  close_socket(fd);
+  if (gerror)
+    return 0;
+  return (long long)diff_time(stop, start);
+}
+
+static int test_it(void)
+{
+  clock_t duration1, duration2;
+  duration1 = test_run_select(50, 0, 0);
+  if (0 == duration1)
+    return 16;
+
+  duration2 = test_run_select(500, 1, duration1 / 2);
+  if (0 == duration2)
+    return 18;
+
+  if (duration1 * 2 > duration2)
+    { /* Check second time to be sure. */
+      duration2 = test_run_select(500, 1, duration1 / 2);
+      if (0 == duration2)
+        return 20;
+      if (duration1 * 2 > duration2)
+        return 0;
+    }
+  return 1;
+}
+
+
+static int init(void)
+{
+#ifdef MHD_WINSOCK_SOCKETS
+  WSADATA wsa_data;
+
+  if (0 != WSAStartup(MAKEWORD(2, 2), &wsa_data) || MAKEWORD(2, 2) != 
wsa_data.wVersion)
+    {
+      WSACleanup();
+      return 0;
+    }
+#endif /* MHD_WINSOCK_SOCKETS */
+  return 1;
+}
+
+static void cleanup(void)
+{
+#ifdef MHD_WINSOCK_SOCKETS
+  WSACleanup();
+#endif /* MHD_WINSOCK_SOCKETS */
+}
+
+int main(void)
+{
+  int res;
+  if (!init())
+    return 10;
+
+  res = test_it();
+
+  cleanup();
+  if (gerror)
+    return 40;
+
+  return res;
+}
+]])], [$1='yes'], [$1='no'], [$1='guessing no'])
+  CC="$MHD_CST_SAVE_CC"
+  CFLAGS="$MHD_CST_SAVE_CFLAGS"
+  LIBS="$MHD_CST_SAVE_LIBS"
+  AS_UNSET([[MHD_CST_SAVE_CC]])
+  AS_UNSET([[MHD_CST_SAVE_CFLAGS]])
+  AS_UNSET([[MHD_CST_SAVE_LIBS]])
+  AC_LANG_POP([C])
+  ]
+)

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]