Compare commits

...
57 changed files with 961 additions and 4885 deletions
Vendored
+10 -10
View File
@@ -1,6 +1,6 @@
# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # generated automatically by aclocal 1.15.1 -*- Autoconf -*-
# Copyright (C) 1996-2018 Free Software Foundation, Inc. # Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@@ -12,9 +12,9 @@
# PARTICULAR PURPOSE. # PARTICULAR PURPOSE.
m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
# serial 12 (pkg-config-0.29.2) dnl serial 11 (pkg-config-0.29.1)
dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>. dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com> dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
dnl dnl
@@ -55,7 +55,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require. dnl of the macros you require.
m4_defun([PKG_PREREQ], m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29.2]) [m4_define([PKG_MACROS_VERSION], [0.29.1])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ ])dnl PKG_PREREQ
@@ -156,7 +156,7 @@ AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no pkg_failed=no
AC_MSG_CHECKING([for $2]) AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2])
@@ -166,11 +166,11 @@ and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.]) See the pkg-config man page for more details.])
if test $pkg_failed = yes; then if test $pkg_failed = yes; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED _PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
else else
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
fi fi
# Put the nasty error message in config.log where it belongs # Put the nasty error message in config.log where it belongs
@@ -187,7 +187,7 @@ installed software in a non-standard prefix.
_PKG_TEXT])[]dnl _PKG_TEXT])[]dnl
]) ])
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE( m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it [The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full is in your PATH or set the PKG_CONFIG environment variable to the full
+1 -1
View File
@@ -260,7 +260,7 @@ received(unsigned int bytes, isc_sockaddr_t *from, dig_query_t *query) {
printf(";; Query time: %ld msec\n", (long) diff / 1000); printf(";; Query time: %ld msec\n", (long) diff / 1000);
printf(";; SERVER: %s(%s)\n", fromtext, query->servname); printf(";; SERVER: %s(%s)\n", fromtext, query->servname);
time(&tnow); time(&tnow);
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32) #if !defined(WIN32)
(void)localtime_r(&tnow, &tmnow); (void)localtime_r(&tnow, &tmnow);
#else #else
tmnow = *localtime(&tnow); tmnow = *localtime(&tnow);
+1 -19
View File
@@ -718,11 +718,7 @@ parse_command_line(int argc, char *argv[]) {
printf("linked to zlib version: %s\n", printf("linked to zlib version: %s\n",
zlibVersion()); zlibVersion());
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
printf("threads support is enabled\n"); printf("threads support is enabled\n");
#else
printf("threads support is disabled\n");
#endif
exit(0); exit(0);
case 'x': case 'x':
/* Obsolete. No longer in use. Ignore. */ /* Obsolete. No longer in use. Ignore. */
@@ -774,7 +770,6 @@ create_managers(void) {
INSIST(named_g_cpus_detected > 0); INSIST(named_g_cpus_detected > 0);
#ifdef ISC_PLATFORM_USETHREADS
if (named_g_cpus == 0) if (named_g_cpus == 0)
named_g_cpus = named_g_cpus_detected; named_g_cpus = named_g_cpus_detected;
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
@@ -783,9 +778,6 @@ create_managers(void) {
named_g_cpus_detected, named_g_cpus_detected,
named_g_cpus_detected == 1 ? "" : "s", named_g_cpus_detected == 1 ? "" : "s",
named_g_cpus, named_g_cpus == 1 ? "" : "s"); named_g_cpus, named_g_cpus == 1 ? "" : "s");
#else
named_g_cpus = 1;
#endif
#ifdef WIN32 #ifdef WIN32
named_g_udpdisp = 1; named_g_udpdisp = 1;
#else #else
@@ -798,12 +790,10 @@ create_managers(void) {
if (named_g_udpdisp > named_g_cpus) if (named_g_udpdisp > named_g_cpus)
named_g_udpdisp = named_g_cpus; named_g_udpdisp = named_g_cpus;
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO, NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"using %u UDP listener%s per interface", "using %u UDP listener%s per interface",
named_g_udpdisp, named_g_udpdisp == 1 ? "" : "s"); named_g_udpdisp, named_g_udpdisp == 1 ? "" : "s");
#endif
result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0, result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0,
&named_g_taskmgr); &named_g_taskmgr);
@@ -830,7 +820,7 @@ create_managers(void) {
isc_result_totext(result)); isc_result_totext(result));
return (ISC_R_UNEXPECTED); return (ISC_R_UNEXPECTED);
} }
isc__socketmgr_maxudp(named_g_socketmgr, maxudp); isc_socketmgr_maxudp(named_g_socketmgr, maxudp);
result = isc_socketmgr_getmaxsockets(named_g_socketmgr, &socks); result = isc_socketmgr_getmaxsockets(named_g_socketmgr, &socks);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
@@ -915,12 +905,10 @@ setup(void) {
isc_mem_free(named_g_mctx, instance); isc_mem_free(named_g_mctx, instance);
#endif /* HAVE_LIBSCF */ #endif /* HAVE_LIBSCF */
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Check for the number of cpu's before named_os_chroot(). * Check for the number of cpu's before named_os_chroot().
*/ */
named_g_cpus_detected = isc_os_ncpus(); named_g_cpus_detected = isc_os_ncpus();
#endif
named_os_chroot(named_g_chrootdir); named_os_chroot(named_g_chrootdir);
@@ -1047,15 +1035,9 @@ setup(void) {
NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE,
"linked to zlib version: %s", zlibVersion()); "linked to zlib version: %s", zlibVersion());
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE,
"threads support is enabled"); "threads support is enabled");
#else
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE,
"threads support is disabled");
#endif
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE, NAMED_LOGMODULE_MAIN, ISC_LOG_NOTICE,
+1 -6
View File
@@ -8000,7 +8000,7 @@ load_configuration(const char *filename, named_server_t *server,
"less than 128 UDP sockets available after " "less than 128 UDP sockets available after "
"applying 'reserved-sockets' and 'maxsockets'"); "applying 'reserved-sockets' and 'maxsockets'");
} }
isc__socketmgr_setreserved(named_g_socketmgr, reserved); isc_socketmgr_setreserved(named_g_socketmgr, reserved);
#ifdef HAVE_GEOIP #ifdef HAVE_GEOIP
/* /*
@@ -11208,7 +11208,6 @@ named_server_status(named_server_t *server, isc_buffer_t **text) {
} }
CHECK(putstr(text, line)); CHECK(putstr(text, line));
#ifdef ISC_PLATFORM_USETHREADS
snprintf(line, sizeof(line), "CPUs found: %u\n", named_g_cpus_detected); snprintf(line, sizeof(line), "CPUs found: %u\n", named_g_cpus_detected);
CHECK(putstr(text, line)); CHECK(putstr(text, line));
@@ -11218,10 +11217,6 @@ named_server_status(named_server_t *server, isc_buffer_t **text) {
snprintf(line, sizeof(line), "UDP listeners per interface: %u\n", snprintf(line, sizeof(line), "UDP listeners per interface: %u\n",
named_g_udpdisp); named_g_udpdisp);
CHECK(putstr(text, line)); CHECK(putstr(text, line));
#else
snprintf(line, sizeof(line), "CPUs found: N/A (threads disabled)\n");
CHECK(putstr(text, line));
#endif
snprintf(line, sizeof(line), "number of zones: %u (%u automatic)\n", snprintf(line, sizeof(line), "number of zones: %u (%u automatic)\n",
zonecount, automatic); zonecount, automatic);
-14
View File
@@ -25,8 +25,6 @@
#define sleep(x) Sleep(1000 * x) #define sleep(x) Sleep(1000 * x)
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
isc_rwlock_t lock; isc_rwlock_t lock;
static isc_threadresult_t static isc_threadresult_t
@@ -130,15 +128,3 @@ main(int argc, char *argv[]) {
return (0); return (0);
} }
#else
int
main(int argc, char *argv[]) {
UNUSED(argc);
UNUSED(argv);
fprintf(stderr, "This test requires threads.\n");
return(1);
}
#endif
Vendored
+375 -142
View File
@@ -809,7 +809,6 @@ INSTALL_LIBRARY
ISC_THREAD_DIR ISC_THREAD_DIR
THREADOPTSRCS THREADOPTSRCS
THREADOPTOBJS THREADOPTOBJS
ISC_PLATFORM_USETHREADS
ALWAYS_DEFINES ALWAYS_DEFINES
CHECK_DSA CHECK_DSA
GEOIPLINKOBJS GEOIPLINKOBJS
@@ -908,6 +907,7 @@ infodir
docdir docdir
oldincludedir oldincludedir
includedir includedir
runstatedir
localstatedir localstatedir
sharedstatedir sharedstatedir
sysconfdir sysconfdir
@@ -1072,6 +1072,7 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc' sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com' sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var' localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include' includedir='${prefix}/include'
oldincludedir='/usr/include' oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1324,6 +1325,15 @@ do
| -silent | --silent | --silen | --sile | --sil) | -silent | --silent | --silen | --sile | --sil)
silent=yes ;; silent=yes ;;
-runstatedir | --runstatedir | --runstatedi | --runstated \
| --runstate | --runstat | --runsta | --runst | --runs \
| --run | --ru | --r)
ac_prev=runstatedir ;;
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
| --run=* | --ru=* | --r=*)
runstatedir=$ac_optarg ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;; ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1461,7 +1471,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \ datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir libdir localedir mandir runstatedir
do do
eval ac_val=\$$ac_var eval ac_val=\$$ac_var
# Remove trailing slashes. # Remove trailing slashes.
@@ -1614,6 +1624,7 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var] --localstatedir=DIR modifiable single-machine data [PREFIX/var]
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib] --libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include] --includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include] --oldincludedir=DIR C header files for non-gcc [/usr/include]
@@ -12093,11 +12104,6 @@ $as_echo "#define ENABLE_AFL 1" >>confdefs.h
fi fi
case "$enable_afl" in
yes)
LIBS="$LIBS -lpthread"
;;
esac
# #
# Make very sure that these are the first files processed by # Make very sure that these are the first files processed by
@@ -15541,8 +15547,274 @@ done
case "$host" in case "$host" in
*solaris-*) *-freebsd*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 CC="$CC -pthread"
CCOPT="$CCOPT -pthread"
CCNOOPT="$CCNOOPT -pthread"
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;;
*-openbsd*)
CC="$CC -pthread"
CCOPT="$CCOPT -pthread"
CCNOOPT="$CCNOOPT -pthread"
;;
*-solaris*)
LIBS="$LIBS -lthread"
;;
*-ibm-aix*)
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;;
esac
else
case $host in
*-dec-osf*)
CC="$CC -pthread"
CCOPT="$CCOPT -pthread"
CCNOOPT="$CCNOOPT -pthread"
;;
*-solaris*)
CC="$CC -mt"
CCOPT="$CCOPT -mt"
CCNOOPT="$CCNOOPT -mt"
;;
*-ibm-aix*)
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;;
*-sco-sysv*uw*|*-*-sysv*UnixWare*)
CC="$CC -Kthread"
CCOPT="$CCOPT -Kthread"
CCNOOPT="$CCNOOPT -Kthread"
;;
*-*-sysv*OpenUNIX*)
CC="$CC -Kpthread"
CCOPT="$CCOPT -Kpthread"
CCNOOPT="$CCNOOPT -Kpthread"
;;
esac
fi
ALWAYS_DEFINES="-D_REENTRANT"
THREADOPTOBJS='${THREADOPTOBJS}'
THREADOPTSRCS='${THREADOPTSRCS}'
thread_dir=pthreads
#
# We'd like to use sigwait() too
#
ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait"
if test "x$ac_cv_func_sigwait" = xyes; then :
$as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc" >&5
$as_echo_n "checking for sigwait in -lc... " >&6; }
if ${ac_cv_lib_c_sigwait+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char sigwait ();
int
main ()
{
return sigwait ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_c_sigwait=yes
else
ac_cv_lib_c_sigwait=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sigwait" >&5
$as_echo "$ac_cv_lib_c_sigwait" >&6; }
if test "x$ac_cv_lib_c_sigwait" = xyes; then :
$as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lpthread" >&5
$as_echo_n "checking for sigwait in -lpthread... " >&6; }
if ${ac_cv_lib_pthread_sigwait+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char sigwait ();
int
main ()
{
return sigwait ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_pthread_sigwait=yes
else
ac_cv_lib_pthread_sigwait=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_sigwait" >&5
$as_echo "$ac_cv_lib_pthread_sigwait" >&6; }
if test "x$ac_cv_lib_pthread_sigwait" = xyes; then :
$as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Psigwait in -lpthread" >&5
$as_echo_n "checking for _Psigwait in -lpthread... " >&6; }
if ${ac_cv_lib_pthread__Psigwait+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char _Psigwait ();
int
main ()
{
return _Psigwait ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_pthread__Psigwait=yes
else
ac_cv_lib_pthread__Psigwait=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread__Psigwait" >&5
$as_echo "$ac_cv_lib_pthread__Psigwait" >&6; }
if test "x$ac_cv_lib_pthread__Psigwait" = xyes; then :
$as_echo "#define HAVE_SIGWAIT 1" >>confdefs.h
fi
fi
fi
fi
ac_fn_c_check_func "$LINENO" "pthread_attr_getstacksize" "ac_cv_func_pthread_attr_getstacksize"
if test "x$ac_cv_func_pthread_attr_getstacksize" = xyes; then :
$as_echo "#define HAVE_PTHREAD_ATTR_GETSTACKSIZE 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "pthread_attr_setstacksize" "ac_cv_func_pthread_attr_setstacksize"
if test "x$ac_cv_func_pthread_attr_setstacksize" = xyes; then :
$as_echo "#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1" >>confdefs.h
fi
# Check whether --with-locktype was given.
if test "${with_locktype+set}" = set; then :
withval=$with_locktype; locktype="$withval"
else
locktype="adaptive"
fi
case "$locktype" in
adaptive)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_MUTEX_ADAPTIVE_NP" >&5
$as_echo_n "checking for PTHREAD_MUTEX_ADAPTIVE_NP... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
int
main ()
{
return (PTHREAD_MUTEX_ADAPTIVE_NP);
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using adaptive lock type" >&5
$as_echo "using adaptive lock type" >&6; }
$as_echo "#define HAVE_PTHREAD_MUTEX_ADAPTIVE_NP 1" >>confdefs.h
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5
$as_echo "using standard lock type" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
standard)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using standard lock type" >&5
$as_echo "using standard lock type" >&6; }
;;
*)
as_fn_error $? "You must specify \"adaptive\" or \"standard\" for --with-locktype." "$LINENO" 5
;;
esac
for ac_header in sched.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default"
if test "x$ac_cv_header_sched_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_SCHED_H 1
_ACEOF
fi
done
case "$host" in
*solaris-*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
$as_echo_n "checking for sched_yield in -lrt... " >&6; } $as_echo_n "checking for sched_yield in -lrt... " >&6; }
if ${ac_cv_lib_rt_sched_yield+:} false; then : if ${ac_cv_lib_rt_sched_yield+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
@@ -15587,10 +15859,10 @@ _ACEOF
fi fi
;; ;;
esac esac
for ac_func in sched_yield pthread_yield pthread_yield_np for ac_func in sched_yield pthread_yield pthread_yield_np
do : do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -15603,15 +15875,15 @@ fi
done done
#
# Additional OS-specific issues related to pthreads and sigwait.
#
case "$host" in
# #
# Additional OS-specific issues related to pthreads and sigwait. # One more place to look for sigwait.
# #
case "$host" in *-freebsd*)
# { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc_r" >&5
# One more place to look for sigwait.
#
*-freebsd*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigwait in -lc_r" >&5
$as_echo_n "checking for sigwait in -lc_r... " >&6; } $as_echo_n "checking for sigwait in -lc_r... " >&6; }
if ${ac_cv_lib_c_r_sigwait+:} false; then : if ${ac_cv_lib_c_r_sigwait+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
@@ -15652,60 +15924,60 @@ if test "x$ac_cv_lib_c_r_sigwait" = xyes; then :
fi fi
case $host in case $host in
*-freebsd5.[012]|*-freebsd5.[012].*);; *-freebsd5.[012]|*-freebsd5.[012].*);;
*-freebsd5.[3456789]|*-freebsd5.[3456789].*) *-freebsd5.[3456789]|*-freebsd5.[3456789].*)
$as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h
;;
*-freebsd6.*)
$as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h
;;
esac
;;
#
# BSDI 3.0 through 4.0.1 needs pthread_init() to be
# called before certain pthreads calls. This is deprecated
# in BSD/OS 4.1.
#
*-bsdi3.*|*-bsdi4.0*)
$as_echo "#define NEED_PTHREAD_INIT 1" >>confdefs.h
;; ;;
# *-freebsd6.*)
# LinuxThreads requires some changes to the way we $as_echo "#define NEED_PTHREAD_SCOPE_SYSTEM 1" >>confdefs.h
# deal with signals.
#
*-linux*)
$as_echo "#define HAVE_LINUXTHREADS 1" >>confdefs.h
;; ;;
# esac
# Ensure the right sigwait() semantics on Solaris and make ;;
# sure we call pthread_setconcurrency. #
# # BSDI 3.0 through 4.0.1 needs pthread_init() to be
*-solaris*) # called before certain pthreads calls. This is deprecated
$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h # in BSD/OS 4.1.
#
*-bsdi3.*|*-bsdi4.0*)
$as_echo "#define NEED_PTHREAD_INIT 1" >>confdefs.h
ac_fn_c_check_func "$LINENO" "pthread_setconcurrency" "ac_cv_func_pthread_setconcurrency" ;;
#
# LinuxThreads requires some changes to the way we
# deal with signals.
#
*-linux*)
$as_echo "#define HAVE_LINUXTHREADS 1" >>confdefs.h
;;
#
# Ensure the right sigwait() semantics on Solaris and make
# sure we call pthread_setconcurrency.
#
*-solaris*)
$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
ac_fn_c_check_func "$LINENO" "pthread_setconcurrency" "ac_cv_func_pthread_setconcurrency"
if test "x$ac_cv_func_pthread_setconcurrency" = xyes; then : if test "x$ac_cv_func_pthread_setconcurrency" = xyes; then :
$as_echo "#define CALL_PTHREAD_SETCONCURRENCY 1" >>confdefs.h $as_echo "#define CALL_PTHREAD_SETCONCURRENCY 1" >>confdefs.h
fi fi
;; ;;
# #
# UnixWare does things its own way. # UnixWare does things its own way.
# #
*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
$as_echo "#define HAVE_UNIXWARE_SIGWAIT 1" >>confdefs.h $as_echo "#define HAVE_UNIXWARE_SIGWAIT 1" >>confdefs.h
;; ;;
esac esac
# Look for functions relating to thread naming # Look for functions relating to thread naming
for ac_func in pthread_setname_np pthread_set_name_np for ac_func in pthread_setname_np pthread_set_name_np
do : do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -15717,7 +15989,7 @@ _ACEOF
fi fi
done done
for ac_header in pthread_np.h for ac_header in pthread_np.h
do : do :
ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "#include <pthread.h> ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "#include <pthread.h>
" "
@@ -15731,25 +16003,16 @@ fi
done done
# #
# Look for sysconf to allow detection of the number of processors. # Look for sysconf to allow detection of the number of processors.
# #
ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf"
if test "x$ac_cv_func_sysconf" = xyes; then : if test "x$ac_cv_func_sysconf" = xyes; then :
$as_echo "#define HAVE_SYSCONF 1" >>confdefs.h $as_echo "#define HAVE_SYSCONF 1" >>confdefs.h
fi fi
else
ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS"
thread_dir=nothreads
THREADOPTOBJS=""
THREADOPTSRCS=""
ALWAYS_DEFINES=""
fi
@@ -17385,23 +17648,6 @@ if test "x$ac_cv_func_getc_unlocked" = xyes; then :
fi fi
#
# Indicate what the final decision was regarding threads.
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with threads" >&5
$as_echo_n "checking whether to build with threads... " >&6; }
if $use_threads; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
#
# End of pthreads stuff.
#
# #
# Large File # Large File
# #
@@ -20191,14 +20437,12 @@ fi
# #
# CPU relax (for spin locks) # CPU relax (for spin locks)
# #
if $use_threads case "$host" in
then i[3456]86-*)
case "$host" in # x86_32
i[3456]86-*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5
# x86_32
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5
$as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; } $as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
int int
@@ -20212,18 +20456,18 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;; ;;
x86_64-*|amd64-*) x86_64-*|amd64-*)
# x86_64 # x86_64
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"rep; nop\"); works" >&5
$as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; } $as_echo_n "checking if asm(\"rep; nop\"); works... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
int int
@@ -20237,18 +20481,18 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")" ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;; ;;
ia64-*) ia64-*)
# ia64 # ia64
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"hint @pause\"); works" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if asm(\"hint @pause\"); works" >&5
$as_echo_n "checking if asm(\"hint @pause\"); works... " >&6; } $as_echo_n "checking if asm(\"hint @pause\"); works... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
int int
@@ -20262,28 +20506,28 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")" ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;; ;;
sparc-*) sparc-*)
# sparc # sparc
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpu_relax(); or __cpu_relax(); works" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if cpu_relax(); or __cpu_relax(); works" >&5
$as_echo_n "checking if cpu_relax(); or __cpu_relax(); works... " >&6; } $as_echo_n "checking if cpu_relax(); or __cpu_relax(); works... " >&6; }
ac_fn_c_check_func "$LINENO" "cpu_relax" "ac_cv_func_cpu_relax" ac_fn_c_check_func "$LINENO" "cpu_relax" "ac_cv_func_cpu_relax"
if test "x$ac_cv_func_cpu_relax" = xyes; then : if test "x$ac_cv_func_cpu_relax" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()" ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"
else else
ac_fn_c_check_func "$LINENO" "__cpu_relax" "ac_cv_func___cpu_relax" ac_fn_c_check_func "$LINENO" "__cpu_relax" "ac_cv_func___cpu_relax"
if test "x$ac_cv_func___cpu_relax" = xyes; then : if test "x$ac_cv_func___cpu_relax" = xyes; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; } $as_echo "yes" >&6; }
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()" ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"
else else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
@@ -20291,9 +20535,8 @@ fi
fi fi
;; ;;
esac esac
fi
@@ -20606,9 +20849,6 @@ DNSTAPOBJS=
DNSTAPTARGETS= DNSTAPTARGETS=
DNSTAP_PB_C_H= DNSTAP_PB_C_H=
if test "x$use_dnstap" != "xno"; then if test "x$use_dnstap" != "xno"; then
if ! $use_threads; then
as_fn_error $? "Dnstap requires threads." "$LINENO" 5
fi
# Check whether --with-protobuf-c was given. # Check whether --with-protobuf-c was given.
if test "${with_protobuf_c+set}" = set; then : if test "${with_protobuf_c+set}" = set; then :
@@ -21747,8 +21987,8 @@ case $with_libidn2 in #(
yes) : yes) :
pkg_failed=no pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libidn2" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBIDN2" >&5
$as_echo_n "checking for libidn2... " >&6; } $as_echo_n "checking for LIBIDN2... " >&6; }
if test -n "$LIBIDN2_CFLAGS"; then if test -n "$LIBIDN2_CFLAGS"; then
pkg_cv_LIBIDN2_CFLAGS="$LIBIDN2_CFLAGS" pkg_cv_LIBIDN2_CFLAGS="$LIBIDN2_CFLAGS"
@@ -21788,7 +22028,7 @@ fi
if test $pkg_failed = yes; then if test $pkg_failed = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -21815,7 +22055,7 @@ Alternatively, you may set the environment variables LIBIDN2_CFLAGS
and LIBIDN2_LIBS to avoid the need to call pkg-config. and LIBIDN2_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details." "$LINENO" 5 See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -21955,8 +22195,8 @@ case $with_cmocka in #(
yes) : yes) :
pkg_failed=no pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmocka" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CMOCKA" >&5
$as_echo_n "checking for cmocka... " >&6; } $as_echo_n "checking for CMOCKA... " >&6; }
if test -n "$CMOCKA_CFLAGS"; then if test -n "$CMOCKA_CFLAGS"; then
pkg_cv_CMOCKA_CFLAGS="$CMOCKA_CFLAGS" pkg_cv_CMOCKA_CFLAGS="$CMOCKA_CFLAGS"
@@ -21996,7 +22236,7 @@ fi
if test $pkg_failed = yes; then if test $pkg_failed = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -22023,7 +22263,7 @@ Alternatively, you may set the environment variables CMOCKA_CFLAGS
and CMOCKA_LIBS to avoid the need to call pkg-config. and CMOCKA_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details." "$LINENO" 5 See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; } $as_echo "no" >&6; }
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
@@ -22296,9 +22536,6 @@ fi
case "$use_tuning" in case "$use_tuning" in
large) large)
if ! $use_threads; then
as_fn_error $? "Large-system tuning requires threads." "$LINENO" 5
fi
$as_echo "#define TUNE_LARGE 1" >>confdefs.h $as_echo "#define TUNE_LARGE 1" >>confdefs.h
@@ -26058,11 +26295,8 @@ report() {
echo "Configuration summary:" echo "Configuration summary:"
echo "-------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------"
echo "Optional features enabled:" echo "Optional features enabled:"
if $use_threads; then if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
echo " Multiprocessing support (--enable-threads)" echo " Mutex lock type: $locktype"
if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
echo " Mutex lock type: $locktype"
fi
fi fi
test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)" test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)"
test "no" = "$use_dnstap" || \ test "no" = "$use_dnstap" || \
@@ -26127,7 +26361,6 @@ report() {
echo "-------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------"
echo "Features disabled or unavailable on this platform:" echo "Features disabled or unavailable on this platform:"
$use_threads || echo " Multiprocessing support (--enable-threads)"
test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \ test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \
echo " IPv6 support (--enable-ipv6)" echo " IPv6 support (--enable-ipv6)"
test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)" test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)"
+208 -148
View File
@@ -105,11 +105,6 @@ AC_ARG_ENABLE(afl,
[default=no]]), [default=no]]),
[AC_DEFINE([ENABLE_AFL], [1], [AC_DEFINE([ENABLE_AFL], [1],
[Define to enable American Fuzzy Lop test harness])]) [Define to enable American Fuzzy Lop test harness])])
case "$enable_afl" in
yes)
LIBS="$LIBS -lpthread"
;;
esac
# #
# Make very sure that these are the first files processed by # Make very sure that these are the first files processed by
@@ -1005,83 +1000,175 @@ then
AC_CHECK_HEADERS(sched.h) AC_CHECK_HEADERS(sched.h)
case "$host" in case "$host" in
*solaris-*) *-freebsd*)
AC_CHECK_LIB(rt, sched_yield) CC="$CC -pthread"
CCOPT="$CCOPT -pthread"
CCNOOPT="$CCNOOPT -pthread"
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;;
*-openbsd*)
CC="$CC -pthread"
CCOPT="$CCOPT -pthread"
CCNOOPT="$CCNOOPT -pthread"
;;
*-solaris*)
LIBS="$LIBS -lthread"
;;
*-ibm-aix*)
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;; ;;
esac esac
AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np)
#
# Additional OS-specific issues related to pthreads and sigwait.
#
case "$host" in
#
# One more place to look for sigwait.
#
*-freebsd*)
AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),)
case $host in
*-freebsd5.[[012]]|*-freebsd5.[[012]].*);;
*-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*)
AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
;;
*-freebsd6.*)
AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
;;
esac
;;
#
# BSDI 3.0 through 4.0.1 needs pthread_init() to be
# called before certain pthreads calls. This is deprecated
# in BSD/OS 4.1.
#
*-bsdi3.*|*-bsdi4.0*)
AC_DEFINE(NEED_PTHREAD_INIT)
;;
#
# LinuxThreads requires some changes to the way we
# deal with signals.
#
*-linux*)
AC_DEFINE(HAVE_LINUXTHREADS)
;;
#
# Ensure the right sigwait() semantics on Solaris and make
# sure we call pthread_setconcurrency.
#
*-solaris*)
AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
AC_CHECK_FUNC(pthread_setconcurrency,
AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY))
;;
#
# UnixWare does things its own way.
#
*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
;;
esac
# Look for functions relating to thread naming
AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np)
AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>])
#
# Look for sysconf to allow detection of the number of processors.
#
AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),)
else else
ISC_PLATFORM_USETHREADS="#undef ISC_PLATFORM_USETHREADS" case $host in
thread_dir=nothreads *-dec-osf*)
THREADOPTOBJS="" CC="$CC -pthread"
THREADOPTSRCS="" CCOPT="$CCOPT -pthread"
ALWAYS_DEFINES="" CCNOOPT="$CCNOOPT -pthread"
;;
*-solaris*)
CC="$CC -mt"
CCOPT="$CCOPT -mt"
CCNOOPT="$CCNOOPT -mt"
;;
*-ibm-aix*)
STD_CDEFINES="$STD_CDEFINES -D_THREAD_SAFE"
;;
*-sco-sysv*uw*|*-*-sysv*UnixWare*)
CC="$CC -Kthread"
CCOPT="$CCOPT -Kthread"
CCNOOPT="$CCNOOPT -Kthread"
;;
*-*-sysv*OpenUNIX*)
CC="$CC -Kpthread"
CCOPT="$CCOPT -Kpthread"
CCNOOPT="$CCNOOPT -Kpthread"
;;
esac
fi fi
ALWAYS_DEFINES="-D_REENTRANT"
THREADOPTOBJS='${THREADOPTOBJS}'
THREADOPTSRCS='${THREADOPTSRCS}'
thread_dir=pthreads
#
# We'd like to use sigwait() too
#
AC_CHECK_FUNC(sigwait,
AC_DEFINE(HAVE_SIGWAIT),
AC_CHECK_LIB(c, sigwait,
AC_DEFINE(HAVE_SIGWAIT),
AC_CHECK_LIB(pthread, sigwait,
AC_DEFINE(HAVE_SIGWAIT),
AC_CHECK_LIB(pthread, _Psigwait,
AC_DEFINE(HAVE_SIGWAIT),))))
AC_CHECK_FUNC(pthread_attr_getstacksize,
AC_DEFINE(HAVE_PTHREAD_ATTR_GETSTACKSIZE),)
AC_CHECK_FUNC(pthread_attr_setstacksize,
AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE),)
AC_ARG_WITH(locktype,
AS_HELP_STRING([--with-locktype=ARG],
[Specify mutex lock type
(adaptive or standard)]),
locktype="$withval", locktype="adaptive")
case "$locktype" in
adaptive)
AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_ADAPTIVE_NP);
]])],
[ AC_MSG_RESULT(using adaptive lock type)
AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
[Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ],
[ AC_MSG_RESULT(using standard lock type) ])
;;
standard)
AC_MSG_RESULT(using standard lock type)
;;
*)
AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])
;;
esac
AC_CHECK_HEADERS(sched.h)
case "$host" in
*solaris-*)
AC_CHECK_LIB(rt, sched_yield)
;;
esac
AC_CHECK_FUNCS(sched_yield pthread_yield pthread_yield_np)
#
# Additional OS-specific issues related to pthreads and sigwait.
#
case "$host" in
#
# One more place to look for sigwait.
#
*-freebsd*)
AC_CHECK_LIB(c_r, sigwait, AC_DEFINE(HAVE_SIGWAIT),)
case $host in
*-freebsd5.[[012]]|*-freebsd5.[[012]].*);;
*-freebsd5.[[3456789]]|*-freebsd5.[[3456789]].*)
AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
;;
*-freebsd6.*)
AC_DEFINE(NEED_PTHREAD_SCOPE_SYSTEM)
;;
esac
;;
#
# BSDI 3.0 through 4.0.1 needs pthread_init() to be
# called before certain pthreads calls. This is deprecated
# in BSD/OS 4.1.
#
*-bsdi3.*|*-bsdi4.0*)
AC_DEFINE(NEED_PTHREAD_INIT)
;;
#
# LinuxThreads requires some changes to the way we
# deal with signals.
#
*-linux*)
AC_DEFINE(HAVE_LINUXTHREADS)
;;
#
# Ensure the right sigwait() semantics on Solaris and make
# sure we call pthread_setconcurrency.
#
*-solaris*)
AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
AC_CHECK_FUNC(pthread_setconcurrency,
AC_DEFINE(CALL_PTHREAD_SETCONCURRENCY))
;;
#
# UnixWare does things its own way.
#
*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
AC_DEFINE(HAVE_UNIXWARE_SIGWAIT)
;;
esac
# Look for functions relating to thread naming
AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np)
AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>])
#
# Look for sysconf to allow detection of the number of processors.
#
AC_CHECK_FUNC(sysconf, AC_DEFINE(HAVE_SYSCONF),)
AC_SUBST(ALWAYS_DEFINES) AC_SUBST(ALWAYS_DEFINES)
AC_SUBST(ISC_PLATFORM_USETHREADS)
AC_SUBST(THREADOPTOBJS) AC_SUBST(THREADOPTOBJS)
AC_SUBST(THREADOPTSRCS) AC_SUBST(THREADOPTSRCS)
ISC_THREAD_DIR=$thread_dir ISC_THREAD_DIR=$thread_dir
@@ -1862,20 +1949,6 @@ AC_CHECK_LIB(scf, smf_enable_instance)
AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),) AC_CHECK_FUNC(flockfile, AC_DEFINE(HAVE_FLOCKFILE),)
AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),) AC_CHECK_FUNC(getc_unlocked, AC_DEFINE(HAVE_GETCUNLOCKED),)
#
# Indicate what the final decision was regarding threads.
#
AC_MSG_CHECKING(whether to build with threads)
if $use_threads; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
#
# End of pthreads stuff.
#
# #
# Large File # Large File
# #
@@ -3393,52 +3466,49 @@ fi
# #
# CPU relax (for spin locks) # CPU relax (for spin locks)
# #
if $use_threads case "$host" in
then [i[3456]86-*])
case "$host" in # x86_32
[i[3456]86-*]) AC_MSG_CHECKING([if asm("rep; nop"); works])
# x86_32 AC_TRY_COMPILE(,[asm("rep; nop");],
AC_MSG_CHECKING([if asm("rep; nop"); works]) [AC_MSG_RESULT(yes)
AC_TRY_COMPILE(,[asm("rep; nop");], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"],
[AC_MSG_RESULT(yes) [AC_MSG_RESULT(no)],
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], [AC_MSG_RESULT([cross compile, assume yes])
[AC_MSG_RESULT(no)], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"])
[AC_MSG_RESULT([cross compile, assume yes]) ;;
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) x86_64-*|amd64-*)
;; # x86_64
x86_64-*|amd64-*) AC_MSG_CHECKING([if asm("rep; nop"); works])
# x86_64 AC_TRY_COMPILE(,[asm("rep; nop");],
AC_MSG_CHECKING([if asm("rep; nop"); works]) [AC_MSG_RESULT(yes)
AC_TRY_COMPILE(,[asm("rep; nop");], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"],
[AC_MSG_RESULT(yes) [AC_MSG_RESULT(no)],
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"], [AC_MSG_RESULT([cross compile, assume yes])
[AC_MSG_RESULT(no)], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"])
[AC_MSG_RESULT([cross compile, assume yes]) ;;
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"rep; nop\")"]) ia64-*)
;; # ia64
ia64-*) AC_MSG_CHECKING([if asm("hint @pause"); works])
# ia64 AC_TRY_COMPILE(,[asm("hint @pause");],
AC_MSG_CHECKING([if asm("hint @pause"); works]) [AC_MSG_RESULT(yes)
AC_TRY_COMPILE(,[asm("hint @pause");], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"],
[AC_MSG_RESULT(yes) [AC_MSG_RESULT(no)],
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"], [AC_MSG_RESULT([cross compile, assume yes])
[AC_MSG_RESULT(no)], ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"])
[AC_MSG_RESULT([cross compile, assume yes]) ;;
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP asm(\"hint @pause\")"]) sparc-*)
;; # sparc
sparc-*) AC_MSG_CHECKING([if cpu_relax(); or __cpu_relax(); works])
# sparc AC_CHECK_FUNC(cpu_relax,
AC_MSG_CHECKING([if cpu_relax(); or __cpu_relax(); works]) [AC_MSG_RESULT(yes)
AC_CHECK_FUNC(cpu_relax, ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"],
[AC_MSG_RESULT(yes) [AC_CHECK_FUNC(__cpu_relax,
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP cpu_relax()"], [AC_MSG_RESULT(yes)
[AC_CHECK_FUNC(__cpu_relax, ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"],
[AC_MSG_RESULT(yes) [AC_MSG_RESULT(no)])])
ISC_PLATFORM_BUSYWAITNOP="#define ISC_PLATFORM_BUSYWAITNOP __cpu_relax()"], ;;
[AC_MSG_RESULT(no)])]) esac
;;
esac
fi
AC_SUBST(ISC_PLATFORM_BUSYWAITNOP) AC_SUBST(ISC_PLATFORM_BUSYWAITNOP)
@@ -3573,9 +3643,6 @@ DNSTAPOBJS=
DNSTAPTARGETS= DNSTAPTARGETS=
DNSTAP_PB_C_H= DNSTAP_PB_C_H=
if test "x$use_dnstap" != "xno"; then if test "x$use_dnstap" != "xno"; then
if ! $use_threads; then
AC_MSG_ERROR([Dnstap requires threads.])
fi
AC_ARG_WITH([protobuf-c], AC_ARG_WITH([protobuf-c],
AS_HELP_STRING([--with-protobuf-c=path], AS_HELP_STRING([--with-protobuf-c=path],
[Path where protobuf-c is installed, for dnstap]), [ [Path where protobuf-c is installed, for dnstap]), [
@@ -3947,9 +4014,6 @@ AC_ARG_WITH(tuning,
case "$use_tuning" in case "$use_tuning" in
large) large)
if ! $use_threads; then
AC_MSG_ERROR([Large-system tuning requires threads.])
fi
AC_DEFINE(TUNE_LARGE, 1, [Define to use large-system tuning.]) AC_DEFINE(TUNE_LARGE, 1, [Define to use large-system tuning.])
AC_MSG_RESULT(using large-system tuning) AC_MSG_RESULT(using large-system tuning)
;; ;;
@@ -4569,11 +4633,8 @@ report() {
echo "Configuration summary:" echo "Configuration summary:"
echo "-------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------"
echo "Optional features enabled:" echo "Optional features enabled:"
if $use_threads; then if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
echo " Multiprocessing support (--enable-threads)" echo " Mutex lock type: $locktype"
if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
echo " Mutex lock type: $locktype"
fi
fi fi
test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)" test "large" = "$use_tuning" && echo " Large-system tuning (--with-tuning)"
test "no" = "$use_dnstap" || \ test "no" = "$use_dnstap" || \
@@ -4638,7 +4699,6 @@ report() {
echo "-------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------"
echo "Features disabled or unavailable on this platform:" echo "Features disabled or unavailable on this platform:"
$use_threads || echo " Multiprocessing support (--enable-threads)"
test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \ test "no" = "$enable_ipv6" -o "no" = "$found_ipv6" && \
echo " IPv6 support (--enable-ipv6)" echo " IPv6 support (--enable-ipv6)"
test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)" test "large" = "$use_tuning" || echo " Large-system tuning (--with-tuning)"
-4
View File
@@ -66,11 +66,7 @@
static dns_sdlzimplementation_t *dlz_bdb = NULL; static dns_sdlzimplementation_t *dlz_bdb = NULL;
/* should the bdb driver use threads. */ /* should the bdb driver use threads. */
#ifdef ISC_PLATFORM_USETHREADS
#define bdb_threads DB_THREAD #define bdb_threads DB_THREAD
#else
#define bdb_threads 0
#endif
/* BDB database names */ /* BDB database names */
#define dlz_data "dns_data" #define dlz_data "dns_data"
-4
View File
@@ -66,11 +66,7 @@
static dns_sdlzimplementation_t *dlz_bdbhpt = NULL; static dns_sdlzimplementation_t *dlz_bdbhpt = NULL;
/* should the bdb driver use threads. */ /* should the bdb driver use threads. */
#ifdef ISC_PLATFORM_USETHREADS
#define bdbhpt_threads DB_THREAD #define bdbhpt_threads DB_THREAD
#else
#define bdbhpt_threads 0
#endif
/* bdbhpt database names */ /* bdbhpt database names */
#define dlz_data "dns_data" #define dlz_data "dns_data"
-80
View File
@@ -93,11 +93,7 @@ static dns_sdlzimplementation_t *dlz_ldap = NULL;
*/ */
typedef struct { typedef struct {
#ifdef ISC_PLATFORM_USETHREADS
db_list_t *db; /*%< handle to a list of DB */ db_list_t *db; /*%< handle to a list of DB */
#else
dbinstance_t *db; /*%< handle to db */
#endif
int method; /*%< security authentication method */ int method; /*%< security authentication method */
char *user; /*%< who is authenticating */ char *user; /*%< who is authenticating */
char *cred; /*%< password for simple authentication method */ char *cred; /*%< password for simple authentication method */
@@ -243,9 +239,6 @@ dlz_ldap_connect(ldap_instance_t *dbi, dbinstance_t *dbc) {
return (result); return (result);
} }
#ifdef ISC_PLATFORM_USETHREADS
/*% /*%
* Properly cleans up a list of database instances. * Properly cleans up a list of database instances.
* This function is only used when the driver is compiled for * This function is only used when the driver is compiled for
@@ -315,7 +308,6 @@ ldap_find_avail_conn(db_list_t *dblist) {
count); count);
return (NULL); return (NULL);
} }
#endif /* ISC_PLATFORM_USETHREADS */
static isc_result_t static isc_result_t
ldap_process_results(LDAP *dbc, LDAPMessage *msg, char ** attrs, ldap_process_results(LDAP *dbc, LDAPMessage *msg, char ** attrs,
@@ -568,22 +560,10 @@ ldap_get_results(const char *zone, const char *record,
int entries; int entries;
/* get db instance / connection */ /* get db instance / connection */
#ifdef ISC_PLATFORM_USETHREADS
/* find an available DBI from the list */ /* find an available DBI from the list */
dbi = ldap_find_avail_conn((db_list_t *) dbi = ldap_find_avail_conn((db_list_t *)
((ldap_instance_t *)dbdata)->db); ((ldap_instance_t *)dbdata)->db);
#else /* ISC_PLATFORM_USETHREADS */
/*
* only 1 DBI - no need to lock instance lock either
* only 1 thread in the whole process, no possible contention.
*/
dbi = (dbinstance_t *) ((ldap_instance_t *)dbdata)->db;
#endif /* ISC_PLATFORM_USETHREADS */
/* if DBI is null, can't do anything else */ /* if DBI is null, can't do anything else */
if (dbi == NULL) if (dbi == NULL)
return (ISC_R_FAILURE); return (ISC_R_FAILURE);
@@ -844,13 +824,9 @@ ldap_get_results(const char *zone, const char *record,
if (dbi->client != NULL) if (dbi->client != NULL)
isc_mem_free(named_g_mctx, dbi->client); isc_mem_free(named_g_mctx, dbi->client);
#ifdef ISC_PLATFORM_USETHREADS
/* release the lock so another thread can use this dbi */ /* release the lock so another thread can use this dbi */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif /* ISC_PLATFORM_USETHREADS */
/* release query string */ /* release query string */
if (querystring != NULL) if (querystring != NULL)
isc_mem_free(named_g_mctx, querystring ); isc_mem_free(named_g_mctx, querystring );
@@ -938,30 +914,19 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
dbinstance_t *dbi = NULL; dbinstance_t *dbi = NULL;
int protocol; int protocol;
int method; int method;
#ifdef ISC_PLATFORM_USETHREADS
/* if multi-threaded, we need a few extra variables. */
int dbcount; int dbcount;
char *endp; char *endp;
/* db_list_t *dblist = NULL; */ /* db_list_t *dblist = NULL; */
int i; int i;
#endif /* ISC_PLATFORM_USETHREADS */
UNUSED(dlzname); UNUSED(dlzname);
UNUSED(driverarg); UNUSED(driverarg);
#ifdef ISC_PLATFORM_USETHREADS
/* if debugging, let user know we are multithreaded. */ /* if debugging, let user know we are multithreaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"LDAP driver running multithreaded"); "LDAP driver running multithreaded");
#else /* ISC_PLATFORM_USETHREADS */
/* if debugging, let user know we are single threaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"LDAP driver running single threaded");
#endif /* ISC_PLATFORM_USETHREADS */
if (argc < 9) { if (argc < 9) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
@@ -1009,9 +974,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
return (ISC_R_FAILURE); return (ISC_R_FAILURE);
} }
/* multithreaded build can have multiple DB connections */
#ifdef ISC_PLATFORM_USETHREADS
/* check how many db connections we should create */ /* check how many db connections we should create */
dbcount = strtol(argv[1], &endp, 10); dbcount = strtol(argv[1], &endp, 10);
if (*endp != '\0' || dbcount < 0) { if (*endp != '\0' || dbcount < 0) {
@@ -1021,7 +983,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
"must be positive."); "must be positive.");
return (ISC_R_FAILURE); return (ISC_R_FAILURE);
} }
#endif
/* check that LDAP URL parameters make sense */ /* check that LDAP URL parameters make sense */
switch(argc) { switch(argc) {
@@ -1077,7 +1038,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
goto cleanup; goto cleanup;
} }
#ifdef ISC_PLATFORM_USETHREADS
/* allocate memory for database connection list */ /* allocate memory for database connection list */
ldap_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); ldap_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t));
if (ldap_inst->db == NULL) { if (ldap_inst->db == NULL) {
@@ -1094,8 +1054,6 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
*/ */
for (i = 0; i < dbcount; i++) { for (i = 0; i < dbcount; i++) {
#endif /* ISC_PLATFORM_USETHREADS */
/* how many queries were passed in from config file? */ /* how many queries were passed in from config file? */
switch(argc) { switch(argc) {
case 9: case 9:
@@ -1137,18 +1095,9 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
goto cleanup; goto cleanup;
} }
#ifdef ISC_PLATFORM_USETHREADS
/* when multithreaded, build a list of DBI's */
ISC_LINK_INIT(dbi, link); ISC_LINK_INIT(dbi, link);
ISC_LIST_APPEND(*(ldap_inst->db), dbi, link); ISC_LIST_APPEND(*(ldap_inst->db), dbi, link);
#else
/*
* when single threaded, hold onto the one connection
* instance.
*/
ldap_inst->db = dbi;
#endif
/* attempt to connect */ /* attempt to connect */
result = dlz_ldap_connect(ldap_inst, dbi); result = dlz_ldap_connect(ldap_inst, dbi);
@@ -1165,18 +1114,11 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
* allocate memory * allocate memory
*/ */
case ISC_R_NOMEMORY: case ISC_R_NOMEMORY:
#ifdef ISC_PLATFORM_USETHREADS
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"LDAP driver could not allocate memory " "LDAP driver could not allocate memory "
"for connection number %u", "for connection number %u",
i+1); i+1);
#else
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"LDAP driver could not allocate memory "
"for connection");
#endif
goto cleanup; goto cleanup;
break; break;
/* /*
@@ -1193,18 +1135,11 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
break; break;
/* failure means couldn't connect to ldap server */ /* failure means couldn't connect to ldap server */
case ISC_R_FAILURE: case ISC_R_FAILURE:
#ifdef ISC_PLATFORM_USETHREADS
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR, DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"LDAP driver could not " "LDAP driver could not "
"bind connection number %u to server.", "bind connection number %u to server.",
i+1); i+1);
#else
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"LDAP driver could not "
"bind connection to server.");
#endif
goto cleanup; goto cleanup;
break; break;
/* /*
@@ -1220,15 +1155,10 @@ dlz_ldap_create(const char *dlzname, unsigned int argc, char *argv[],
break; break;
} /* end switch(result) */ } /* end switch(result) */
#ifdef ISC_PLATFORM_USETHREADS
/* set DBI = null for next loop through. */ /* set DBI = null for next loop through. */
dbi = NULL; dbi = NULL;
} /* end for loop */ } /* end for loop */
#endif /* ISC_PLATFORM_USETHREADS */
/* set dbdata to the ldap_instance we created. */ /* set dbdata to the ldap_instance we created. */
*dbdata = ldap_inst; *dbdata = ldap_inst;
@@ -1247,20 +1177,10 @@ dlz_ldap_destroy(void *driverarg, void *dbdata) {
UNUSED(driverarg); UNUSED(driverarg);
if (dbdata != NULL) { if (dbdata != NULL) {
#ifdef ISC_PLATFORM_USETHREADS
/* cleanup the list of DBI's */ /* cleanup the list of DBI's */
ldap_destroy_dblist((db_list_t *) ldap_destroy_dblist((db_list_t *)
((ldap_instance_t *)dbdata)->db); ((ldap_instance_t *)dbdata)->db);
#else /* ISC_PLATFORM_USETHREADS */
if (((ldap_instance_t *)dbdata)->db->dbconn != NULL)
ldap_unbind_s((LDAP *)
((ldap_instance_t *)dbdata)->db->dbconn);
/* destroy single DB instance */
destroy_sqldbinstance(((ldap_instance_t *)dbdata)->db);
#endif /* ISC_PLATFORM_USETHREADS */
if (((ldap_instance_t *)dbdata)->hosts != NULL) if (((ldap_instance_t *)dbdata)->hosts != NULL)
isc_mem_free(named_g_mctx, isc_mem_free(named_g_mctx,
((ldap_instance_t *)dbdata)->hosts); ((ldap_instance_t *)dbdata)->hosts);
-114
View File
@@ -99,17 +99,7 @@ typedef struct{
*/ */
typedef struct { typedef struct {
#ifdef ISC_PLATFORM_USETHREADS
db_list_t *db; /* handle to a list of DB */ db_list_t *db; /* handle to a list of DB */
#else
dbinstance_t *db; /* handle to db */
#endif
SQLHENV sql_env; /* handle to SQL environment */ SQLHENV sql_env; /* handle to SQL environment */
SQLCHAR *dsn; SQLCHAR *dsn;
SQLCHAR *user; SQLCHAR *user;
@@ -136,9 +126,6 @@ safeLen(void *a) {
static void static void
destroy_odbc_instance(odbc_instance_t *odbc_inst) { destroy_odbc_instance(odbc_instance_t *odbc_inst) {
#ifdef ISC_PLATFORM_USETHREADS
dbinstance_t *ndbi = NULL; dbinstance_t *ndbi = NULL;
dbinstance_t *dbi = NULL; dbinstance_t *dbi = NULL;
@@ -180,34 +167,6 @@ destroy_odbc_instance(odbc_instance_t *odbc_inst) {
/* release memory for the list structure */ /* release memory for the list structure */
isc_mem_put(named_g_mctx, odbc_inst->db, sizeof(db_list_t)); isc_mem_put(named_g_mctx, odbc_inst->db, sizeof(db_list_t));
#else /* ISC_PLATFORM_USETHREADS */
/* free statement handle */
if (((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt != NULL) {
SQLFreeHandle(SQL_HANDLE_STMT,
((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt);
((odbc_db_t *) (odbc_inst->db->dbconn))->stmnt = NULL;
}
/* disconnect from database, free connection handle */
if (((odbc_db_t *) (odbc_inst->db->dbconn))->dbc != NULL) {
SQLDisconnect(((odbc_db_t *) (odbc_inst->db->dbconn))->dbc);
SQLFreeHandle(SQL_HANDLE_DBC,
((odbc_db_t *) (odbc_inst->db->dbconn))->dbc);
((odbc_db_t *) (odbc_inst->db->dbconn))->dbc = NULL;
}
/* free mem for the odbc_db_t structure held in db */
if (((odbc_db_t *) odbc_inst->db->dbconn) != NULL) {
isc_mem_free(named_g_mctx, odbc_inst->db->dbconn);
odbc_inst->db->dbconn = NULL;
}
if (odbc_inst->db != NULL)
destroy_sqldbinstance(odbc_inst->db);
#endif /* ISC_PLATFORM_USETHREADS */
/* free sql environment */ /* free sql environment */
if (odbc_inst->sql_env != NULL) if (odbc_inst->sql_env != NULL)
SQLFreeHandle(SQL_HANDLE_ENV, odbc_inst->sql_env); SQLFreeHandle(SQL_HANDLE_ENV, odbc_inst->sql_env);
@@ -327,8 +286,6 @@ odbc_connect(odbc_instance_t *dbi, odbc_db_t **dbc) {
* multithreaded operation. * multithreaded operation.
*/ */
#ifdef ISC_PLATFORM_USETHREADS
static dbinstance_t * static dbinstance_t *
odbc_find_avail_conn(db_list_t *dblist) odbc_find_avail_conn(db_list_t *dblist)
{ {
@@ -362,8 +319,6 @@ odbc_find_avail_conn(db_list_t *dblist)
return NULL; return NULL;
} }
#endif /* ISC_PLATFORM_USETHREADS */
/*% Allocates memory for a new string, and then constructs the new /*% Allocates memory for a new string, and then constructs the new
* string by "escaping" the input string. The new string is * string by "escaping" the input string. The new string is
* safe to be used in queries. This is necessary because we cannot * safe to be used in queries. This is necessary because we cannot
@@ -482,21 +437,10 @@ odbc_get_resultset(const char *zone, const char *record,
REQUIRE(*r_dbi == NULL); REQUIRE(*r_dbi == NULL);
/* get db instance / connection */ /* get db instance / connection */
#ifdef ISC_PLATFORM_USETHREADS
/* find an available DBI from the list */ /* find an available DBI from the list */
dbi = odbc_find_avail_conn(((odbc_instance_t *) dbdata)->db); dbi = odbc_find_avail_conn(((odbc_instance_t *) dbdata)->db);
#else /* ISC_PLATFORM_USETHREADS */
/*
* only 1 DBI - no need to lock instance lock either
* only 1 thread in the whole process, no possible contention.
*/
dbi = (dbinstance_t *) ((odbc_instance_t *) dbdata)->db;
#endif /* ISC_PLATFORM_USETHREADS */
/* if DBI is null, can't do anything else */ /* if DBI is null, can't do anything else */
if (dbi == NULL) { if (dbi == NULL) {
result = ISC_R_FAILURE; result = ISC_R_FAILURE;
@@ -698,14 +642,10 @@ odbc_get_resultset(const char *zone, const char *record,
if (dbi->client != NULL) if (dbi->client != NULL)
isc_mem_free(named_g_mctx, dbi->client); isc_mem_free(named_g_mctx, dbi->client);
#ifdef ISC_PLATFORM_USETHREADS
/* if we are done using this dbi, release the lock */ /* if we are done using this dbi, release the lock */
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif /* ISC_PLATFORM_USETHREADS */
/* release query string */ /* release query string */
if (querystring != NULL) if (querystring != NULL)
isc_mem_free(named_g_mctx, querystring ); isc_mem_free(named_g_mctx, querystring );
@@ -937,13 +877,9 @@ odbc_process_rs(dns_sdlzlookup_t *lookup, dbinstance_t *dbi)
/* close cursor */ /* close cursor */
SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt);
#ifdef ISC_PLATFORM_USETHREADS
/* free lock on dbi so someone else can use it. */ /* free lock on dbi so someone else can use it. */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif
return result; return result;
} }
@@ -980,11 +916,8 @@ odbc_findzone(void *driverarg, void *dbdata, const char *name,
/* get rid of result set, we are done with it. */ /* get rid of result set, we are done with it. */
SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt);
#ifdef ISC_PLATFORM_USETHREADS
/* free lock on dbi so someone else can use it. */ /* free lock on dbi so someone else can use it. */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif
} }
return result; return result;
@@ -1032,11 +965,8 @@ odbc_allowzonexfr(void *driverarg, void *dbdata, const char *name,
/* get rid of result set, we are done with it. */ /* get rid of result set, we are done with it. */
SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt);
#ifdef ISC_PLATFORM_USETHREADS
/* free lock on dbi so someone else can use it. */ /* free lock on dbi so someone else can use it. */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif
} }
@@ -1167,13 +1097,9 @@ odbc_allnodes(const char *zone, void *driverarg, void *dbdata,
/* close cursor */ /* close cursor */
SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt); SQLCloseCursor(((odbc_db_t *) (dbi->dbconn))->stmnt);
#ifdef ISC_PLATFORM_USETHREADS
/* free lock on dbi so someone else can use it. */ /* free lock on dbi so someone else can use it. */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif
return result; return result;
} }
@@ -1252,29 +1178,17 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
odbc_instance_t *odbc_inst = NULL; odbc_instance_t *odbc_inst = NULL;
dbinstance_t *db = NULL; dbinstance_t *db = NULL;
SQLRETURN sqlRes; SQLRETURN sqlRes;
#ifdef ISC_PLATFORM_USETHREADS
/* if multi-threaded, we need a few extra variables. */
int dbcount; int dbcount;
int i; int i;
char *endp; char *endp;
#endif /* ISC_PLATFORM_USETHREADS */
UNUSED(dlzname); UNUSED(dlzname);
UNUSED(driverarg); UNUSED(driverarg);
#ifdef ISC_PLATFORM_USETHREADS
/* if debugging, let user know we are multithreaded. */ /* if debugging, let user know we are multithreaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"Odbc driver running multithreaded"); "Odbc driver running multithreaded");
#else /* ISC_PLATFORM_USETHREADS */
/* if debugging, let user know we are single threaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"Odbc driver running single threaded");
#endif /* ISC_PLATFORM_USETHREADS */
/* verify we have at least 5 arg's passed to the driver */ /* verify we have at least 5 arg's passed to the driver */
if (argc < 5) { if (argc < 5) {
@@ -1295,8 +1209,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
} }
/* multithreaded build can have multiple DB connections */ /* multithreaded build can have multiple DB connections */
#ifdef ISC_PLATFORM_USETHREADS
/* check how many db connections we should create */ /* check how many db connections we should create */
dbcount = strtol(argv[1], &endp, 10); dbcount = strtol(argv[1], &endp, 10);
if (*endp != '\0' || dbcount < 0) { if (*endp != '\0' || dbcount < 0) {
@@ -1307,8 +1219,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
return (ISC_R_FAILURE); return (ISC_R_FAILURE);
} }
#endif /* ISC_PLATFORM_USETHREADS */
/* allocate memory for odbc instance */ /* allocate memory for odbc instance */
odbc_inst = isc_mem_get(named_g_mctx, sizeof(odbc_instance_t)); odbc_inst = isc_mem_get(named_g_mctx, sizeof(odbc_instance_t));
if (odbc_inst == NULL) if (odbc_inst == NULL)
@@ -1361,8 +1271,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
} }
} }
#ifdef ISC_PLATFORM_USETHREADS
/* allocate memory for database connection list */ /* allocate memory for database connection list */
odbc_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t)); odbc_inst->db = isc_mem_get(named_g_mctx, sizeof(db_list_t));
if (odbc_inst->db == NULL) { if (odbc_inst->db == NULL) {
@@ -1378,8 +1286,6 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
/* append each new DBI to the end of the list */ /* append each new DBI to the end of the list */
for (i=0; i < dbcount; i++) { for (i=0; i < dbcount; i++) {
#endif /* ISC_PLATFORM_USETHREADS */
/* how many queries were passed in from config file? */ /* how many queries were passed in from config file? */
switch(argc) { switch(argc) {
case 5: case 5:
@@ -1416,20 +1322,14 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
goto cleanup; goto cleanup;
} }
#ifdef ISC_PLATFORM_USETHREADS
/* when multithreaded, build a list of DBI's */ /* when multithreaded, build a list of DBI's */
ISC_LINK_INIT(db, link); ISC_LINK_INIT(db, link);
ISC_LIST_APPEND(*odbc_inst->db, db, link); ISC_LIST_APPEND(*odbc_inst->db, db, link);
#endif
result = odbc_connect(odbc_inst, (odbc_db_t **) &(db->dbconn)); result = odbc_connect(odbc_inst, (odbc_db_t **) &(db->dbconn));
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* if multi threaded, let user know which * if multi threaded, let user know which
* connection failed. user could be * connection failed. user could be
@@ -1442,28 +1342,14 @@ odbc_create(const char *dlzname, unsigned int argc, char *argv[],
"Odbc driver failed to create database " "Odbc driver failed to create database "
"connection number %u after 3 attempts", "connection number %u after 3 attempts",
i+1); i+1);
#else
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"Odbc driver failed to create database "
"connection after 3 attempts");
#endif
goto cleanup; goto cleanup;
} }
#ifdef ISC_PLATFORM_USETHREADS
/* set DB = null for next loop through. */ /* set DB = null for next loop through. */
db = NULL; db = NULL;
} /* end for loop */ } /* end for loop */
#else
/* tell odbc_inst about the db connection we just created. */
odbc_inst->db = db;
#endif
/* set dbdata to the odbc_instance we created. */ /* set dbdata to the odbc_instance we created. */
*dbdata = odbc_inst; *dbdata = odbc_inst;
-82
View File
@@ -149,8 +149,6 @@ postgres_makesafe(char *to, const char *from, size_t length)
return target - to; return target - to;
} }
#ifdef ISC_PLATFORM_USETHREADS
/*% /*%
* Properly cleans up a list of database instances. * Properly cleans up a list of database instances.
* This function is only used when the driver is compiled for * This function is only used when the driver is compiled for
@@ -225,8 +223,6 @@ postgres_find_avail_conn(db_list_t *dblist)
return NULL; return NULL;
} }
#endif /* ISC_PLATFORM_USETHREADS */
/*% /*%
* Allocates memory for a new string, and then constructs the new * Allocates memory for a new string, and then constructs the new
* string by "escaping" the input string. The new string is * string by "escaping" the input string. The new string is
@@ -298,21 +294,10 @@ postgres_get_resultset(const char *zone, const char *record,
#endif #endif
/* get db instance / connection */ /* get db instance / connection */
#ifdef ISC_PLATFORM_USETHREADS
/* find an available DBI from the list */ /* find an available DBI from the list */
dbi = postgres_find_avail_conn((db_list_t *) dbdata); dbi = postgres_find_avail_conn((db_list_t *) dbdata);
#else /* ISC_PLATFORM_USETHREADS */
/*
* only 1 DBI - no need to lock instance lock either
* only 1 thread in the whole process, no possible contention.
*/
dbi = (dbinstance_t *) dbdata;
#endif /* ISC_PLATFORM_USETHREADS */
#if 0 #if 0
/* temporary logging message */ /* temporary logging message */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
@@ -599,8 +584,6 @@ postgres_get_resultset(const char *zone, const char *record,
if (dbi->client != NULL) if (dbi->client != NULL)
isc_mem_free(named_g_mctx, dbi->client); isc_mem_free(named_g_mctx, dbi->client);
#ifdef ISC_PLATFORM_USETHREADS
#if 0 #if 0
/* temporary logging message */ /* temporary logging message */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
@@ -611,8 +594,6 @@ postgres_get_resultset(const char *zone, const char *record,
/* release the lock so another thread can use this dbi */ /* release the lock so another thread can use this dbi */
isc_mutex_unlock(&dbi->instance_lock); isc_mutex_unlock(&dbi->instance_lock);
#endif /* ISC_PLATFORM_USETHREADS */
/* release query string */ /* release query string */
if (querystring != NULL) if (querystring != NULL)
isc_mem_free(named_g_mctx, querystring ); isc_mem_free(named_g_mctx, querystring );
@@ -1058,15 +1039,12 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
dbinstance_t *dbi = NULL; dbinstance_t *dbi = NULL;
unsigned int j; unsigned int j;
#ifdef ISC_PLATFORM_USETHREADS
/* if multi-threaded, we need a few extra variables. */ /* if multi-threaded, we need a few extra variables. */
int dbcount; int dbcount;
db_list_t *dblist = NULL; db_list_t *dblist = NULL;
int i; int i;
char *endp; char *endp;
#endif /* ISC_PLATFORM_USETHREADS */
UNUSED(driverarg); UNUSED(driverarg);
UNUSED(dlzname); UNUSED(dlzname);
@@ -1074,17 +1052,10 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
srand( (unsigned)time( NULL ) ); srand( (unsigned)time( NULL ) );
#ifdef ISC_PLATFORM_USETHREADS
/* if debugging, let user know we are multithreaded. */ /* if debugging, let user know we are multithreaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1), DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"Postgres driver running multithreaded"); "Postgres driver running multithreaded");
#else /* ISC_PLATFORM_USETHREADS */
/* if debugging, let user know we are single threaded. */
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(1),
"Postgres driver running single threaded");
#endif /* ISC_PLATFORM_USETHREADS */
/* verify we have at least 5 arg's passed to the driver */ /* verify we have at least 5 arg's passed to the driver */
if (argc < 5) { if (argc < 5) {
@@ -1105,7 +1076,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
} }
/* multithreaded build can have multiple DB connections */ /* multithreaded build can have multiple DB connections */
#ifdef ISC_PLATFORM_USETHREADS
/* check how many db connections we should create */ /* check how many db connections we should create */
dbcount = strtol(argv[1], &endp, 10); dbcount = strtol(argv[1], &endp, 10);
@@ -1131,8 +1101,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
*/ */
for (i=0; i < dbcount; i++) { for (i=0; i < dbcount; i++) {
#endif /* ISC_PLATFORM_USETHREADS */
/* how many queries were passed in from config file? */ /* how many queries were passed in from config file? */
switch(argc) { switch(argc) {
case 5: case 5:
@@ -1174,14 +1142,10 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
goto cleanup; goto cleanup;
} }
#ifdef ISC_PLATFORM_USETHREADS
/* when multithreaded, build a list of DBI's */ /* when multithreaded, build a list of DBI's */
ISC_LINK_INIT(dbi, link); ISC_LINK_INIT(dbi, link);
ISC_LIST_APPEND(*dblist, dbi, link); ISC_LIST_APPEND(*dblist, dbi, link);
#endif
/* create and set db connection */ /* create and set db connection */
dbi->dbconn = PQconnectdb(argv[2]); dbi->dbconn = PQconnectdb(argv[2]);
/* /*
@@ -1204,8 +1168,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
PQreset((PGconn *) dbi->dbconn); PQreset((PGconn *) dbi->dbconn);
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* if multi threaded, let user know which connection * if multi threaded, let user know which connection
* failed. user could be attempting to create 10 db * failed. user could be attempting to create 10 db
@@ -1229,30 +1191,11 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
/* set dbdata to the list we created. */ /* set dbdata to the list we created. */
*dbdata = dblist; *dbdata = dblist;
#else /* ISC_PLATFORM_USETHREADS */
/* if single threaded, just let user know we couldn't connect. */
if (PQstatus((PGconn *) dbi->dbconn) != CONNECTION_OK) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
"Postgres driver failed to create database "
"connection after 4 attempts");
goto cleanup;
}
/*
* single threaded build can only use 1 db connection, return
* it via dbdata
*/
*dbdata = dbi;
#endif /* ISC_PLATFORM_USETHREADS */
/* hey, we got through all of that ok, return success. */ /* hey, we got through all of that ok, return success. */
return(ISC_R_SUCCESS); return(ISC_R_SUCCESS);
cleanup: cleanup:
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* if multithreaded, we could fail because only 1 connection * if multithreaded, we could fail because only 1 connection
* couldn't be made. We should cleanup the other successful * couldn't be made. We should cleanup the other successful
@@ -1260,11 +1203,6 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
*/ */
postgres_destroy_dblist(dblist); postgres_destroy_dblist(dblist);
#else /* ISC_PLATFORM_USETHREADS */
if (dbi != NULL)
destroy_sqldbinstance(dbi);
#endif /* ISC_PLATFORM_USETHREADS */
return(ISC_R_FAILURE); return(ISC_R_FAILURE);
} }
@@ -1277,29 +1215,9 @@ postgres_create(const char *dlzname, unsigned int argc, char *argv[],
static void static void
postgres_destroy(void *driverarg, void *dbdata) postgres_destroy(void *driverarg, void *dbdata)
{ {
#ifdef ISC_PLATFORM_USETHREADS
UNUSED(driverarg); UNUSED(driverarg);
/* cleanup the list of DBI's */ /* cleanup the list of DBI's */
postgres_destroy_dblist((db_list_t *) dbdata); postgres_destroy_dblist((db_list_t *) dbdata);
#else /* ISC_PLATFORM_USETHREADS */
dbinstance_t *dbi;
UNUSED(driverarg);
dbi = (dbinstance_t *) dbdata;
/* release DB connection */
if (dbi->dbconn != NULL)
PQfinish((PGconn *) dbi->dbconn);
/* destroy single DB instance */
destroy_sqldbinstance(dbi);
#endif /* ISC_PLATFORM_USETHREADS */
} }
/* pointers to all our runtime methods. */ /* pointers to all our runtime methods. */
@@ -69,11 +69,7 @@
#include "dlz_minimal.h" #include "dlz_minimal.h"
/* should the bdb driver use threads. */ /* should the bdb driver use threads. */
#ifdef ISC_PLATFORM_USETHREADS
#define bdbhpt_threads DB_THREAD #define bdbhpt_threads DB_THREAD
#else
#define bdbhpt_threads 0
#endif
/* bdbhpt database names */ /* bdbhpt database names */
#define dlz_data "dns_data" #define dlz_data "dns_data"
-8
View File
@@ -1560,11 +1560,7 @@ issymmetric(const dst_key_t *key) {
static void static void
printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) { printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) {
isc_result_t result; isc_result_t result;
#ifdef ISC_PLATFORM_USETHREADS
char output[26]; /* Minimum buffer as per ctime_r() specification. */ char output[26]; /* Minimum buffer as per ctime_r() specification. */
#else
const char *output;
#endif
isc_stdtime_t when; isc_stdtime_t when;
time_t t; time_t t;
char utc[sizeof("YYYYMMDDHHSSMM")]; char utc[sizeof("YYYYMMDDHHSSMM")];
@@ -1577,7 +1573,6 @@ printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) {
/* time_t and isc_stdtime_t might be different sizes */ /* time_t and isc_stdtime_t might be different sizes */
t = when; t = when;
#ifdef ISC_PLATFORM_USETHREADS
#ifdef WIN32 #ifdef WIN32
if (ctime_s(output, sizeof(output), &t) != 0) if (ctime_s(output, sizeof(output), &t) != 0)
goto error; goto error;
@@ -1585,9 +1580,6 @@ printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) {
if (ctime_r(&t, output) == NULL) if (ctime_r(&t, output) == NULL)
goto error; goto error;
#endif #endif
#else
output = ctime(&t);
#endif
isc_buffer_init(&b, utc, sizeof(utc)); isc_buffer_init(&b, utc, sizeof(utc));
result = dns_time32_totext(when, &b); result = dns_time32_totext(when, &b);
-15
View File
@@ -75,7 +75,6 @@ typedef struct geoip_state {
isc_mem_t *mctx; isc_mem_t *mctx;
} geoip_state_t; } geoip_state_t;
#ifdef ISC_PLATFORM_USETHREADS
static isc_mutex_t key_mutex; static isc_mutex_t key_mutex;
static isc_boolean_t state_key_initialized = ISC_FALSE; static isc_boolean_t state_key_initialized = ISC_FALSE;
static isc_thread_key_t state_key; static isc_thread_key_t state_key;
@@ -130,9 +129,6 @@ state_key_init(void) {
return (result); return (result);
} }
#else
static geoip_state_t saved_state;
#endif
static void static void
clean_state(geoip_state_t *state) { clean_state(geoip_state_t *state) {
@@ -162,7 +158,6 @@ set_state(unsigned int family, isc_uint32_t ipnum, const geoipv6_t *ipnum6,
GeoIPRegion *region, char *name, const char *text, int id) GeoIPRegion *region, char *name, const char *text, int id)
{ {
geoip_state_t *state = NULL; geoip_state_t *state = NULL;
#ifdef ISC_PLATFORM_USETHREADS
isc_result_t result; isc_result_t result;
result = state_key_init(); result = state_key_init();
@@ -186,10 +181,6 @@ set_state(unsigned int family, isc_uint32_t ipnum, const geoipv6_t *ipnum6,
isc_mem_attach(state_mctx, &state->mctx); isc_mem_attach(state_mctx, &state->mctx);
} else } else
clean_state(state); clean_state(state);
#else
state = &saved_state;
clean_state(state);
#endif
if (family == AF_INET) { if (family == AF_INET) {
state->ipnum = ipnum; state->ipnum = ipnum;
@@ -215,7 +206,6 @@ get_state_for(unsigned int family, isc_uint32_t ipnum,
{ {
geoip_state_t *state; geoip_state_t *state;
#ifdef ISC_PLATFORM_USETHREADS
isc_result_t result; isc_result_t result;
result = state_key_init(); result = state_key_init();
@@ -225,9 +215,6 @@ get_state_for(unsigned int family, isc_uint32_t ipnum,
state = (geoip_state_t *) isc_thread_key_getspecific(state_key); state = (geoip_state_t *) isc_thread_key_getspecific(state_key);
if (state == NULL) if (state == NULL)
return (NULL); return (NULL);
#else
state = &saved_state;
#endif
if (state->family == family && if (state->family == family &&
((state->family == AF_INET && state->ipnum == ipnum) || ((state->family == AF_INET && state->ipnum == ipnum) ||
@@ -827,10 +814,8 @@ void
dns_geoip_shutdown(void) { dns_geoip_shutdown(void) {
#ifdef HAVE_GEOIP #ifdef HAVE_GEOIP
GeoIP_cleanup(); GeoIP_cleanup();
#ifdef ISC_PLATFORM_USETHREADS
if (state_mctx != NULL) if (state_mctx != NULL)
isc_mem_detach(&state_mctx); isc_mem_detach(&state_mctx);
#endif
#else #else
return; return;
#endif #endif
-19
View File
@@ -163,15 +163,11 @@ LIBDNS_EXTERNAL_DATA const dns_name_t *dns_wildcardname = &wild;
/* /*
* dns_name_t to text post-conversion procedure. * dns_name_t to text post-conversion procedure.
*/ */
#ifdef ISC_PLATFORM_USETHREADS
static int thread_key_initialized = 0; static int thread_key_initialized = 0;
static isc_mutex_t thread_key_mutex; static isc_mutex_t thread_key_mutex;
static isc_mem_t *thread_key_mctx = NULL; static isc_mem_t *thread_key_mctx = NULL;
static isc_thread_key_t totext_filter_proc_key; static isc_thread_key_t totext_filter_proc_key;
static isc_once_t once = ISC_ONCE_INIT; static isc_once_t once = ISC_ONCE_INIT;
#else
static dns_name_totextfilter_t totext_filter_proc = NULL;
#endif
static void static void
set_offsets(const dns_name_t *name, unsigned char *offsets, set_offsets(const dns_name_t *name, unsigned char *offsets,
@@ -1275,7 +1271,6 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source,
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
} }
#ifdef ISC_PLATFORM_USETHREADS
static void static void
free_specific(void *arg) { free_specific(void *arg) {
dns_name_totextfilter_t *mem = arg; dns_name_totextfilter_t *mem = arg;
@@ -1322,7 +1317,6 @@ totext_filter_proc_key_init(void) {
} }
return (result); return (result);
} }
#endif
isc_result_t isc_result_t
dns_name_totext(const dns_name_t *name, isc_boolean_t omit_final_dot, dns_name_totext(const dns_name_t *name, isc_boolean_t omit_final_dot,
@@ -1352,11 +1346,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options,
unsigned int labels; unsigned int labels;
isc_boolean_t saw_root = ISC_FALSE; isc_boolean_t saw_root = ISC_FALSE;
unsigned int oused = target->used; unsigned int oused = target->used;
#ifdef ISC_PLATFORM_USETHREADS
dns_name_totextfilter_t *mem; dns_name_totextfilter_t *mem;
dns_name_totextfilter_t totext_filter_proc = NULL; dns_name_totextfilter_t totext_filter_proc = NULL;
isc_result_t result; isc_result_t result;
#endif
isc_boolean_t omit_final_dot = isc_boolean_t omit_final_dot =
ISC_TF(options & DNS_NAME_OMITFINALDOT); ISC_TF(options & DNS_NAME_OMITFINALDOT);
@@ -1367,11 +1359,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options,
REQUIRE(VALID_NAME(name)); REQUIRE(VALID_NAME(name));
REQUIRE(ISC_BUFFER_VALID(target)); REQUIRE(ISC_BUFFER_VALID(target));
#ifdef ISC_PLATFORM_USETHREADS
result = totext_filter_proc_key_init(); result = totext_filter_proc_key_init();
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
return (result); return (result);
#endif
ndata = name->ndata; ndata = name->ndata;
nlen = name->length; nlen = name->length;
labels = name->labels; labels = name->labels;
@@ -1511,11 +1501,9 @@ dns_name_totext2(const dns_name_t *name, unsigned int options,
} }
isc_buffer_add(target, tlen - trem); isc_buffer_add(target, tlen - trem);
#ifdef ISC_PLATFORM_USETHREADS
mem = isc_thread_key_getspecific(totext_filter_proc_key); mem = isc_thread_key_getspecific(totext_filter_proc_key);
if (mem != NULL) if (mem != NULL)
totext_filter_proc = *mem; totext_filter_proc = *mem;
#endif
if (totext_filter_proc != NULL) if (totext_filter_proc != NULL)
return ((*totext_filter_proc)(target, oused)); return ((*totext_filter_proc)(target, oused));
@@ -2337,7 +2325,6 @@ dns_name_print(const dns_name_t *name, FILE *stream) {
isc_result_t isc_result_t
dns_name_settotextfilter(dns_name_totextfilter_t proc) { dns_name_settotextfilter(dns_name_totextfilter_t proc) {
#ifdef ISC_PLATFORM_USETHREADS
isc_result_t result; isc_result_t result;
dns_name_totextfilter_t *mem; dns_name_totextfilter_t *mem;
int res; int res;
@@ -2373,10 +2360,6 @@ dns_name_settotextfilter(dns_name_totextfilter_t proc) {
result = ISC_R_UNEXPECTED; result = ISC_R_UNEXPECTED;
} }
return (result); return (result);
#else
totext_filter_proc = proc;
return (ISC_R_SUCCESS);
#endif
} }
void void
@@ -2526,7 +2509,6 @@ dns_name_copy(const dns_name_t *source, dns_name_t *dest, isc_buffer_t *target)
void void
dns_name_destroy(void) { dns_name_destroy(void) {
#ifdef ISC_PLATFORM_USETHREADS
RUNTIME_CHECK(isc_once_do(&once, thread_key_mutex_init) RUNTIME_CHECK(isc_once_do(&once, thread_key_mutex_init)
== ISC_R_SUCCESS); == ISC_R_SUCCESS);
@@ -2538,7 +2520,6 @@ dns_name_destroy(void) {
} }
UNLOCK(&thread_key_mutex); UNLOCK(&thread_key_mutex);
#endif
} }
/* /*
-4
View File
@@ -9843,7 +9843,6 @@ dns_resolver_create(dns_view_t *view,
} }
res->buckets[i].mctx = NULL; res->buckets[i].mctx = NULL;
snprintf(name, sizeof(name), "res%u", i); snprintf(name, sizeof(name), "res%u", i);
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Use a separate memory context for each bucket to reduce * Use a separate memory context for each bucket to reduce
* contention among multiple threads. Do this only when * contention among multiple threads. Do this only when
@@ -9856,9 +9855,6 @@ dns_resolver_create(dns_view_t *view,
goto cleanup_buckets; goto cleanup_buckets;
} }
isc_mem_setname(res->buckets[i].mctx, name, NULL); isc_mem_setname(res->buckets[i].mctx, name, NULL);
#else
isc_mem_attach(view->mctx, &res->buckets[i].mctx);
#endif
isc_task_setname(res->buckets[i].task, name, res); isc_task_setname(res->buckets[i].task, name, res);
ISC_LIST_INIT(res->buckets[i].fctxs); ISC_LIST_INIT(res->buckets[i].fctxs);
res->buckets[i].exiting = ISC_FALSE; res->buckets[i].exiting = ISC_FALSE;
-4
View File
@@ -90,11 +90,7 @@ cleanup_managers(void) {
static isc_result_t static isc_result_t
create_managers(void) { create_managers(void) {
isc_result_t result; isc_result_t result;
#ifdef ISC_PLATFORM_USETHREADS
ncpus = isc_os_ncpus(); ncpus = isc_os_ncpus();
#else
ncpus = 1;
#endif
CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr)); CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr));
CHECK(isc_timermgr_create(mctx, &timermgr)); CHECK(isc_timermgr_create(mctx, &timermgr));
-4
View File
@@ -646,7 +646,6 @@ ATF_TC_BODY(getlabelsequence, tc) {
} }
} }
#ifdef ISC_PLATFORM_USETHREADS
#ifdef DNS_BENCHMARK_TESTS #ifdef DNS_BENCHMARK_TESTS
/* /*
@@ -742,7 +741,6 @@ ATF_TC_BODY(benchmark, tc) {
} }
#endif /* DNS_BENCHMARK_TESTS */ #endif /* DNS_BENCHMARK_TESTS */
#endif /* ISC_PLATFORM_USETHREADS */
/* /*
* Main * Main
@@ -760,11 +758,9 @@ ATF_TP_ADD_TCS(tp) {
ATF_TP_ADD_TC(tp, countlabels); ATF_TP_ADD_TC(tp, countlabels);
ATF_TP_ADD_TC(tp, getlabel); ATF_TP_ADD_TC(tp, getlabel);
ATF_TP_ADD_TC(tp, getlabelsequence); ATF_TP_ADD_TC(tp, getlabelsequence);
#ifdef ISC_PLATFORM_USETHREADS
#ifdef DNS_BENCHMARK_TESTS #ifdef DNS_BENCHMARK_TESTS
ATF_TP_ADD_TC(tp, benchmark); ATF_TP_ADD_TC(tp, benchmark);
#endif /* DNS_BENCHMARK_TESTS */ #endif /* DNS_BENCHMARK_TESTS */
#endif /* ISC_PLATFORM_USETHREADS */
return (atf_no_error()); return (atf_no_error());
} }
-4
View File
@@ -1262,7 +1262,6 @@ ATF_TC_BODY(rbt_nodechain, tc) {
dns_test_end(); dns_test_end();
} }
#ifdef ISC_PLATFORM_USETHREADS
#ifdef DNS_BENCHMARK_TESTS #ifdef DNS_BENCHMARK_TESTS
/* /*
@@ -1390,7 +1389,6 @@ ATF_TC_BODY(benchmark, tc) {
} }
#endif /* DNS_BENCHMARK_TESTS */ #endif /* DNS_BENCHMARK_TESTS */
#endif /* ISC_PLATFORM_USETHREADS */
/* /*
* Main * Main
@@ -1408,11 +1406,9 @@ ATF_TP_ADD_TCS(tp) {
ATF_TP_ADD_TC(tp, rbt_addname); ATF_TP_ADD_TC(tp, rbt_addname);
ATF_TP_ADD_TC(tp, rbt_deletename); ATF_TP_ADD_TC(tp, rbt_deletename);
ATF_TP_ADD_TC(tp, rbt_nodechain); ATF_TP_ADD_TC(tp, rbt_nodechain);
#ifdef ISC_PLATFORM_USETHREADS
#ifdef DNS_BENCHMARK_TESTS #ifdef DNS_BENCHMARK_TESTS
ATF_TP_ADD_TC(tp, benchmark); ATF_TP_ADD_TC(tp, benchmark);
#endif /* DNS_BENCHMARK_TESTS */ #endif /* DNS_BENCHMARK_TESTS */
#endif /* ISC_PLATFORM_USETHREADS */
return (atf_no_error()); return (atf_no_error());
} }
+1 -1
View File
@@ -2053,7 +2053,7 @@ static isc_stdtime_t
epoch_to_yyyymmdd(time_t when) { epoch_to_yyyymmdd(time_t when) {
struct tm *tm; struct tm *tm;
#if defined(ISC_PLATFORM_USETHREADS) && !defined(WIN32) #if !defined(WIN32)
struct tm tm0; struct tm tm0;
tm = localtime_r(&when, &tm0); tm = localtime_r(&when, &tm0);
#else #else
-18
View File
@@ -10151,9 +10151,6 @@ dns_zone_markdirty(dns_zone_t *zone) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#ifdef ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
@@ -10419,9 +10416,6 @@ dump_done(void *arg, isc_result_t result) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#if ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
} }
@@ -14938,9 +14932,6 @@ dns_zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#if ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
} }
@@ -15174,9 +15165,6 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#if ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
} }
@@ -15439,9 +15427,6 @@ zone_loaddone(void *arg, isc_result_t result) {
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#if ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
} }
@@ -18484,9 +18469,6 @@ dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db)
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);
secure = NULL; secure = NULL;
#if ISC_PLATFORM_USETHREADS
isc_thread_yield();
#endif
goto again; goto again;
} }
} }
-20
View File
@@ -43,14 +43,10 @@
#define DNS_CONF "/etc/dns.conf" #define DNS_CONF "/etc/dns.conf"
#endif #endif
#ifndef ISC_PLATFORM_USETHREADS
irs_context_t *irs_g_context = NULL;
#else
static isc_boolean_t thread_key_initialized = ISC_FALSE; static isc_boolean_t thread_key_initialized = ISC_FALSE;
static isc_mutex_t thread_key_mutex; static isc_mutex_t thread_key_mutex;
static isc_thread_key_t irs_context_key; static isc_thread_key_t irs_context_key;
static isc_once_t once = ISC_ONCE_INIT; static isc_once_t once = ISC_ONCE_INIT;
#endif
struct irs_context { struct irs_context {
@@ -126,7 +122,6 @@ ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
return (result); return (result);
} }
#ifdef ISC_PLATFORM_USETHREADS
static void static void
free_specific_context(void *arg) { free_specific_context(void *arg) {
irs_context_t *context = arg; irs_context_t *context = arg;
@@ -164,7 +159,6 @@ thread_key_init(void) {
return (result); return (result);
} }
#endif /* ISC_PLATFORM_USETHREADS */
isc_result_t isc_result_t
irs_context_get(irs_context_t **contextp) { irs_context_get(irs_context_t **contextp) {
@@ -173,15 +167,6 @@ irs_context_get(irs_context_t **contextp) {
REQUIRE(contextp != NULL && *contextp == NULL); REQUIRE(contextp != NULL && *contextp == NULL);
#ifndef ISC_PLATFORM_USETHREADS
if (irs_g_context == NULL) {
result = irs_context_create(&irs_g_context);
if (result != ISC_R_SUCCESS)
return (result);
}
context = irs_g_context;
#else
result = thread_key_init(); result = thread_key_init();
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
return (result); return (result);
@@ -197,7 +182,6 @@ irs_context_get(irs_context_t **contextp) {
return (result); return (result);
} }
} }
#endif /* ISC_PLATFORM_USETHREADS */
*contextp = context; *contextp = context;
@@ -326,11 +310,7 @@ irs_context_destroy(irs_context_t **contextp) {
*contextp = NULL; *contextp = NULL;
#ifndef ISC_PLATFORM_USETHREADS
irs_g_context = NULL;
#else
(void)isc_thread_key_setspecific(irs_context_key, NULL); (void)isc_thread_key_setspecific(irs_context_key, NULL);
#endif
} }
isc_mem_t * isc_mem_t *
-252
View File
@@ -1,252 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <config.h>
#include <unistd.h>
#include <isc/app.h>
#include <isc/magic.h>
#include <isc/mutex.h>
#include <isc/once.h>
#include <isc/util.h>
static isc_mutex_t createlock;
static isc_once_t once = ISC_ONCE_INIT;
static isc_appctxcreatefunc_t appctx_createfunc = NULL;
static isc_boolean_t is_running = ISC_FALSE;
#define ISCAPI_APPMETHODS_VALID(m) ISC_MAGIC_VALID(m, ISCAPI_APPMETHODS_MAGIC)
static void
initialize(void) {
RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
}
isc_result_t
isc_app_register(isc_appctxcreatefunc_t createfunc) {
isc_result_t result = ISC_R_SUCCESS;
RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
LOCK(&createlock);
if (appctx_createfunc == NULL)
appctx_createfunc = createfunc;
else
result = ISC_R_EXISTS;
UNLOCK(&createlock);
return (result);
}
isc_result_t
isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
isc_result_t result;
if (isc_bind9)
return (isc__appctx_create(mctx, ctxp));
LOCK(&createlock);
REQUIRE(appctx_createfunc != NULL);
result = (*appctx_createfunc)(mctx, ctxp);
UNLOCK(&createlock);
return (result);
}
void
isc_appctx_destroy(isc_appctx_t **ctxp) {
REQUIRE(ctxp != NULL && ISCAPI_APPCTX_VALID(*ctxp));
if (isc_bind9)
isc__appctx_destroy(ctxp);
else
(*ctxp)->methods->ctxdestroy(ctxp);
ENSURE(*ctxp == NULL);
}
isc_result_t
isc_app_ctxstart(isc_appctx_t *ctx) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
return (isc__app_ctxstart(ctx));
return (ctx->methods->ctxstart(ctx));
}
isc_result_t
isc_app_ctxrun(isc_appctx_t *ctx) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
return (isc__app_ctxrun(ctx));
return (ctx->methods->ctxrun(ctx));
}
isc_result_t
isc_app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx,
isc_task_t *task, isc_taskaction_t action,
void *arg)
{
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
return (isc__app_ctxonrun(ctx, mctx, task, action, arg));
return (ctx->methods->ctxonrun(ctx, mctx, task, action, arg));
}
isc_result_t
isc_app_ctxsuspend(isc_appctx_t *ctx) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
return (isc__app_ctxsuspend(ctx));
return (ctx->methods->ctxsuspend(ctx));
}
isc_result_t
isc_app_ctxshutdown(isc_appctx_t *ctx) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
return (isc__app_ctxshutdown(ctx));
return (ctx->methods->ctxshutdown(ctx));
}
void
isc_app_ctxfinish(isc_appctx_t *ctx) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
if (isc_bind9)
isc__app_ctxfinish(ctx);
ctx->methods->ctxfinish(ctx);
}
void
isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
REQUIRE(taskmgr != NULL);
if (isc_bind9)
isc__appctx_settaskmgr(ctx, taskmgr);
ctx->methods->settaskmgr(ctx, taskmgr);
}
void
isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
REQUIRE(socketmgr != NULL);
if (isc_bind9)
isc__appctx_setsocketmgr(ctx, socketmgr);
ctx->methods->setsocketmgr(ctx, socketmgr);
}
void
isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr) {
REQUIRE(ISCAPI_APPCTX_VALID(ctx));
REQUIRE(timermgr != NULL);
if (isc_bind9)
isc__appctx_settimermgr(ctx, timermgr);
ctx->methods->settimermgr(ctx, timermgr);
}
isc_result_t
isc_app_start(void) {
if (isc_bind9)
return (isc__app_start());
return (ISC_R_NOTIMPLEMENTED);
}
isc_result_t
isc_app_onrun(isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg)
{
if (isc_bind9)
return (isc__app_onrun(mctx, task, action, arg));
return (ISC_R_NOTIMPLEMENTED);
}
isc_result_t
isc_app_run() {
if (isc_bind9) {
isc_result_t result;
is_running = ISC_TRUE;
result = isc__app_run();
is_running = ISC_FALSE;
return (result);
}
return (ISC_R_NOTIMPLEMENTED);
}
isc_boolean_t
isc_app_isrunning() {
return (is_running);
}
isc_result_t
isc_app_shutdown(void) {
if (isc_bind9)
return (isc__app_shutdown());
return (ISC_R_NOTIMPLEMENTED);
}
isc_result_t
isc_app_reload(void) {
if (isc_bind9)
return (isc__app_reload());
return (ISC_R_NOTIMPLEMENTED);
}
void
isc_app_finish(void) {
if (!isc_bind9)
return;
isc__app_finish();
}
void
isc_app_block(void) {
if (!isc_bind9)
return;
isc__app_block();
}
void
isc_app_unblock(void) {
if (!isc_bind9)
return;
isc__app_unblock();
}
-24
View File
@@ -92,29 +92,6 @@ typedef isc_event_t isc_appevent_t;
#define ISC_APPEVENT_SHUTDOWN (ISC_EVENTCLASS_APP + 1) #define ISC_APPEVENT_SHUTDOWN (ISC_EVENTCLASS_APP + 1)
#define ISC_APPEVENT_LASTEVENT (ISC_EVENTCLASS_APP + 65535) #define ISC_APPEVENT_LASTEVENT (ISC_EVENTCLASS_APP + 65535)
/*%
* app module methods. Only app driver implementations use this structure.
* Other clients should use the top-level interfaces (i.e., isc_app_xxx
* functions). magic must be ISCAPI_APPMETHODS_MAGIC.
*/
typedef struct isc_appmethods {
void (*ctxdestroy)(isc_appctx_t **ctxp);
isc_result_t (*ctxstart)(isc_appctx_t *ctx);
isc_result_t (*ctxrun)(isc_appctx_t *ctx);
isc_result_t (*ctxsuspend)(isc_appctx_t *ctx);
isc_result_t (*ctxshutdown)(isc_appctx_t *ctx);
void (*ctxfinish)(isc_appctx_t *ctx);
void (*settaskmgr)(isc_appctx_t *ctx,
isc_taskmgr_t *timermgr);
void (*setsocketmgr)(isc_appctx_t *ctx,
isc_socketmgr_t *timermgr);
void (*settimermgr)(isc_appctx_t *ctx,
isc_timermgr_t *timermgr);
isc_result_t (*ctxonrun)(isc_appctx_t *ctx, isc_mem_t *mctx,
isc_task_t *task, isc_taskaction_t action,
void *arg);
} isc_appmethods_t;
/*% /*%
* This structure is actually just the common prefix of an application context * This structure is actually just the common prefix of an application context
* implementation's version of an isc_appctx_t. * implementation's version of an isc_appctx_t.
@@ -127,7 +104,6 @@ typedef struct isc_appmethods {
struct isc_appctx { struct isc_appctx {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_appmethods_t *methods;
}; };
#define ISCAPI_APPCTX_MAGIC ISC_MAGIC('A','a','p','c') #define ISCAPI_APPCTX_MAGIC ISC_MAGIC('A','a','p','c')
-64
View File
@@ -180,44 +180,6 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_defaultflags;
* \endcode * \endcode
*/ */
/*% memory and memory pool methods */
typedef struct isc_memmethods {
void (*attach)(isc_mem_t *source, isc_mem_t **targetp);
void (*detach)(isc_mem_t **mctxp);
void (*destroy)(isc_mem_t **mctxp);
void *(*memget)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
void (*memput)(isc_mem_t *mctx, void *ptr, size_t size _ISC_MEM_FLARG);
void (*memputanddetach)(isc_mem_t **mctxp, void *ptr,
size_t size _ISC_MEM_FLARG);
void *(*memallocate)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
void *(*memreallocate)(isc_mem_t *mctx, void *ptr,
size_t size _ISC_MEM_FLARG);
char *(*memstrdup)(isc_mem_t *mctx, const char *s _ISC_MEM_FLARG);
void (*memfree)(isc_mem_t *mctx, void *ptr _ISC_MEM_FLARG);
void (*setdestroycheck)(isc_mem_t *mctx, isc_boolean_t flag);
void (*setwater)(isc_mem_t *ctx, isc_mem_water_t water,
void *water_arg, size_t hiwater, size_t lowater);
void (*waterack)(isc_mem_t *ctx, int flag);
size_t (*inuse)(isc_mem_t *mctx);
size_t (*maxinuse)(isc_mem_t *mctx);
size_t (*total)(isc_mem_t *mctx);
isc_boolean_t (*isovermem)(isc_mem_t *mctx);
isc_result_t (*mpcreate)(isc_mem_t *mctx, size_t size,
isc_mempool_t **mpctxp);
} isc_memmethods_t;
typedef struct isc_mempoolmethods {
void (*destroy)(isc_mempool_t **mpctxp);
void *(*get)(isc_mempool_t *mpctx _ISC_MEM_FLARG);
void (*put)(isc_mempool_t *mpctx, void *mem _ISC_MEM_FLARG);
unsigned int (*getallocated)(isc_mempool_t *mpctx);
void (*setmaxalloc)(isc_mempool_t *mpctx, unsigned int limit);
void (*setfreemax)(isc_mempool_t *mpctx, unsigned int limit);
void (*setname)(isc_mempool_t *mpctx, const char *name);
void (*associatelock)(isc_mempool_t *mpctx, isc_mutex_t *lock);
void (*setfillcount)(isc_mempool_t *mpctx, unsigned int limit);
} isc_mempoolmethods_t;
/*% /*%
* This structure is actually just the common prefix of a memory context * This structure is actually just the common prefix of a memory context
* implementation's version of an isc_mem_t. * implementation's version of an isc_mem_t.
@@ -230,7 +192,6 @@ typedef struct isc_mempoolmethods {
struct isc_mem { struct isc_mem {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_memmethods_t *methods;
}; };
#define ISCAPI_MCTX_MAGIC ISC_MAGIC('A','m','c','x') #define ISCAPI_MCTX_MAGIC ISC_MAGIC('A','m','c','x')
@@ -244,7 +205,6 @@ struct isc_mem {
struct isc_mempool { struct isc_mempool {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_mempoolmethods_t *methods;
}; };
#define ISCAPI_MPOOL_MAGIC ISC_MAGIC('A','m','p','l') #define ISCAPI_MPOOL_MAGIC ISC_MAGIC('A','m','p','l')
@@ -701,30 +661,6 @@ ISCMEMPOOLFUNC(get)(isc_mempool_t * _ISC_MEM_FLARG);
void void
ISCMEMPOOLFUNC(put)(isc_mempool_t *, void * _ISC_MEM_FLARG); ISCMEMPOOLFUNC(put)(isc_mempool_t *, void * _ISC_MEM_FLARG);
/*%<
* See isc_mem_create2() above.
*/
typedef isc_result_t
(*isc_memcreatefunc_t)(size_t init_max_size, size_t target_size,
isc_mem_t **ctxp, unsigned int flags);
isc_result_t
isc_mem_register(isc_memcreatefunc_t createfunc);
/*%<
* Register a new memory management implementation and add it to the list of
* supported implementations. This function must be called when a different
* memory management library is used than the one contained in the ISC library.
*/
isc_result_t
isc__mem_register(void);
/*%<
* A short cut function that specifies the memory management module in the ISC
* library for isc_mem_register(). An application that uses the ISC library
* usually do not have to care about this function: it would call
* isc_lib_register(), which internally calls this function.
*/
void void
isc__mem_printactive(isc_mem_t *mctx, FILE *file); isc__mem_printactive(isc_mem_t *mctx, FILE *file);
/*%< /*%<
-5
View File
@@ -199,11 +199,6 @@
*** Miscellaneous. *** Miscellaneous.
***/ ***/
/*
* Defined if we are using threads.
*/
@ISC_PLATFORM_USETHREADS@
/* /*
* Defined if unistd.h does not cause fd_set to be delared. * Defined if unistd.h does not cause fd_set to be delared.
*/ */
-39
View File
@@ -92,7 +92,6 @@ ISC_LANG_BEGINDECLS
/* /*
* Sample implementations * Sample implementations
*/ */
#ifdef ISC_PLATFORM_USETHREADS
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD)
#define ISC_REFCOUNT_HAVEATOMIC 1 #define ISC_REFCOUNT_HAVEATOMIC 1
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE))
@@ -251,44 +250,6 @@ typedef struct isc_refcount {
} while (0) } while (0)
#endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) */ #endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) */
#else /* ISC_PLATFORM_USETHREADS */
typedef struct isc_refcount {
int refs;
} isc_refcount_t;
#define isc_refcount_destroy(rp) ISC_REQUIRE((rp)->refs == 0)
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
#define isc_refcount_increment0(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
int _n = ++(rp)->refs; \
if (_tmp != NULL) \
*_tmp = _n; \
} while (0)
#define isc_refcount_increment(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
int _n; \
ISC_REQUIRE((rp)->refs > 0); \
_n = ++(rp)->refs; \
if (_tmp != NULL) \
*_tmp = _n; \
} while (0)
#define isc_refcount_decrement(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
int _n; \
ISC_REQUIRE((rp)->refs > 0); \
_n = --(rp)->refs; \
if (_tmp != NULL) \
*_tmp = _n; \
} while (0)
#endif /* ISC_PLATFORM_USETHREADS */
isc_result_t isc_result_t
isc_refcount_init(isc_refcount_t *ref, unsigned int n); isc_refcount_init(isc_refcount_t *ref, unsigned int n);
-9
View File
@@ -33,7 +33,6 @@ typedef enum {
isc_rwlocktype_write isc_rwlocktype_write
} isc_rwlocktype_t; } isc_rwlocktype_t;
#ifdef ISC_PLATFORM_USETHREADS
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || (defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)) #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || (defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG))
#define ISC_RWLOCK_USEATOMIC 1 #define ISC_RWLOCK_USEATOMIC 1
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) #if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE))
@@ -107,14 +106,6 @@ struct isc_rwlock {
isc_rwlocktype_t original; isc_rwlocktype_t original;
#endif /* ISC_RWLOCK_USEATOMIC */ #endif /* ISC_RWLOCK_USEATOMIC */
}; };
#else /* ISC_PLATFORM_USETHREADS */
struct isc_rwlock {
unsigned int magic;
isc_rwlocktype_t type;
unsigned int active;
};
#endif /* ISC_PLATFORM_USETHREADS */
isc_result_t isc_result_t
isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota, isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
+3 -125
View File
@@ -59,55 +59,6 @@
#include <isc/types.h> #include <isc/types.h>
#include <isc/xml.h> #include <isc/xml.h>
#ifdef WIN32
/* from the old namespace.h */
#define isc_socket_create isc__socket_create
#define isc_socket_dup isc__socket_dup
#define isc_socket_attach isc__socket_attach
#define isc_socket_detach isc__socket_detach
#define isc_socketmgr_create isc__socketmgr_create
#define isc_socketmgr_create2 isc__socketmgr_create2
#define isc_socketmgr_destroy isc__socketmgr_destroy
#define isc_socket_open isc__socket_open
#define isc_socket_close isc__socket_close
#define isc_socket_recvv isc__socket_recvv
#define isc_socket_recv isc__socket_recv
#define isc_socket_recv2 isc__socket_recv2
#define isc_socket_send isc__socket_send
#define isc_socket_sendto isc__socket_sendto
#define isc_socket_sendv isc__socket_sendv
#define isc_socket_sendtov isc__socket_sendtov
#define isc_socket_sendtov2 isc__socket_sendtov2
#define isc_socket_sendto2 isc__socket_sendto2
#define isc_socket_cleanunix isc__socket_cleanunix
#define isc_socket_permunix isc__socket_permunix
#define isc_socket_bind isc__socket_bind
#define isc_socket_filter isc__socket_filter
#define isc_socket_listen isc__socket_listen
#define isc_socket_accept isc__socket_accept
#define isc_socket_connect isc__socket_connect
#define isc_socket_getfd isc__socket_getfd
#define isc_socket_getname isc__socket_getname
#define isc_socket_gettag isc__socket_gettag
#define isc_socket_getpeername isc__socket_getpeername
#define isc_socket_getsockname isc__socket_getsockname
#define isc_socket_cancel isc__socket_cancel
#define isc_socket_gettype isc__socket_gettype
#define isc_socket_isbound isc__socket_isbound
#define isc_socket_ipv6only isc__socket_ipv6only
#define isc_socket_setname isc__socket_setname
#define isc_socketmgr_getmaxsockets isc__socketmgr_getmaxsockets
#define isc_socketmgr_setstats isc__socketmgr_setstats
#define isc_socketmgr_setreserved isc__socketmgr_setreserved
#define isc__socketmgr_maxudp isc___socketmgr_maxudp
#define isc_socket_fdwatchcreate isc__socket_fdwatchcreate
#define isc_socket_fdwatchpoke isc__socket_fdwatchpoke
#define isc_socket_dscp isc__socket_dscp
#endif
ISC_LANG_BEGINDECLS ISC_LANG_BEGINDECLS
/*** /***
@@ -330,60 +281,6 @@ typedef enum {
#define ISC_SOCKFDWATCH_WRITE 0x00000002 /*%< watch for writable */ #define ISC_SOCKFDWATCH_WRITE 0x00000002 /*%< watch for writable */
/*@}*/ /*@}*/
/*% Socket and socket manager methods */
typedef struct isc_socketmgrmethods {
void (*destroy)(isc_socketmgr_t **managerp);
isc_result_t (*socketcreate)(isc_socketmgr_t *manager, int pf,
isc_sockettype_t type,
isc_socket_t **socketp);
isc_result_t (*fdwatchcreate)(isc_socketmgr_t *manager, int fd,
int flags,
isc_sockfdwatch_t callback,
void *cbarg, isc_task_t *task,
isc_socket_t **socketp);
} isc_socketmgrmethods_t;
typedef struct isc_socketmethods {
void (*attach)(isc_socket_t *socket,
isc_socket_t **socketp);
void (*detach)(isc_socket_t **socketp);
isc_result_t (*bind)(isc_socket_t *sock,
const isc_sockaddr_t *sockaddr,
unsigned int options);
isc_result_t (*sendto)(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action,
void *arg,
const isc_sockaddr_t *address,
struct in6_pktinfo *pktinfo);
isc_result_t (*sendto2)(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task,
const isc_sockaddr_t *address,
struct in6_pktinfo *pktinfo,
isc_socketevent_t *event,
unsigned int flags);
isc_result_t (*connect)(isc_socket_t *sock,
const isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action,
void *arg);
isc_result_t (*recv)(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task,
isc_taskaction_t action, void *arg);
isc_result_t (*recv2)(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task,
isc_socketevent_t *event, unsigned int flags);
void (*cancel)(isc_socket_t *sock, isc_task_t *task,
unsigned int how);
isc_result_t (*getsockname)(isc_socket_t *sock,
isc_sockaddr_t *addressp);
isc_sockettype_t (*gettype)(isc_socket_t *sock);
void (*ipv6only)(isc_socket_t *sock, isc_boolean_t yes);
isc_result_t (*fdwatchpoke)(isc_socket_t *sock, int flags);
isc_result_t (*dup)(isc_socket_t *socket,
isc_socket_t **socketp);
int (*getfd)(isc_socket_t *socket);
void (*dscp)(isc_socket_t *socket, isc_dscp_t dscp);
} isc_socketmethods_t;
/*% /*%
* This structure is actually just the common prefix of a socket manager * This structure is actually just the common prefix of a socket manager
* object implementation's version of an isc_socketmgr_t. * object implementation's version of an isc_socketmgr_t.
@@ -401,7 +298,6 @@ typedef struct isc_socketmethods {
struct isc_socketmgr { struct isc_socketmgr {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_socketmgrmethods_t *methods;
}; };
#endif #endif
@@ -417,7 +313,6 @@ struct isc_socketmgr {
struct isc_socket { struct isc_socket {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_socketmethods_t *methods;
}; };
#endif #endif
@@ -1135,7 +1030,7 @@ isc_socket_gettype(isc_socket_t *sock);
/*@{*/ /*@{*/
isc_boolean_t isc_boolean_t
isc__socket_isbound(isc_socket_t *sock); isc_socket_isbound(isc_socket_t *sock);
/*% /*%
* Intended for internal use in BIND9 only * Intended for internal use in BIND9 only
*/ */
@@ -1228,13 +1123,13 @@ int isc_socket_getfd(isc_socket_t *socket);
*/ */
void void
isc__socketmgr_setreserved(isc_socketmgr_t *mgr, isc_uint32_t); isc_socketmgr_setreserved(isc_socketmgr_t *mgr, isc_uint32_t);
/*%< /*%<
* Temporary. For use by named only. * Temporary. For use by named only.
*/ */
void void
isc__socketmgr_maxudp(isc_socketmgr_t *mgr, int maxudp); isc_socketmgr_maxudp(isc_socketmgr_t *mgr, int maxudp);
/*%< /*%<
* Test interface. Drop UDP packet > 'maxudp'. * Test interface. Drop UDP packet > 'maxudp'.
*/ */
@@ -1261,23 +1156,6 @@ isc_socketmgr_renderjson(isc_socketmgr_t *mgr, json_object *stats);
typedef isc_result_t typedef isc_result_t
(*isc_socketmgrcreatefunc_t)(isc_mem_t *mctx, isc_socketmgr_t **managerp); (*isc_socketmgrcreatefunc_t)(isc_mem_t *mctx, isc_socketmgr_t **managerp);
isc_result_t
isc_socket_register(isc_socketmgrcreatefunc_t createfunc);
/*%<
* Register a new socket I/O implementation and add it to the list of
* supported implementations. This function must be called when a different
* event library is used than the one contained in the ISC library.
*/
isc_result_t
isc__socket_register(void);
/*%<
* A short cut function that specifies the socket I/O module in the ISC
* library for isc_socket_register(). An application that uses the ISC library
* usually do not have to care about this function: it would call
* isc_lib_register(), which internally calls this function.
*/
ISC_LANG_ENDDECLS ISC_LANG_ENDDECLS
#endif /* ISC_SOCKET_H */ #endif /* ISC_SOCKET_H */
-45
View File
@@ -100,41 +100,6 @@ typedef enum {
isc_taskmgrmode_privileged isc_taskmgrmode_privileged
} isc_taskmgrmode_t; } isc_taskmgrmode_t;
/*% Task and task manager methods */
typedef struct isc_taskmgrmethods {
void (*destroy)(isc_taskmgr_t **managerp);
void (*setmode)(isc_taskmgr_t *manager,
isc_taskmgrmode_t mode);
isc_taskmgrmode_t (*mode)(isc_taskmgr_t *manager);
isc_result_t (*taskcreate)(isc_taskmgr_t *manager,
unsigned int quantum,
isc_task_t **taskp);
void (*setexcltask)(isc_taskmgr_t *mgr, isc_task_t *task);
isc_result_t (*excltask)(isc_taskmgr_t *mgr, isc_task_t **taskp);
} isc_taskmgrmethods_t;
typedef struct isc_taskmethods {
void (*attach)(isc_task_t *source, isc_task_t **targetp);
void (*detach)(isc_task_t **taskp);
void (*destroy)(isc_task_t **taskp);
void (*send)(isc_task_t *task, isc_event_t **eventp);
void (*sendanddetach)(isc_task_t **taskp, isc_event_t **eventp);
unsigned int (*unsend)(isc_task_t *task, void *sender, isc_eventtype_t type,
void *tag, isc_eventlist_t *events);
isc_result_t (*onshutdown)(isc_task_t *task, isc_taskaction_t action,
void *arg);
void (*shutdown)(isc_task_t *task);
void (*setname)(isc_task_t *task, const char *name, void *tag);
unsigned int (*purgeevents)(isc_task_t *task, void *sender,
isc_eventtype_t type, void *tag);
unsigned int (*purgerange)(isc_task_t *task, void *sender,
isc_eventtype_t first, isc_eventtype_t last,
void *tag);
isc_result_t (*beginexclusive)(isc_task_t *task);
void (*endexclusive)(isc_task_t *task);
void (*setprivilege)(isc_task_t *task, isc_boolean_t priv);
isc_boolean_t (*privilege)(isc_task_t *task);
} isc_taskmethods_t;
/*% /*%
* This structure is actually just the common prefix of a task manager * This structure is actually just the common prefix of a task manager
@@ -148,7 +113,6 @@ typedef struct isc_taskmethods {
struct isc_taskmgr { struct isc_taskmgr {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_taskmgrmethods_t *methods;
}; };
#define ISCAPI_TASKMGR_MAGIC ISC_MAGIC('A','t','m','g') #define ISCAPI_TASKMGR_MAGIC ISC_MAGIC('A','t','m','g')
@@ -162,7 +126,6 @@ struct isc_taskmgr {
struct isc_task { struct isc_task {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_taskmethods_t *methods;
}; };
#define ISCAPI_TASK_MAGIC ISC_MAGIC('A','t','s','t') #define ISCAPI_TASK_MAGIC ISC_MAGIC('A','t','s','t')
@@ -824,19 +787,11 @@ isc__task_register(void);
* These functions allow unit tests to manipulate the processing * These functions allow unit tests to manipulate the processing
* of the task queue. They are not intended as part of the public API. * of the task queue. They are not intended as part of the public API.
*/ */
#if defined(ISC_PLATFORM_USETHREADS)
void void
isc__taskmgr_pause(isc_taskmgr_t *taskmgr); isc__taskmgr_pause(isc_taskmgr_t *taskmgr);
void void
isc__taskmgr_resume(isc_taskmgr_t *taskmgr); isc__taskmgr_resume(isc_taskmgr_t *taskmgr);
#else
isc_boolean_t
isc__taskmgr_ready(isc_taskmgr_t *taskmgr);
isc_result_t
isc__taskmgr_dispatch(isc_taskmgr_t *taskmgr);
#endif /* !ISC_PLATFORM_USETHREADS */
ISC_LANG_ENDDECLS ISC_LANG_ENDDECLS
-25
View File
@@ -97,29 +97,6 @@ typedef struct isc_timerevent {
#define ISC_TIMEREVENT_LIFE (ISC_EVENTCLASS_TIMER + 3) #define ISC_TIMEREVENT_LIFE (ISC_EVENTCLASS_TIMER + 3)
#define ISC_TIMEREVENT_LASTEVENT (ISC_EVENTCLASS_TIMER + 65535) #define ISC_TIMEREVENT_LASTEVENT (ISC_EVENTCLASS_TIMER + 65535)
/*% Timer and timer manager methods */
typedef struct {
void (*destroy)(isc_timermgr_t **managerp);
isc_result_t (*timercreate)(isc_timermgr_t *manager,
isc_timertype_t type,
const isc_time_t *expires,
const isc_interval_t *interval,
isc_task_t *task,
isc_taskaction_t action,
void *arg,
isc_timer_t **timerp);
} isc_timermgrmethods_t;
typedef struct {
void (*attach)(isc_timer_t *timer, isc_timer_t **timerp);
void (*detach)(isc_timer_t **timerp);
isc_result_t (*reset)(isc_timer_t *timer, isc_timertype_t type,
const isc_time_t *expires,
const isc_interval_t *interval,
isc_boolean_t purge);
isc_result_t (*touch)(isc_timer_t *timer);
} isc_timermethods_t;
/*% /*%
* This structure is actually just the common prefix of a timer manager * This structure is actually just the common prefix of a timer manager
* object implementation's version of an isc_timermgr_t. * object implementation's version of an isc_timermgr_t.
@@ -132,7 +109,6 @@ typedef struct {
struct isc_timermgr { struct isc_timermgr {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_timermgrmethods_t *methods;
}; };
#define ISCAPI_TIMERMGR_MAGIC ISC_MAGIC('A','t','m','g') #define ISCAPI_TIMERMGR_MAGIC ISC_MAGIC('A','t','m','g')
@@ -146,7 +122,6 @@ struct isc_timermgr {
struct isc_timer { struct isc_timer {
unsigned int impmagic; unsigned int impmagic;
unsigned int magic; unsigned int magic;
isc_timermethods_t *methods;
}; };
#define ISCAPI_TIMER_MAGIC ISC_MAGIC('A','t','m','r') #define ISCAPI_TIMER_MAGIC ISC_MAGIC('A','t','m','r')
+1 -15
View File
@@ -77,21 +77,7 @@ isc_lib_initmsgcat(void) {
} }
} }
static isc_once_t register_once = ISC_ONCE_INIT;
static void
do_register(void) {
isc_bind9 = ISC_FALSE;
RUNTIME_CHECK(isc__mem_register() == ISC_R_SUCCESS);
RUNTIME_CHECK(isc__app_register() == ISC_R_SUCCESS);
RUNTIME_CHECK(isc__task_register() == ISC_R_SUCCESS);
RUNTIME_CHECK(isc__socket_register() == ISC_R_SUCCESS);
RUNTIME_CHECK(isc__timer_register() == ISC_R_SUCCESS);
}
void void
isc_lib_register(void) { isc_lib_register(void) {
RUNTIME_CHECK(isc_once_do(&register_once, do_register) isc_bind9 = ISC_FALSE;
== ISC_R_SUCCESS);
} }
+49 -861
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -24,7 +24,7 @@ isc_refcount_init(isc_refcount_t *ref, unsigned int n) {
REQUIRE(ref != NULL); REQUIRE(ref != NULL);
ref->refs = n; ref->refs = n;
#if defined(ISC_PLATFORM_USETHREADS) && !defined(ISC_REFCOUNT_HAVEATOMIC) #if !defined(ISC_REFCOUNT_HAVEATOMIC)
return (isc_mutex_init(&ref->lock)); return (isc_mutex_init(&ref->lock));
#else #else
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
-90
View File
@@ -27,8 +27,6 @@
#define RWLOCK_MAGIC ISC_MAGIC('R', 'W', 'L', 'k') #define RWLOCK_MAGIC ISC_MAGIC('R', 'W', 'L', 'k')
#define VALID_RWLOCK(rwl) ISC_MAGIC_VALID(rwl, RWLOCK_MAGIC) #define VALID_RWLOCK(rwl) ISC_MAGIC_VALID(rwl, RWLOCK_MAGIC)
#ifdef ISC_PLATFORM_USETHREADS
#ifndef RWLOCK_DEFAULT_READ_QUOTA #ifndef RWLOCK_DEFAULT_READ_QUOTA
#define RWLOCK_DEFAULT_READ_QUOTA 4 #define RWLOCK_DEFAULT_READ_QUOTA 4
#endif #endif
@@ -890,91 +888,3 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
} }
#endif /* ISC_RWLOCK_USEATOMIC */ #endif /* ISC_RWLOCK_USEATOMIC */
#else /* ISC_PLATFORM_USETHREADS */
isc_result_t
isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
unsigned int write_quota)
{
REQUIRE(rwl != NULL);
UNUSED(read_quota);
UNUSED(write_quota);
rwl->type = isc_rwlocktype_read;
rwl->active = 0;
rwl->magic = RWLOCK_MAGIC;
return (ISC_R_SUCCESS);
}
isc_result_t
isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
REQUIRE(VALID_RWLOCK(rwl));
if (type == isc_rwlocktype_read) {
if (rwl->type != isc_rwlocktype_read && rwl->active != 0)
return (ISC_R_LOCKBUSY);
rwl->type = isc_rwlocktype_read;
rwl->active++;
} else {
if (rwl->active != 0)
return (ISC_R_LOCKBUSY);
rwl->type = isc_rwlocktype_write;
rwl->active = 1;
}
return (ISC_R_SUCCESS);
}
isc_result_t
isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
return (isc_rwlock_lock(rwl, type));
}
isc_result_t
isc_rwlock_tryupgrade(isc_rwlock_t *rwl) {
isc_result_t result = ISC_R_SUCCESS;
REQUIRE(VALID_RWLOCK(rwl));
REQUIRE(rwl->type == isc_rwlocktype_read);
REQUIRE(rwl->active != 0);
/* If we are the only reader then succeed. */
if (rwl->active == 1)
rwl->type = isc_rwlocktype_write;
else
result = ISC_R_LOCKBUSY;
return (result);
}
void
isc_rwlock_downgrade(isc_rwlock_t *rwl) {
REQUIRE(VALID_RWLOCK(rwl));
REQUIRE(rwl->type == isc_rwlocktype_write);
REQUIRE(rwl->active == 1);
rwl->type = isc_rwlocktype_read;
}
isc_result_t
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
REQUIRE(VALID_RWLOCK(rwl));
REQUIRE(rwl->type == type);
UNUSED(type);
INSIST(rwl->active > 0);
rwl->active--;
return (ISC_R_SUCCESS);
}
void
isc_rwlock_destroy(isc_rwlock_t *rwl) {
REQUIRE(rwl != NULL);
REQUIRE(rwl->active == 0);
rwl->magic = 0;
}
#endif /* ISC_PLATFORM_USETHREADS */
-397
View File
@@ -1,397 +0,0 @@
/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <config.h>
#include <isc/app.h>
#include <isc/magic.h>
#include <isc/mutex.h>
#include <isc/once.h>
#include <isc/socket.h>
#include <isc/util.h>
static isc_mutex_t createlock;
static isc_once_t once = ISC_ONCE_INIT;
static isc_socketmgrcreatefunc_t socketmgr_createfunc = NULL;
static void
initialize(void) {
RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
}
isc_result_t
isc_socket_register(isc_socketmgrcreatefunc_t createfunc) {
isc_result_t result = ISC_R_SUCCESS;
RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
LOCK(&createlock);
if (socketmgr_createfunc == NULL)
socketmgr_createfunc = createfunc;
else
result = ISC_R_EXISTS;
UNLOCK(&createlock);
return (result);
}
isc_result_t
isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
isc_socketmgr_t **managerp)
{
isc_result_t result;
LOCK(&createlock);
REQUIRE(socketmgr_createfunc != NULL);
result = (*socketmgr_createfunc)(mctx, managerp);
UNLOCK(&createlock);
if (result == ISC_R_SUCCESS)
isc_appctx_setsocketmgr(actx, *managerp);
return (result);
}
isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
isc_result_t result;
if (isc_bind9)
return (isc__socketmgr_create(mctx, managerp));
LOCK(&createlock);
REQUIRE(socketmgr_createfunc != NULL);
result = (*socketmgr_createfunc)(mctx, managerp);
UNLOCK(&createlock);
return (result);
}
void
isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
REQUIRE(managerp != NULL && ISCAPI_SOCKETMGR_VALID(*managerp));
if (isc_bind9)
isc__socketmgr_destroy(managerp);
else
(*managerp)->methods->destroy(managerp);
ENSURE(*managerp == NULL);
}
isc_result_t
isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
isc_socket_t **socketp)
{
REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
if (isc_bind9)
return (isc__socket_create(manager, pf, type, socketp));
return (manager->methods->socketcreate(manager, pf, type, socketp));
}
void
isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
REQUIRE(socketp != NULL && *socketp == NULL);
if (isc_bind9)
isc__socket_attach(sock, socketp);
else
sock->methods->attach(sock, socketp);
ENSURE(*socketp == sock);
}
void
isc_socket_detach(isc_socket_t **socketp) {
REQUIRE(socketp != NULL && ISCAPI_SOCKET_VALID(*socketp));
if (isc_bind9)
isc__socket_detach(socketp);
else
(*socketp)->methods->detach(socketp);
ENSURE(*socketp == NULL);
}
isc_result_t
isc_socket_bind(isc_socket_t *sock, const isc_sockaddr_t *sockaddr,
unsigned int options)
{
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_bind(sock, sockaddr, options));
return (sock->methods->bind(sock, sockaddr, options));
}
isc_result_t
isc_socket_sendto(isc_socket_t *sock, isc_region_t *region, isc_task_t *task,
isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_sendto(sock, region, task,
action, arg, address, pktinfo));
return (sock->methods->sendto(sock, region, task, action, arg, address,
pktinfo));
}
isc_result_t
isc_socket_connect(isc_socket_t *sock, const isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action, void *arg)
{
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_connect(sock, addr, task, action, arg));
return (sock->methods->connect(sock, addr, task, action, arg));
}
isc_result_t
isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
isc_task_t *task, isc_taskaction_t action, void *arg)
{
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_recv(sock, region, minimum,
task, action, arg));
return (sock->methods->recv(sock, region, minimum, task, action, arg));
}
void
isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
isc__socket_cancel(sock, task, how);
else
sock->methods->cancel(sock, task, how);
}
isc_result_t
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_getsockname(sock, addressp));
return (sock->methods->getsockname(sock, addressp));
}
void
isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
isc__socket_ipv6only(sock, yes);
else
sock->methods->ipv6only(sock, yes);
}
void
isc_socket_dscp(isc_socket_t *sock, isc_dscp_t dscp) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
sock->methods->dscp(sock, dscp);
}
isc_sockettype_t
isc_socket_gettype(isc_socket_t *sock) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_gettype(sock));
return (sock->methods->gettype(sock));
}
void
isc_socket_setname(isc_socket_t *sock, const char *name, void *tag) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
UNUSED(sock); /* in case REQUIRE() is empty */
UNUSED(name);
UNUSED(tag);
}
isc_result_t
isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
isc_sockfdwatch_t callback, void *cbarg,
isc_task_t *task, isc_socket_t **socketp)
{
REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
if (isc_bind9)
return (isc__socket_fdwatchcreate(manager, fd, flags,
callback, cbarg,
task, socketp));
return (manager->methods->fdwatchcreate(manager, fd, flags,
callback, cbarg, task,
socketp));
}
isc_result_t
isc_socket_fdwatchpoke(isc_socket_t *sock, int flags)
{
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_fdwatchpoke(sock, flags));
return (sock->methods->fdwatchpoke(sock, flags));
}
isc_result_t
isc_socket_dup(isc_socket_t *sock, isc_socket_t **socketp) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
REQUIRE(socketp != NULL && *socketp == NULL);
if (isc_bind9)
return (isc__socket_dup(sock, socketp));
return (sock->methods->dup(sock, socketp));
}
int
isc_socket_getfd(isc_socket_t *sock) {
REQUIRE(ISCAPI_SOCKET_VALID(sock));
if (isc_bind9)
return (isc__socket_getfd(sock));
return (sock->methods->getfd(sock));
}
isc_result_t
isc_socket_open(isc_socket_t *sock) {
return (isc__socket_open(sock));
}
isc_result_t
isc_socket_close(isc_socket_t *sock) {
return (isc__socket_close(sock));
}
isc_result_t
isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
unsigned int maxsocks)
{
return (isc__socketmgr_create2(mctx, managerp, maxsocks));
}
isc_result_t
isc_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
unsigned int minimum, isc_task_t *task,
isc_taskaction_t action, void *arg)
{
return (isc__socket_recvv(sock, buflist, minimum, task, action, arg));
}
isc_result_t
isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task,
isc_socketevent_t *event, unsigned int flags)
{
return (isc__socket_recv2(sock, region, minimum, task, event, flags));
}
isc_result_t
isc_socket_send(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, void *arg)
{
return (isc__socket_send(sock, region, task, action, arg));
}
isc_result_t
isc_socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg)
{
return (isc__socket_sendv(sock, buflist, task, action, arg));
}
isc_result_t
isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
return (isc__socket_sendtov(sock, buflist, task, action, arg,
address, pktinfo));
}
isc_result_t
isc_socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
unsigned int flags)
{
return (isc__socket_sendtov2(sock, buflist, task, action, arg,
address, pktinfo, flags));
}
isc_result_t
isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
isc_socketevent_t *event, unsigned int flags)
{
return (isc__socket_sendto2(sock, region, task, address, pktinfo,
event, flags));
}
void
isc_socket_cleanunix(const isc_sockaddr_t *sockaddr, isc_boolean_t active) {
isc__socket_cleanunix(sockaddr, active);
}
isc_result_t
isc_socket_permunix(const isc_sockaddr_t *sockaddr, isc_uint32_t perm,
isc_uint32_t owner, isc_uint32_t group)
{
return (isc__socket_permunix(sockaddr, perm, owner, group));
}
isc_result_t
isc_socket_filter(isc_socket_t *sock, const char *filter) {
return (isc__socket_filter(sock, filter));
}
isc_result_t
isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
return (isc__socket_listen(sock, backlog));
}
isc_result_t
isc_socket_accept(isc_socket_t *sock, isc_task_t *task,
isc_taskaction_t action, void *arg)
{
return (isc__socket_accept(sock, task, action, arg));
}
isc_result_t
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
return (isc__socket_getpeername(sock, addressp));
}
+46 -619
View File
File diff suppressed because it is too large Load Diff
-8
View File
@@ -70,11 +70,7 @@ create_managers(unsigned int workers) {
char *p; char *p;
if (workers == 0) { if (workers == 0) {
#ifdef ISC_PLATFORM_USETHREADS
workers = isc_os_ncpus(); workers = isc_os_ncpus();
#else
workers = 1;
#endif
} }
p = getenv("ISC_TASK_WORKERS"); p = getenv("ISC_TASK_WORKERS");
@@ -123,11 +119,7 @@ isc_test_begin(FILE *logfile, isc_boolean_t start_managers,
CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL)); CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL));
} }
#ifdef ISC_PLATFORM_USETHREADS
ncpus = isc_os_ncpus(); ncpus = isc_os_ncpus();
#else
ncpus = 1;
#endif
if (start_managers) { if (start_managers) {
CHECK(create_managers(workers)); CHECK(create_managers(workers));
+3 -3
View File
@@ -273,7 +273,7 @@ ATF_TC_BODY(isc_mem_noflags, tc) {
isc_mem_debugging = 0; isc_mem_debugging = 0;
ptr = isc_mem_get(mctx2, 2048); ptr = isc_mem_get(mctx2, 2048);
ATF_CHECK(ptr != NULL); ATF_CHECK(ptr != NULL);
isc__mem_printactive(mctx2, f); isc_mem_printactive(mctx2, f);
isc_mem_put(mctx2, ptr, 2048); isc_mem_put(mctx2, ptr, 2048);
isc_mem_destroy(&mctx2); isc_mem_destroy(&mctx2);
isc_stdio_close(f); isc_stdio_close(f);
@@ -324,7 +324,7 @@ ATF_TC_BODY(isc_mem_recordflag, tc) {
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
ptr = isc_mem_get(mctx2, 2048); ptr = isc_mem_get(mctx2, 2048);
ATF_CHECK(ptr != NULL); ATF_CHECK(ptr != NULL);
isc__mem_printactive(mctx2, f); isc_mem_printactive(mctx2, f);
isc_mem_put(mctx2, ptr, 2048); isc_mem_put(mctx2, ptr, 2048);
isc_mem_destroy(&mctx2); isc_mem_destroy(&mctx2);
isc_stdio_close(f); isc_stdio_close(f);
@@ -375,7 +375,7 @@ ATF_TC_BODY(isc_mem_traceflag, tc) {
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
ptr = isc_mem_get(mctx2, 2048); ptr = isc_mem_get(mctx2, 2048);
ATF_CHECK(ptr != NULL); ATF_CHECK(ptr != NULL);
isc__mem_printactive(mctx2, f); isc_mem_printactive(mctx2, f);
isc_mem_put(mctx2, ptr, 2048); isc_mem_put(mctx2, ptr, 2048);
isc_mem_destroy(&mctx2); isc_mem_destroy(&mctx2);
isc_stdio_close(f); isc_stdio_close(f);
-17
View File
@@ -85,10 +85,6 @@ static isc_result_t
waitfor(completion_t *completion) { waitfor(completion_t *completion) {
int i = 0; int i = 0;
while (!completion->done && i++ < 5000) { while (!completion->done && i++ < 5000) {
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#endif
isc_test_nap(1000); isc_test_nap(1000);
} }
if (completion->done) if (completion->done)
@@ -111,19 +107,6 @@ waitfor(completion_t *completion) {
static void static void
waitbody(void) { waitbody(void) {
#ifndef ISC_PLATFORM_USETHREADS
struct timeval tv;
isc_socketwait_t *swait = NULL;
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
if (socketmgr != NULL) {
tv.tv_sec = 0;
tv.tv_usec = 1000 ;
if (isc__socketmgr_waitevents(socketmgr, &tv, &swait) > 0)
isc__socketmgr_dispatch(socketmgr, swait);
} else
#endif
isc_test_nap(1000); isc_test_nap(1000);
} }
-31
View File
@@ -41,9 +41,7 @@ int counter = 0;
static int active[10]; static int active[10];
static isc_boolean_t done = ISC_FALSE; static isc_boolean_t done = ISC_FALSE;
#ifdef ISC_PLATFORM_USETHREADS
static isc_condition_t cv; static isc_condition_t cv;
#endif
static void static void
set(isc_task_t *task, isc_event_t *event) { set(isc_task_t *task, isc_event_t *event) {
@@ -139,10 +137,6 @@ ATF_TC_BODY(all_events, tc) {
isc_task_send(task, &event); isc_task_send(task, &event);
while ((a == 0 || b == 0) && i++ < 5000) { while ((a == 0 || b == 0) && i++ < 5000) {
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#endif
isc_test_nap(1000); isc_test_nap(1000);
} }
@@ -176,13 +170,11 @@ ATF_TC_BODY(privileged_events, tc) {
result = isc_test_begin(NULL, ISC_TRUE, 0); result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Pause the task manager so we can fill up the work queue * Pause the task manager so we can fill up the work queue
* without things happening while we do it. * without things happening while we do it.
*/ */
isc__taskmgr_pause(taskmgr); isc__taskmgr_pause(taskmgr);
#endif
result = isc_task_create(taskmgr, 0, &task1); result = isc_task_create(taskmgr, 0, &task1);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
@@ -240,16 +232,10 @@ ATF_TC_BODY(privileged_events, tc) {
isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged); isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged);
ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged); ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged);
#ifdef ISC_PLATFORM_USETHREADS
isc__taskmgr_resume(taskmgr); isc__taskmgr_resume(taskmgr);
#endif
/* We're waiting for *all* variables to be set */ /* We're waiting for *all* variables to be set */
while ((a == 0 || b == 0 || c == 0 || d == 0 || e == 0) && i++ < 5000) { while ((a == 0 || b == 0 || c == 0 || d == 0 || e == 0) && i++ < 5000) {
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#endif
isc_test_nap(1000); isc_test_nap(1000);
} }
@@ -305,13 +291,11 @@ ATF_TC_BODY(privilege_drop, tc) {
result = isc_test_begin(NULL, ISC_TRUE, 0); result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Pause the task manager so we can fill up the work queue * Pause the task manager so we can fill up the work queue
* without things happening while we do it. * without things happening while we do it.
*/ */
isc__taskmgr_pause(taskmgr); isc__taskmgr_pause(taskmgr);
#endif
result = isc_task_create(taskmgr, 0, &task1); result = isc_task_create(taskmgr, 0, &task1);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
@@ -369,17 +353,11 @@ ATF_TC_BODY(privilege_drop, tc) {
isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged); isc_taskmgr_setmode(taskmgr, isc_taskmgrmode_privileged);
ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged); ATF_CHECK_EQ(isc_taskmgr_mode(taskmgr), isc_taskmgrmode_privileged);
#ifdef ISC_PLATFORM_USETHREADS
isc__taskmgr_resume(taskmgr); isc__taskmgr_resume(taskmgr);
#endif
/* We're waiting for all variables to be set. */ /* We're waiting for all variables to be set. */
while ((a == -1 || b == -1 || c == -1 || d == -1 || e == -1) && while ((a == -1 || b == -1 || c == -1 || d == -1 || e == -1) &&
i++ < 5000) { i++ < 5000) {
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#endif
isc_test_nap(1000); isc_test_nap(1000);
} }
@@ -646,10 +624,6 @@ ATF_TC_BODY(task_exclusive, tc) {
isc_test_end(); isc_test_end();
} }
/*
* The remainder of these tests require threads
*/
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Max tasks test: * Max tasks test:
* The task system can create and execute many tasks. Tests with 10000. * The task system can create and execute many tasks. Tests with 10000.
@@ -1447,7 +1421,6 @@ ATF_TC_HEAD(purgeevent_notpurge, tc) {
ATF_TC_BODY(purgeevent_notpurge, tc) { ATF_TC_BODY(purgeevent_notpurge, tc) {
try_purgeevent(ISC_FALSE); try_purgeevent(ISC_FALSE);
} }
#endif
/* /*
* Main * Main
@@ -1459,8 +1432,6 @@ ATF_TP_ADD_TCS(tp) {
ATF_TP_ADD_TC(tp, privilege_drop); ATF_TP_ADD_TC(tp, privilege_drop);
ATF_TP_ADD_TC(tp, basic); ATF_TP_ADD_TC(tp, basic);
ATF_TP_ADD_TC(tp, task_exclusive); ATF_TP_ADD_TC(tp, task_exclusive);
#ifdef ISC_PLATFORM_USETHREADS
ATF_TP_ADD_TC(tp, manytasks); ATF_TP_ADD_TC(tp, manytasks);
ATF_TP_ADD_TC(tp, shutdown); ATF_TP_ADD_TC(tp, shutdown);
ATF_TP_ADD_TC(tp, post_shutdown); ATF_TP_ADD_TC(tp, post_shutdown);
@@ -1468,8 +1439,6 @@ ATF_TP_ADD_TCS(tp) {
ATF_TP_ADD_TC(tp, purgerange); ATF_TP_ADD_TC(tp, purgerange);
ATF_TP_ADD_TC(tp, purgeevent); ATF_TP_ADD_TC(tp, purgeevent);
ATF_TP_ADD_TC(tp, purgeevent_notpurge); ATF_TP_ADD_TC(tp, purgeevent_notpurge);
#endif
return (atf_no_error()); return (atf_no_error());
} }
-20
View File
@@ -29,11 +29,6 @@
#include "isctest.h" #include "isctest.h"
/*
* This entire test requires threads.
*/
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Helper functions * Helper functions
*/ */
@@ -564,30 +559,15 @@ ATF_TC_BODY(purge, tc) {
isc_test_end(); isc_test_end();
} }
#else
ATF_TC(untested);
ATF_TC_HEAD(untested, tc) {
atf_tc_set_md_var(tc, "descr", "skipping nsec3 test");
}
ATF_TC_BODY(untested, tc) {
UNUSED(tc);
atf_tc_skip("DNSSEC not available");
}
#endif
/* /*
* Main * Main
*/ */
ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TCS(tp) {
#ifdef ISC_PLATFORM_USETHREADS
ATF_TP_ADD_TC(tp, ticker); ATF_TP_ADD_TC(tp, ticker);
ATF_TP_ADD_TC(tp, once_life); ATF_TP_ADD_TC(tp, once_life);
ATF_TP_ADD_TC(tp, once_idle); ATF_TP_ADD_TC(tp, once_idle);
ATF_TP_ADD_TC(tp, reset); ATF_TP_ADD_TC(tp, reset);
ATF_TP_ADD_TC(tp, purge); ATF_TP_ADD_TC(tp, purge);
#else
ATF_TP_ADD_TC(tp, untested);
#endif
return (atf_no_error()); return (atf_no_error());
} }
+13 -315
View File
@@ -34,17 +34,6 @@
#include <openssl/err.h> #include <openssl/err.h>
#endif #endif
/* See task.c about the following definition: */
#ifdef ISC_PLATFORM_USETHREADS
#define USE_TIMER_THREAD
#else
#define USE_SHARED_MANAGER
#endif /* ISC_PLATFORM_USETHREADS */
#ifndef USE_TIMER_THREAD
#include "timer_p.h"
#endif /* USE_TIMER_THREAD */
#ifdef ISC_TIMER_TRACE #ifdef ISC_TIMER_TRACE
#define XTRACE(s) fprintf(stderr, "%s\n", (s)) #define XTRACE(s) fprintf(stderr, "%s\n", (s))
#define XTRACEID(s, t) fprintf(stderr, "%s %p\n", (s), (t)) #define XTRACEID(s, t) fprintf(stderr, "%s %p\n", (s), (t))
@@ -101,80 +90,13 @@ struct isc__timermgr {
LIST(isc__timer_t) timers; LIST(isc__timer_t) timers;
unsigned int nscheduled; unsigned int nscheduled;
isc_time_t due; isc_time_t due;
#ifdef USE_TIMER_THREAD
isc_condition_t wakeup; isc_condition_t wakeup;
isc_thread_t thread; isc_thread_t thread;
#endif /* USE_TIMER_THREAD */
#ifdef USE_SHARED_MANAGER
unsigned int refs;
#endif /* USE_SHARED_MANAGER */
isc_heap_t * heap; isc_heap_t * heap;
}; };
/*%
* The following are intended for internal use (indicated by "isc__"
* prefix) but are not declared as static, allowing direct access from
* unit tests etc.
*/
isc_result_t
isc__timer_create(isc_timermgr_t *manager, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval,
isc_task_t *task, isc_taskaction_t action, void *arg,
isc_timer_t **timerp);
isc_result_t
isc__timer_reset(isc_timer_t *timer, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval,
isc_boolean_t purge);
isc_timertype_t
isc_timer_gettype(isc_timer_t *timer);
isc_result_t
isc__timer_touch(isc_timer_t *timer);
void
isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp);
void
isc__timer_detach(isc_timer_t **timerp);
isc_result_t
isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
void void
isc_timermgr_poke(isc_timermgr_t *manager0); isc_timermgr_poke(isc_timermgr_t *manager0);
void
isc__timermgr_destroy(isc_timermgr_t **managerp);
static struct isc__timermethods {
isc_timermethods_t methods;
/*%
* The following are defined just for avoiding unused static functions.
*/
void *gettype;
} timermethods = {
{
isc__timer_attach,
isc__timer_detach,
isc__timer_reset,
isc__timer_touch
},
(void *)isc_timer_gettype
};
static struct isc__timermgrmethods {
isc_timermgrmethods_t methods;
void *poke; /* see above */
} timermgrmethods = {
{
isc__timermgr_destroy,
isc__timer_create
},
(void *)isc_timermgr_poke
};
#ifdef USE_SHARED_MANAGER
/*!
* If the manager is supposed to be shared, there can be only one.
*/
static isc__timermgr_t *timermgr = NULL;
#endif /* USE_SHARED_MANAGER */
static inline isc_result_t static inline isc_result_t
schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) { schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
@@ -182,9 +104,7 @@ schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
isc__timermgr_t *manager; isc__timermgr_t *manager;
isc_time_t due; isc_time_t due;
int cmp; int cmp;
#ifdef USE_TIMER_THREAD
isc_boolean_t timedwait; isc_boolean_t timedwait;
#endif
/*! /*!
* Note: the caller must ensure locking. * Note: the caller must ensure locking.
@@ -192,20 +112,16 @@ schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
REQUIRE(timer->type != isc_timertype_inactive); REQUIRE(timer->type != isc_timertype_inactive);
#ifndef USE_TIMER_THREAD
UNUSED(signal_ok); UNUSED(signal_ok);
#endif /* USE_TIMER_THREAD */
manager = timer->manager; manager = timer->manager;
#ifdef USE_TIMER_THREAD
/*! /*!
* If the manager was timed wait, we may need to signal the * If the manager was timed wait, we may need to signal the
* manager to force a wakeup. * manager to force a wakeup.
*/ */
timedwait = ISC_TF(manager->nscheduled > 0 && timedwait = ISC_TF(manager->nscheduled > 0 &&
isc_time_seconds(&manager->due) != 0); isc_time_seconds(&manager->due) != 0);
#endif
/* /*
* Compute the new due time. * Compute the new due time.
@@ -268,7 +184,6 @@ schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
* the current "next" timer. We do this either by waking up the * the current "next" timer. We do this either by waking up the
* run thread, or explicitly setting the value in the manager. * run thread, or explicitly setting the value in the manager.
*/ */
#ifdef USE_TIMER_THREAD
/* /*
* This is a temporary (probably) hack to fix a bug on tru64 5.1 * This is a temporary (probably) hack to fix a bug on tru64 5.1
@@ -301,20 +216,13 @@ schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
"signal (schedule)")); "signal (schedule)"));
SIGNAL(&manager->wakeup); SIGNAL(&manager->wakeup);
} }
#else /* USE_TIMER_THREAD */
if (timer->index == 1 &&
isc_time_compare(&timer->due, &manager->due) < 0)
manager->due = timer->due;
#endif /* USE_TIMER_THREAD */
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
} }
static inline void static inline void
deschedule(isc__timer_t *timer) { deschedule(isc__timer_t *timer) {
#ifdef USE_TIMER_THREAD
isc_boolean_t need_wakeup = ISC_FALSE; isc_boolean_t need_wakeup = ISC_FALSE;
#endif
isc__timermgr_t *manager; isc__timermgr_t *manager;
/* /*
@@ -323,22 +231,18 @@ deschedule(isc__timer_t *timer) {
manager = timer->manager; manager = timer->manager;
if (timer->index > 0) { if (timer->index > 0) {
#ifdef USE_TIMER_THREAD
if (timer->index == 1) if (timer->index == 1)
need_wakeup = ISC_TRUE; need_wakeup = ISC_TRUE;
#endif
isc_heap_delete(manager->heap, timer->index); isc_heap_delete(manager->heap, timer->index);
timer->index = 0; timer->index = 0;
INSIST(manager->nscheduled > 0); INSIST(manager->nscheduled > 0);
manager->nscheduled--; manager->nscheduled--;
#ifdef USE_TIMER_THREAD
if (need_wakeup) { if (need_wakeup) {
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER, XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESCHED, ISC_MSG_SIGNALDESCHED,
"signal (deschedule)")); "signal (deschedule)"));
SIGNAL(&manager->wakeup); SIGNAL(&manager->wakeup);
} }
#endif /* USE_TIMER_THREAD */
} }
} }
@@ -370,10 +274,10 @@ destroy(isc__timer_t *timer) {
} }
isc_result_t isc_result_t
isc__timer_create(isc_timermgr_t *manager0, isc_timertype_t type, isc_timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval, const isc_time_t *expires, const isc_interval_t *interval,
isc_task_t *task, isc_taskaction_t action, void *arg, isc_task_t *task, isc_taskaction_t action, void *arg,
isc_timer_t **timerp) isc_timer_t **timerp)
{ {
isc__timermgr_t *manager = (isc__timermgr_t *)manager0; isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
isc__timer_t *timer; isc__timer_t *timer;
@@ -459,7 +363,6 @@ isc__timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
ISC_LINK_INIT(timer, link); ISC_LINK_INIT(timer, link);
timer->common.impmagic = TIMER_MAGIC; timer->common.impmagic = TIMER_MAGIC;
timer->common.magic = ISCAPI_TIMER_MAGIC; timer->common.magic = ISCAPI_TIMER_MAGIC;
timer->common.methods = (isc_timermethods_t *)&timermethods;
LOCK(&manager->lock); LOCK(&manager->lock);
@@ -492,9 +395,9 @@ isc__timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
} }
isc_result_t isc_result_t
isc__timer_reset(isc_timer_t *timer0, isc_timertype_t type, isc_timer_reset(isc_timer_t *timer0, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval, const isc_time_t *expires, const isc_interval_t *interval,
isc_boolean_t purge) isc_boolean_t purge)
{ {
isc__timer_t *timer = (isc__timer_t *)timer0; isc__timer_t *timer = (isc__timer_t *)timer0;
isc_time_t now; isc_time_t now;
@@ -582,7 +485,7 @@ isc_timer_gettype(isc_timer_t *timer0) {
} }
isc_result_t isc_result_t
isc__timer_touch(isc_timer_t *timer0) { isc_timer_touch(isc_timer_t *timer0) {
isc__timer_t *timer = (isc__timer_t *)timer0; isc__timer_t *timer = (isc__timer_t *)timer0;
isc_result_t result; isc_result_t result;
isc_time_t now; isc_time_t now;
@@ -613,7 +516,7 @@ isc__timer_touch(isc_timer_t *timer0) {
} }
void void
isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) { isc_timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
isc__timer_t *timer = (isc__timer_t *)timer0; isc__timer_t *timer = (isc__timer_t *)timer0;
/* /*
@@ -631,7 +534,7 @@ isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
} }
void void
isc__timer_detach(isc_timer_t **timerp) { isc_timer_detach(isc_timer_t **timerp) {
isc__timer_t *timer; isc__timer_t *timer;
isc_boolean_t free_timer = ISC_FALSE; isc_boolean_t free_timer = ISC_FALSE;
@@ -775,7 +678,6 @@ dispatch(isc__timermgr_t *manager, isc_time_t *now) {
} }
} }
#ifdef USE_TIMER_THREAD
static isc_threadresult_t static isc_threadresult_t
#ifdef _WIN32 /* XXXDCL */ #ifdef _WIN32 /* XXXDCL */
WINAPI WINAPI
@@ -820,7 +722,6 @@ run(void *uap) {
return ((isc_threadresult_t)0); return ((isc_threadresult_t)0);
} }
#endif /* USE_TIMER_THREAD */
static isc_boolean_t static isc_boolean_t
sooner(void *v1, void *v2) { sooner(void *v1, void *v2) {
@@ -847,7 +748,7 @@ set_index(void *what, unsigned int index) {
} }
isc_result_t isc_result_t
isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) { isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
isc__timermgr_t *manager; isc__timermgr_t *manager;
isc_result_t result; isc_result_t result;
@@ -857,21 +758,12 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
REQUIRE(managerp != NULL && *managerp == NULL); REQUIRE(managerp != NULL && *managerp == NULL);
#ifdef USE_SHARED_MANAGER
if (timermgr != NULL) {
timermgr->refs++;
*managerp = (isc_timermgr_t *)timermgr;
return (ISC_R_SUCCESS);
}
#endif /* USE_SHARED_MANAGER */
manager = isc_mem_get(mctx, sizeof(*manager)); manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL) if (manager == NULL)
return (ISC_R_NOMEMORY); return (ISC_R_NOMEMORY);
manager->common.impmagic = TIMER_MANAGER_MAGIC; manager->common.impmagic = TIMER_MANAGER_MAGIC;
manager->common.magic = ISCAPI_TIMERMGR_MAGIC; manager->common.magic = ISCAPI_TIMERMGR_MAGIC;
manager->common.methods = (isc_timermgrmethods_t *)&timermgrmethods;
manager->mctx = NULL; manager->mctx = NULL;
manager->done = ISC_FALSE; manager->done = ISC_FALSE;
INIT_LIST(manager->timers); INIT_LIST(manager->timers);
@@ -891,7 +783,6 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
return (result); return (result);
} }
isc_mem_attach(mctx, &manager->mctx); isc_mem_attach(mctx, &manager->mctx);
#ifdef USE_TIMER_THREAD
if (isc_condition_init(&manager->wakeup) != ISC_R_SUCCESS) { if (isc_condition_init(&manager->wakeup) != ISC_R_SUCCESS) {
isc_mem_detach(&manager->mctx); isc_mem_detach(&manager->mctx);
DESTROYLOCK(&manager->lock); DESTROYLOCK(&manager->lock);
@@ -917,11 +808,6 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
return (ISC_R_UNEXPECTED); return (ISC_R_UNEXPECTED);
} }
isc_thread_setname(manager->thread, "isc-timer"); isc_thread_setname(manager->thread, "isc-timer");
#endif
#ifdef USE_SHARED_MANAGER
manager->refs = 1;
timermgr = manager;
#endif /* USE_SHARED_MANAGER */
*managerp = (isc_timermgr_t *)manager; *managerp = (isc_timermgr_t *)manager;
@@ -930,19 +816,15 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
void void
isc_timermgr_poke(isc_timermgr_t *manager0) { isc_timermgr_poke(isc_timermgr_t *manager0) {
#ifdef USE_TIMER_THREAD
isc__timermgr_t *manager = (isc__timermgr_t *)manager0; isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager)); REQUIRE(VALID_MANAGER(manager));
SIGNAL(&manager->wakeup); SIGNAL(&manager->wakeup);
#else
UNUSED(manager0);
#endif
} }
void void
isc__timermgr_destroy(isc_timermgr_t **managerp) { isc_timermgr_destroy(isc_timermgr_t **managerp) {
isc__timermgr_t *manager; isc__timermgr_t *manager;
isc_mem_t *mctx; isc_mem_t *mctx;
@@ -956,32 +838,15 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) {
LOCK(&manager->lock); LOCK(&manager->lock);
#ifdef USE_SHARED_MANAGER
manager->refs--;
if (manager->refs > 0) {
UNLOCK(&manager->lock);
*managerp = NULL;
return;
}
timermgr = NULL;
#endif /* USE_SHARED_MANAGER */
#ifndef USE_TIMER_THREAD
isc__timermgr_dispatch((isc_timermgr_t *)manager);
#endif
REQUIRE(EMPTY(manager->timers)); REQUIRE(EMPTY(manager->timers));
manager->done = ISC_TRUE; manager->done = ISC_TRUE;
#ifdef USE_TIMER_THREAD
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER, XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESTROY, "signal (destroy)")); ISC_MSG_SIGNALDESTROY, "signal (destroy)"));
SIGNAL(&manager->wakeup); SIGNAL(&manager->wakeup);
#endif /* USE_TIMER_THREAD */
UNLOCK(&manager->lock); UNLOCK(&manager->lock);
#ifdef USE_TIMER_THREAD
/* /*
* Wait for thread to exit. * Wait for thread to exit.
*/ */
@@ -990,14 +855,11 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) {
"isc_thread_join() %s", "isc_thread_join() %s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed")); ISC_MSG_FAILED, "failed"));
#endif /* USE_TIMER_THREAD */
/* /*
* Clean up. * Clean up.
*/ */
#ifdef USE_TIMER_THREAD
(void)isc_condition_destroy(&manager->wakeup); (void)isc_condition_destroy(&manager->wakeup);
#endif /* USE_TIMER_THREAD */
DESTROYLOCK(&manager->lock); DESTROYLOCK(&manager->lock);
isc_heap_destroy(&manager->heap); isc_heap_destroy(&manager->heap);
manager->common.impmagic = 0; manager->common.impmagic = 0;
@@ -1008,70 +870,6 @@ isc__timermgr_destroy(isc_timermgr_t **managerp) {
*managerp = NULL; *managerp = NULL;
#ifdef USE_SHARED_MANAGER
timermgr = NULL;
#endif
}
#ifndef USE_TIMER_THREAD
isc_result_t
isc__timermgr_nextevent(isc_timermgr_t *manager0, isc_time_t *when) {
isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
#ifdef USE_SHARED_MANAGER
if (manager == NULL)
manager = timermgr;
#endif
if (manager == NULL || manager->nscheduled == 0)
return (ISC_R_NOTFOUND);
*when = manager->due;
return (ISC_R_SUCCESS);
}
void
isc__timermgr_dispatch(isc_timermgr_t *manager0) {
isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
isc_time_t now;
#ifdef USE_SHARED_MANAGER
if (manager == NULL)
manager = timermgr;
#endif
if (manager == NULL)
return;
TIME_NOW(&now);
dispatch(manager, &now);
}
#endif /* USE_TIMER_THREAD */
isc_result_t
isc__timer_register(void) {
return (isc_timer_register(isc__timermgr_create));
}
static isc_mutex_t createlock;
static isc_once_t once = ISC_ONCE_INIT;
static isc_timermgrcreatefunc_t timermgr_createfunc = NULL;
static void
initialize(void) {
RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
}
isc_result_t
isc_timer_register(isc_timermgrcreatefunc_t createfunc) {
isc_result_t result = ISC_R_SUCCESS;
RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
LOCK(&createlock);
if (timermgr_createfunc == NULL)
timermgr_createfunc = createfunc;
else
result = ISC_R_EXISTS;
UNLOCK(&createlock);
return (result);
} }
isc_result_t isc_result_t
@@ -1080,110 +878,10 @@ isc_timermgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
{ {
isc_result_t result; isc_result_t result;
LOCK(&createlock); result = isc_timermgr_create(mctx, managerp);
REQUIRE(timermgr_createfunc != NULL);
result = (*timermgr_createfunc)(mctx, managerp);
UNLOCK(&createlock);
if (result == ISC_R_SUCCESS) if (result == ISC_R_SUCCESS)
isc_appctx_settimermgr(actx, *managerp); isc_appctx_settimermgr(actx, *managerp);
return (result); return (result);
} }
isc_result_t
isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
isc_result_t result;
if (isc_bind9)
return (isc__timermgr_create(mctx, managerp));
LOCK(&createlock);
REQUIRE(timermgr_createfunc != NULL);
result = (*timermgr_createfunc)(mctx, managerp);
UNLOCK(&createlock);
return (result);
}
void
isc_timermgr_destroy(isc_timermgr_t **managerp) {
REQUIRE(*managerp != NULL && ISCAPI_TIMERMGR_VALID(*managerp));
if (isc_bind9)
isc__timermgr_destroy(managerp);
else
(*managerp)->methods->destroy(managerp);
ENSURE(*managerp == NULL);
}
isc_result_t
isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval,
isc_task_t *task, isc_taskaction_t action, void *arg,
isc_timer_t **timerp)
{
REQUIRE(ISCAPI_TIMERMGR_VALID(manager));
if (isc_bind9)
return (isc__timer_create(manager, type, expires, interval,
task, action, arg, timerp));
return (manager->methods->timercreate(manager, type, expires,
interval, task, action, arg,
timerp));
}
void
isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
REQUIRE(ISCAPI_TIMER_VALID(timer));
REQUIRE(timerp != NULL && *timerp == NULL);
if (isc_bind9)
isc__timer_attach(timer, timerp);
else
timer->methods->attach(timer, timerp);
ENSURE(*timerp == timer);
}
void
isc_timer_detach(isc_timer_t **timerp) {
REQUIRE(timerp != NULL && ISCAPI_TIMER_VALID(*timerp));
if (isc_bind9)
isc__timer_detach(timerp);
else
(*timerp)->methods->detach(timerp);
ENSURE(*timerp == NULL);
}
isc_result_t
isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
const isc_time_t *expires, const isc_interval_t *interval,
isc_boolean_t purge)
{
REQUIRE(ISCAPI_TIMER_VALID(timer));
if (isc_bind9)
return (isc__timer_reset(timer, type, expires,
interval, purge));
return (timer->methods->reset(timer, type, expires, interval, purge));
}
isc_result_t
isc_timer_touch(isc_timer_t *timer) {
REQUIRE(ISCAPI_TIMER_VALID(timer));
if (isc_bind9)
return (isc__timer_touch(timer));
return (timer->methods->touch(timer));
}
+35 -313
View File
@@ -40,9 +40,7 @@
#include <isc/time.h> #include <isc/time.h>
#include <isc/util.h> #include <isc/util.h>
#ifdef ISC_PLATFORM_USETHREADS
#include <pthread.h> #include <pthread.h>
#endif
/*% /*%
* For BIND9 internal applications built with threads, we use a single app * For BIND9 internal applications built with threads, we use a single app
@@ -50,42 +48,8 @@
* For other cases (including BIND9 built without threads) an app context acts * For other cases (including BIND9 built without threads) an app context acts
* as an event loop dispatching various events. * as an event loop dispatching various events.
*/ */
#ifndef ISC_PLATFORM_USETHREADS
#include "../timer_p.h"
#include "socket_p.h"
#endif /* ISC_PLATFORM_USETHREADS */
#ifdef ISC_PLATFORM_USETHREADS
static pthread_t blockedthread; static pthread_t blockedthread;
#endif /* ISC_PLATFORM_USETHREADS */ static isc_boolean_t is_running;
/*%
* The following are intended for internal use (indicated by "isc__"
* prefix) but are not declared as static, allowing direct access from
* unit tests etc.
*/
isc_result_t isc__app_start(void);
isc_result_t isc__app_ctxstart(isc_appctx_t *ctx);
isc_result_t isc__app_onrun(isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg);
isc_result_t isc__app_ctxrun(isc_appctx_t *ctx);
isc_result_t isc__app_run(void);
isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
isc_result_t isc__app_shutdown(void);
isc_result_t isc__app_reload(void);
isc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
void isc__app_ctxfinish(isc_appctx_t *ctx);
void isc__app_finish(void);
void isc__app_block(void);
void isc__app_unblock(void);
isc_result_t isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
void isc__appctx_destroy(isc_appctx_t **ctxp);
void isc__appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
void isc__appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
void isc__appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
isc_result_t isc__app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx,
isc_task_t *task, isc_taskaction_t action,
void *arg);
/* /*
* The application context of this module. This implementation actually * The application context of this module. This implementation actually
@@ -116,43 +80,12 @@ typedef struct isc__appctx {
isc_taskmgr_t *taskmgr; isc_taskmgr_t *taskmgr;
isc_socketmgr_t *socketmgr; isc_socketmgr_t *socketmgr;
isc_timermgr_t *timermgr; isc_timermgr_t *timermgr;
#ifdef ISC_PLATFORM_USETHREADS
isc_mutex_t readylock; isc_mutex_t readylock;
isc_condition_t ready; isc_condition_t ready;
#endif /* ISC_PLATFORM_USETHREADS */
} isc__appctx_t; } isc__appctx_t;
static isc__appctx_t isc_g_appctx; static isc__appctx_t isc_g_appctx;
static struct {
isc_appmethods_t methods;
/*%
* The following are defined just for avoiding unused static functions.
*/
void *run, *shutdown, *start, *reload, *finish, *block, *unblock;
} appmethods = {
{
isc__appctx_destroy,
isc__app_ctxstart,
isc__app_ctxrun,
isc__app_ctxsuspend,
isc__app_ctxshutdown,
isc__app_ctxfinish,
isc__appctx_settaskmgr,
isc__appctx_setsocketmgr,
isc__appctx_settimermgr,
isc__app_ctxonrun
},
(void *)isc__app_run,
(void *)isc__app_shutdown,
(void *)isc__app_start,
(void *)isc__app_reload,
(void *)isc__app_finish,
(void *)isc__app_block,
(void *)isc__app_unblock
};
#ifdef HAVE_LINUXTHREADS #ifdef HAVE_LINUXTHREADS
/*! /*!
* Linux has sigwait(), but it appears to prevent signal handlers from * Linux has sigwait(), but it appears to prevent signal handlers from
@@ -204,7 +137,7 @@ handle_signal(int sig, void (*handler)(int)) {
} }
isc_result_t isc_result_t
isc__app_ctxstart(isc_appctx_t *ctx0) { isc_app_ctxstart(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_result_t result; isc_result_t result;
int presult; int presult;
@@ -230,7 +163,6 @@ isc__app_ctxstart(isc_appctx_t *ctx0) {
} }
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
#ifdef HAVE_LINUXTHREADS #ifdef HAVE_LINUXTHREADS
main_thread = pthread_self(); main_thread = pthread_self();
#endif /* HAVE_LINUXTHREADS */ #endif /* HAVE_LINUXTHREADS */
@@ -243,14 +175,9 @@ isc__app_ctxstart(isc_appctx_t *ctx0) {
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
goto cleanup_rlock; goto cleanup_rlock;
result = isc_mutex_init(&ctx->lock);
if (result != ISC_R_SUCCESS)
goto cleanup_rcond;
#else /* ISC_PLATFORM_USETHREADS */
result = isc_mutex_init(&ctx->lock); result = isc_mutex_init(&ctx->lock);
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
goto cleanup; goto cleanup;
#endif /* ISC_PLATFORM_USETHREADS */
ISC_LIST_INIT(ctx->on_run); ISC_LIST_INIT(ctx->on_run);
@@ -305,7 +232,6 @@ isc__app_ctxstart(isc_appctx_t *ctx0) {
goto cleanup; goto cleanup;
#endif #endif
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* Block SIGHUP, SIGINT, SIGTERM. * Block SIGHUP, SIGINT, SIGTERM.
* *
@@ -334,68 +260,37 @@ isc__app_ctxstart(isc_appctx_t *ctx0) {
result = ISC_R_UNEXPECTED; result = ISC_R_UNEXPECTED;
goto cleanup; goto cleanup;
} }
#else /* ISC_PLATFORM_USETHREADS */
/*
* Unblock SIGHUP, SIGINT, SIGTERM.
*
* If we're not using threads, we need to make sure that SIGHUP,
* SIGINT and SIGTERM are not inherited as blocked from the parent
* process.
*/
if (sigemptyset(&sset) != 0 ||
sigaddset(&sset, SIGHUP) != 0 ||
sigaddset(&sset, SIGINT) != 0 ||
sigaddset(&sset, SIGTERM) != 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
"isc_app_start() sigsetops: %s", strbuf);
result = ISC_R_UNEXPECTED;
goto cleanup;
}
presult = sigprocmask(SIG_UNBLOCK, &sset, NULL);
if (presult != 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
"isc_app_start() sigprocmask: %s", strbuf);
result = ISC_R_UNEXPECTED;
goto cleanup;
}
#endif /* ISC_PLATFORM_USETHREADS */
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
cleanup: cleanup:
#ifdef ISC_PLATFORM_USETHREADS
cleanup_rcond:
(void)isc_condition_destroy(&ctx->ready); (void)isc_condition_destroy(&ctx->ready);
cleanup_rlock: cleanup_rlock:
(void)isc_mutex_destroy(&ctx->readylock); (void)isc_mutex_destroy(&ctx->readylock);
#endif /* ISC_PLATFORM_USETHREADS */
return (result); return (result);
} }
isc_result_t isc_result_t
isc__app_start(void) { isc_app_start(void) {
isc_g_appctx.common.impmagic = APPCTX_MAGIC; isc_g_appctx.common.impmagic = APPCTX_MAGIC;
isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC; isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC;
isc_g_appctx.common.methods = &appmethods.methods;
isc_g_appctx.mctx = NULL; isc_g_appctx.mctx = NULL;
/* The remaining members will be initialized in ctxstart() */ /* The remaining members will be initialized in ctxstart() */
return (isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxstart((isc_appctx_t *)&isc_g_appctx));
} }
isc_result_t isc_result_t
isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action, isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg) void *arg)
{ {
return (isc__app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx, return (isc_app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx,
task, action, arg)); task, action, arg));
} }
isc_result_t isc_result_t
isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task, isc_app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg) isc_taskaction_t action, void *arg)
{ {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
@@ -433,159 +328,17 @@ isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
return (result); return (result);
} }
#ifndef ISC_PLATFORM_USETHREADS
/*!
* Event loop for nonthreaded programs.
*/
static isc_result_t
evloop(isc__appctx_t *ctx) {
isc_result_t result;
while (!ctx->want_shutdown) {
int n;
isc_time_t when, now;
struct timeval tv, *tvp;
isc_socketwait_t *swait;
isc_boolean_t readytasks;
isc_boolean_t call_timer_dispatch = ISC_FALSE;
/*
* Check the reload (or suspend) case first for exiting the
* loop as fast as possible in case:
* - the direct call to isc__taskmgr_dispatch() in
* isc__app_ctxrun() completes all the tasks so far,
* - there is thus currently no active task, and
* - there is a timer event
*/
if (ctx->want_reload) {
ctx->want_reload = ISC_FALSE;
return (ISC_R_RELOAD);
}
readytasks = isc__taskmgr_ready(ctx->taskmgr);
if (readytasks) {
tv.tv_sec = 0;
tv.tv_usec = 0;
tvp = &tv;
call_timer_dispatch = ISC_TRUE;
} else {
result = isc__timermgr_nextevent(ctx->timermgr, &when);
if (result != ISC_R_SUCCESS)
tvp = NULL;
else {
isc_uint64_t us;
TIME_NOW(&now);
us = isc_time_microdiff(&when, &now);
if (us == 0)
call_timer_dispatch = ISC_TRUE;
tv.tv_sec = us / 1000000;
tv.tv_usec = us % 1000000;
tvp = &tv;
}
}
swait = NULL;
n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait);
if (n == 0 || call_timer_dispatch) {
/*
* We call isc__timermgr_dispatch() only when
* necessary, in order to reduce overhead. If the
* select() call indicates a timeout, we need the
* dispatch. Even if not, if we set the 0-timeout
* for the select() call, we need to check the timer
* events. In the 'readytasks' case, there may be no
* timeout event actually, but there is no other way
* to reduce the overhead.
* Note that we do not have to worry about the case
* where a new timer is inserted during the select()
* call, since this loop only runs in the non-thread
* mode.
*/
isc__timermgr_dispatch(ctx->timermgr);
}
if (n > 0)
(void)isc__socketmgr_dispatch(ctx->socketmgr, swait);
(void)isc__taskmgr_dispatch(ctx->taskmgr);
}
return (ISC_R_SUCCESS);
}
/*
* This is a gross hack to support waiting for condition
* variables in nonthreaded programs in a limited way;
* see lib/isc/nothreads/include/isc/condition.h.
* We implement isc_condition_wait() by entering the
* event loop recursively until the want_shutdown flag
* is set by isc_condition_signal().
*/
/*!
* \brief True if we are currently executing in the recursive
* event loop.
*/
static isc_boolean_t in_recursive_evloop = ISC_FALSE;
/*!
* \brief True if we are exiting the event loop as the result of
* a call to isc_condition_signal() rather than a shutdown
* or reload.
*/
static isc_boolean_t signalled = ISC_FALSE;
isc_result_t isc_result_t
isc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) { isc_app_ctxrun(isc_appctx_t *ctx0) {
isc_result_t result;
UNUSED(cp);
UNUSED(mp);
INSIST(!in_recursive_evloop);
in_recursive_evloop = ISC_TRUE;
INSIST(*mp == 1); /* Mutex must be locked on entry. */
--*mp;
result = evloop(&isc_g_appctx);
if (result == ISC_R_RELOAD)
isc_g_appctx.want_reload = ISC_TRUE;
if (signalled) {
isc_g_appctx.want_shutdown = ISC_FALSE;
signalled = ISC_FALSE;
}
++*mp;
in_recursive_evloop = ISC_FALSE;
return (ISC_R_SUCCESS);
}
isc_result_t
isc__nothread_signal_hack(isc_condition_t *cp) {
UNUSED(cp);
INSIST(in_recursive_evloop);
isc_g_appctx.want_shutdown = ISC_TRUE;
signalled = ISC_TRUE;
return (ISC_R_SUCCESS);
}
#endif /* ISC_PLATFORM_USETHREADS */
isc_result_t
isc__app_ctxrun(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
int result; int result;
isc_event_t *event, *next_event; isc_event_t *event, *next_event;
isc_task_t *task; isc_task_t *task;
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset; sigset_t sset;
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
#ifdef HAVE_SIGWAIT #ifdef HAVE_SIGWAIT
int sig; int sig;
#endif /* HAVE_SIGWAIT */ #endif /* HAVE_SIGWAIT */
#endif /* ISC_PLATFORM_USETHREADS */
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -615,17 +368,6 @@ isc__app_ctxrun(isc_appctx_t *ctx0) {
UNLOCK(&ctx->lock); UNLOCK(&ctx->lock);
#ifndef ISC_PLATFORM_USETHREADS
if (isc_bind9 && ctx == &isc_g_appctx) {
result = handle_signal(SIGHUP, reload_action);
if (result != ISC_R_SUCCESS)
return (ISC_R_SUCCESS);
}
(void) isc__taskmgr_dispatch(ctx->taskmgr);
result = evloop(ctx);
return (result);
#else /* ISC_PLATFORM_USETHREADS */
/* /*
* BIND9 internal tools using multiple contexts do not * BIND9 internal tools using multiple contexts do not
* rely on signal. * rely on signal.
@@ -745,21 +487,27 @@ isc__app_ctxrun(isc_appctx_t *ctx0) {
} }
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
#endif /* ISC_PLATFORM_USETHREADS */
} }
isc_result_t isc_result_t
isc__app_run(void) { isc_app_run(void) {
return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx)); isc_result_t result;
is_running = ISC_TRUE;
result = isc_app_ctxrun((isc_appctx_t *)&isc_g_appctx);
is_running = ISC_FALSE;
return result;
}
isc_boolean_t
isc_app_isrunning() {
return (is_running);
} }
isc_result_t isc_result_t
isc__app_ctxshutdown(isc_appctx_t *ctx0) { isc_app_ctxshutdown(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE; isc_boolean_t want_kill = ISC_TRUE;
#ifdef ISC_PLATFORM_USETHREADS
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
#endif /* ISC_PLATFORM_USETHREADS */
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -779,9 +527,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) {
/* BIND9 internal, but using multiple contexts */ /* BIND9 internal, but using multiple contexts */
ctx->want_shutdown = ISC_TRUE; ctx->want_shutdown = ISC_TRUE;
else { else {
#ifndef ISC_PLATFORM_USETHREADS
ctx->want_shutdown = ISC_TRUE;
#else /* ISC_PLATFORM_USETHREADS */
#ifdef HAVE_LINUXTHREADS #ifdef HAVE_LINUXTHREADS
if (isc_bind9) { if (isc_bind9) {
/* BIND9 internal, single context */ /* BIND9 internal, single context */
@@ -818,7 +563,6 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) {
UNLOCK(&ctx->readylock); UNLOCK(&ctx->readylock);
SIGNAL(&ctx->ready); SIGNAL(&ctx->ready);
} }
#endif /* ISC_PLATFORM_USETHREADS */
} }
} }
@@ -826,17 +570,15 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_shutdown(void) { isc_app_shutdown(void) {
return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
} }
isc_result_t isc_result_t
isc__app_ctxsuspend(isc_appctx_t *ctx0) { isc_app_ctxsuspend(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE; isc_boolean_t want_kill = ISC_TRUE;
#ifdef ISC_PLATFORM_USETHREADS
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
#endif
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -857,9 +599,6 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) {
/* BIND9 internal, but using multiple contexts */ /* BIND9 internal, but using multiple contexts */
ctx->want_reload = ISC_TRUE; ctx->want_reload = ISC_TRUE;
else { else {
#ifndef ISC_PLATFORM_USETHREADS
ctx->want_reload = ISC_TRUE;
#else /* ISC_PLATFORM_USETHREADS */
#ifdef HAVE_LINUXTHREADS #ifdef HAVE_LINUXTHREADS
if (isc_bind9) { if (isc_bind9) {
/* BIND9 internal, single context */ /* BIND9 internal, single context */
@@ -896,7 +635,6 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) {
UNLOCK(&ctx->readylock); UNLOCK(&ctx->readylock);
SIGNAL(&ctx->ready); SIGNAL(&ctx->ready);
} }
#endif /* ISC_PLATFORM_USETHREADS */
} }
} }
@@ -904,12 +642,12 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_reload(void) { isc_app_reload(void) {
return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
} }
void void
isc__app_ctxfinish(isc_appctx_t *ctx0) { isc_app_ctxfinish(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -918,51 +656,43 @@ isc__app_ctxfinish(isc_appctx_t *ctx0) {
} }
void void
isc__app_finish(void) { isc_app_finish(void) {
isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx); isc_app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
} }
void void
isc__app_block(void) { isc_app_block(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset; sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
REQUIRE(isc_g_appctx.running); REQUIRE(isc_g_appctx.running);
REQUIRE(!isc_g_appctx.blocked); REQUIRE(!isc_g_appctx.blocked);
isc_g_appctx.blocked = ISC_TRUE; isc_g_appctx.blocked = ISC_TRUE;
#ifdef ISC_PLATFORM_USETHREADS
blockedthread = pthread_self(); blockedthread = pthread_self();
RUNTIME_CHECK(sigemptyset(&sset) == 0 && RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
sigaddset(&sset, SIGINT) == 0 && sigaddset(&sset, SIGINT) == 0 &&
sigaddset(&sset, SIGTERM) == 0); sigaddset(&sset, SIGTERM) == 0);
RUNTIME_CHECK(pthread_sigmask(SIG_UNBLOCK, &sset, NULL) == 0); RUNTIME_CHECK(pthread_sigmask(SIG_UNBLOCK, &sset, NULL) == 0);
#endif /* ISC_PLATFORM_USETHREADS */
} }
void void
isc__app_unblock(void) { isc_app_unblock(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset; sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
REQUIRE(isc_g_appctx.running); REQUIRE(isc_g_appctx.running);
REQUIRE(isc_g_appctx.blocked); REQUIRE(isc_g_appctx.blocked);
isc_g_appctx.blocked = ISC_FALSE; isc_g_appctx.blocked = ISC_FALSE;
#ifdef ISC_PLATFORM_USETHREADS
REQUIRE(blockedthread == pthread_self()); REQUIRE(blockedthread == pthread_self());
RUNTIME_CHECK(sigemptyset(&sset) == 0 && RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
sigaddset(&sset, SIGINT) == 0 && sigaddset(&sset, SIGINT) == 0 &&
sigaddset(&sset, SIGTERM) == 0); sigaddset(&sset, SIGTERM) == 0);
RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0); RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0);
#endif /* ISC_PLATFORM_USETHREADS */
} }
isc_result_t isc_result_t
isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) { isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
isc__appctx_t *ctx; isc__appctx_t *ctx;
REQUIRE(mctx != NULL); REQUIRE(mctx != NULL);
@@ -974,7 +704,6 @@ isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
ctx->common.impmagic = APPCTX_MAGIC; ctx->common.impmagic = APPCTX_MAGIC;
ctx->common.magic = ISCAPI_APPCTX_MAGIC; ctx->common.magic = ISCAPI_APPCTX_MAGIC;
ctx->common.methods = &appmethods.methods;
ctx->mctx = NULL; ctx->mctx = NULL;
isc_mem_attach(mctx, &ctx->mctx); isc_mem_attach(mctx, &ctx->mctx);
@@ -989,7 +718,7 @@ isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
} }
void void
isc__appctx_destroy(isc_appctx_t **ctxp) { isc_appctx_destroy(isc_appctx_t **ctxp) {
isc__appctx_t *ctx; isc__appctx_t *ctx;
REQUIRE(ctxp != NULL); REQUIRE(ctxp != NULL);
@@ -1002,7 +731,7 @@ isc__appctx_destroy(isc_appctx_t **ctxp) {
} }
void void
isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) { isc_appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -1011,7 +740,7 @@ isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
} }
void void
isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) { isc_appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -1020,17 +749,10 @@ isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
} }
void void
isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) { isc_appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
ctx->timermgr = timermgr; ctx->timermgr = timermgr;
} }
isc_result_t
isc__app_register(void) {
return (isc_app_register(isc__appctx_create));
}
#include "../app_api.c"
+58 -532
View File
File diff suppressed because it is too large Load Diff
-42
View File
@@ -379,9 +379,7 @@ void
isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -389,11 +387,7 @@ isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t) t->seconds; now = (time_t) t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%d-%b-%Y %X", localtime_r(&now, &tm)); flen = strftime(buf, len, "%d-%b-%Y %X", localtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%d-%b-%Y %X", localtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
if (flen != 0) if (flen != 0)
snprintf(buf + flen, len - flen, snprintf(buf + flen, len - flen,
@@ -407,9 +401,7 @@ void
isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -420,12 +412,8 @@ isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
* 5 spaces, 1 comma, 3 GMT, 2 %d, 4 %Y, 8 %H:%M:%S, 3+ %a, 3+ %b (29+) * 5 spaces, 1 comma, 3 GMT, 2 %d, 4 %Y, 8 %H:%M:%S, 3+ %a, 3+ %b (29+)
*/ */
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT",
gmtime_r(&now, &tm)); gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
} }
@@ -452,9 +440,7 @@ void
isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -462,11 +448,7 @@ isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) {
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
} }
@@ -474,9 +456,7 @@ void
isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -484,11 +464,7 @@ isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) {
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
if (flen > 0U && len - flen >= 6) { if (flen > 0U && len - flen >= 6) {
snprintf(buf + flen, len - flen, ".%03u", snprintf(buf + flen, len - flen, ".%03u",
@@ -500,9 +476,7 @@ void
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -510,11 +484,7 @@ isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm)); flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
} }
@@ -522,9 +492,7 @@ void
isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) { isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -532,11 +500,7 @@ isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) {
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm)); flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
if (flen > 0U && len - flen >= 5) { if (flen > 0U && len - flen >= 5) {
flen -= 1; /* rewind one character (Z) */ flen -= 1; /* rewind one character (Z) */
@@ -550,9 +514,7 @@ isc_time_formatshorttimestamp(const isc_time_t *t, char *buf, unsigned int len)
{ {
time_t now; time_t now;
unsigned int flen; unsigned int flen;
#ifdef ISC_PLATFORM_USETHREADS
struct tm tm; struct tm tm;
#endif
REQUIRE(t != NULL); REQUIRE(t != NULL);
INSIST(t->nanoseconds < NS_PER_S); INSIST(t->nanoseconds < NS_PER_S);
@@ -560,11 +522,7 @@ isc_time_formatshorttimestamp(const isc_time_t *t, char *buf, unsigned int len)
REQUIRE(len > 0); REQUIRE(len > 0);
now = (time_t)t->seconds; now = (time_t)t->seconds;
#ifdef ISC_PLATFORM_USETHREADS
flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime_r(&now, &tm)); flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime_r(&now, &tm));
#else
flen = strftime(buf, len, "%Y%m%d%H%M%S", gmtime(&now));
#endif
INSIST(flen < len); INSIST(flen < len);
if (flen > 0U && len - flen >= 5) { if (flen > 0U && len - flen >= 5) {
snprintf(buf + flen, len - flen, "%03u", snprintf(buf + flen, len - flen, "%03u",
+36 -87
View File
@@ -40,39 +40,8 @@
*/ */
static isc_thread_t blockedthread; static isc_thread_t blockedthread;
static isc_boolean_t is_running;
/*%
* The following are intended for internal use (indicated by "isc__"
* prefix) but are not declared as static, allowing direct access from
* unit tests etc.
*/
isc_result_t isc__app_start(void);
isc_result_t isc__app_ctxstart(isc_appctx_t *ctx);
isc_result_t isc__app_onrun(isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg);
isc_result_t isc__app_ctxrun(isc_appctx_t *ctx);
isc_result_t isc__app_run(void);
isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
isc_result_t isc__app_shutdown(void);
isc_result_t isc__app_reload(void);
isc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
void isc__app_ctxfinish(isc_appctx_t *ctx);
void isc__app_finish(void);
void isc__app_block(void);
void isc__app_unblock(void);
isc_result_t isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
void isc__appctx_destroy(isc_appctx_t **ctxp);
void isc__appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
void isc__appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
void isc__appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
isc_result_t isc__app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx,
isc_task_t *task, isc_taskaction_t action,
void *arg);
/*
* The application context of this module. This implementation actually
* doesn't use it. (This may change in the future).
*/
#define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x') #define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x')
#define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC) #define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC)
@@ -112,42 +81,13 @@ typedef struct isc__appctx {
static isc__appctx_t isc_g_appctx; static isc__appctx_t isc_g_appctx;
static struct {
isc_appmethods_t methods;
/*%
* The following are defined just for avoiding unused static functions.
*/
void *run, *shutdown, *start, *reload, *finish, *block, *unblock;
} appmethods = {
{
isc__appctx_destroy,
isc__app_ctxstart,
isc__app_ctxrun,
isc__app_ctxsuspend,
isc__app_ctxshutdown,
isc__app_ctxfinish,
isc__appctx_settaskmgr,
isc__appctx_setsocketmgr,
isc__appctx_settimermgr,
isc__app_ctxonrun
},
(void *)isc__app_run,
(void *)isc__app_shutdown,
(void *)isc__app_start,
(void *)isc__app_reload,
(void *)isc__app_finish,
(void *)isc__app_block,
(void *)isc__app_unblock
};
/* /*
* We need to remember which thread is the main thread... * We need to remember which thread is the main thread...
*/ */
static isc_thread_t main_thread; static isc_thread_t main_thread;
isc_result_t isc_result_t
isc__app_ctxstart(isc_appctx_t *ctx0) { isc_app_ctxstart(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_result_t result; isc_result_t result;
@@ -180,26 +120,26 @@ isc__app_ctxstart(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_start(void) { isc_app_start(void) {
isc_g_appctx.common.impmagic = APPCTX_MAGIC; isc_g_appctx.common.impmagic = APPCTX_MAGIC;
isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC; isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC;
isc_g_appctx.common.methods = &appmethods.methods; isc_g_appctx.common.methods = &appmethods.methods;
isc_g_appctx.mctx = NULL; isc_g_appctx.mctx = NULL;
/* The remaining members will be initialized in ctxstart() */ /* The remaining members will be initialized in ctxstart() */
return (isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxstart((isc_appctx_t *)&isc_g_appctx));
} }
isc_result_t isc_result_t
isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action, isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg) void *arg)
{ {
return (isc__app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx, return (isc_app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx,
task, action, arg)); task, action, arg));
} }
isc_result_t isc_result_t
isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task, isc_app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
isc_taskaction_t action, void *arg) isc_taskaction_t action, void *arg)
{ {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
@@ -238,7 +178,7 @@ isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
} }
isc_result_t isc_result_t
isc__app_ctxrun(isc_appctx_t *ctx0) { isc_app_ctxrun(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_event_t *event, *next_event; isc_event_t *event, *next_event;
isc_task_t *task; isc_task_t *task;
@@ -311,12 +251,21 @@ isc__app_ctxrun(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_run(void) { isc_app_run(void) {
return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx)); isc_result_t result;
is_running = ISC_TRUE;
result = isc_app_ctxrun((isc_appctx_t *)&isc_g_appctx);
is_running = ISC_FALSE;
return result;
}
isc_boolean_t
isc_app_isrunning() {
return (is_running);
} }
isc_result_t isc_result_t
isc__app_ctxshutdown(isc_appctx_t *ctx0) { isc_app_ctxshutdown(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE; isc_boolean_t want_kill = ISC_TRUE;
@@ -340,12 +289,12 @@ isc__app_ctxshutdown(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_shutdown(void) { isc_app_shutdown(void) {
return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
} }
isc_result_t isc_result_t
isc__app_ctxsuspend(isc_appctx_t *ctx0) { isc_app_ctxsuspend(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE; isc_boolean_t want_kill = ISC_TRUE;
@@ -370,12 +319,12 @@ isc__app_ctxsuspend(isc_appctx_t *ctx0) {
} }
isc_result_t isc_result_t
isc__app_reload(void) { isc_app_reload(void) {
return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx)); return (isc_app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
} }
void void
isc__app_ctxfinish(isc_appctx_t *ctx0) { isc_app_ctxfinish(isc_appctx_t *ctx0) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -384,12 +333,12 @@ isc__app_ctxfinish(isc_appctx_t *ctx0) {
} }
void void
isc__app_finish(void) { isc_app_finish(void) {
isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx); isc_app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
} }
void void
isc__app_block(void) { isc_app_block(void) {
REQUIRE(isc_g_appctx.running); REQUIRE(isc_g_appctx.running);
REQUIRE(!isc_g_appctx.blocked); REQUIRE(!isc_g_appctx.blocked);
@@ -398,7 +347,7 @@ isc__app_block(void) {
} }
void void
isc__app_unblock(void) { isc_app_unblock(void) {
REQUIRE(isc_g_appctx.running); REQUIRE(isc_g_appctx.running);
REQUIRE(isc_g_appctx.blocked); REQUIRE(isc_g_appctx.blocked);
@@ -407,7 +356,7 @@ isc__app_unblock(void) {
} }
isc_result_t isc_result_t
isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) { isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
isc__appctx_t *ctx; isc__appctx_t *ctx;
REQUIRE(mctx != NULL); REQUIRE(mctx != NULL);
@@ -434,7 +383,7 @@ isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
} }
void void
isc__appctx_destroy(isc_appctx_t **ctxp) { isc_appctx_destroy(isc_appctx_t **ctxp) {
isc__appctx_t *ctx; isc__appctx_t *ctx;
REQUIRE(ctxp != NULL); REQUIRE(ctxp != NULL);
@@ -447,7 +396,7 @@ isc__appctx_destroy(isc_appctx_t **ctxp) {
} }
void void
isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) { isc_appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -456,7 +405,7 @@ isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
} }
void void
isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) { isc_appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -465,7 +414,7 @@ isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
} }
void void
isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) { isc_appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
isc__appctx_t *ctx = (isc__appctx_t *)ctx0; isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
REQUIRE(VALID_APPCTX(ctx)); REQUIRE(VALID_APPCTX(ctx));
@@ -474,7 +423,7 @@ isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
} }
isc_result_t isc_result_t
isc__app_register(void) { isc_app_register(void) {
return (isc_app_register(isc__appctx_create)); return (isc_app_register(isc__appctx_create));
} }
-2
View File
@@ -16,8 +16,6 @@
***** Platform-dependent defines. ***** Platform-dependent defines.
*****/ *****/
#define ISC_PLATFORM_USETHREADS 1
/* /*
* Some compatibility cludges * Some compatibility cludges
*/ */
+73 -73
View File
@@ -9,25 +9,25 @@ closelog
getpassphrase getpassphrase
@END PKCS11 @END PKCS11
isc___socketmgr_maxudp isc___socketmgr_maxudp
isc__app_block isc_app_block
isc__app_ctxfinish isc_app_ctxfinish
isc__app_ctxonrun isc_app_ctxonrun
isc__app_ctxrun isc_app_ctxrun
isc__app_ctxshutdown isc_app_ctxshutdown
isc__app_ctxstart isc_app_ctxstart
isc__app_ctxsuspend isc_app_ctxsuspend
isc__app_finish isc_app_finish
isc__app_onrun isc_app_onrun
isc__app_reload isc_app_reload
isc__app_run isc_app_run
isc__app_shutdown isc_app_shutdown
isc__app_start isc_app_start
isc__app_unblock isc_app_unblock
isc__appctx_create isc_appctx_create
isc__appctx_destroy isc_appctx_destroy
isc__appctx_setsocketmgr isc_appctx_setsocketmgr
isc__appctx_settaskmgr isc_appctx_settaskmgr
isc__appctx_settimermgr isc_appctx_settimermgr
isc__buffer_activeregion isc__buffer_activeregion
isc__buffer_add isc__buffer_add
isc__buffer_availableregion isc__buffer_availableregion
@@ -51,61 +51,61 @@ isc__buffer_remainingregion
isc__buffer_setactive isc__buffer_setactive
isc__buffer_subtract isc__buffer_subtract
isc__buffer_usedregion isc__buffer_usedregion
isc__mem_allocate isc_mem_allocate
isc__mem_free isc_mem_free
isc__mem_get isc_mem_get
isc__mem_printactive isc_mem_printactive
isc__mem_put isc_mem_put
isc__mem_putanddetach isc_mem_putanddetach
isc__mem_reallocate isc_mem_reallocate
isc__mem_strdup isc_mem_strdup
isc__mempool_get isc_mempool_get
isc__mempool_put isc_mempool_put
isc__socket_accept isc_socket_accept
isc__socket_attach isc_socket_attach
isc__socket_bind isc_socket_bind
isc__socket_cancel isc_socket_cancel
isc__socket_cleanunix isc_socket_cleanunix
isc__socket_close isc_socket_close
isc__socket_connect isc_socket_connect
isc__socket_create isc_socket_create
isc__socket_detach isc_socket_detach
isc__socket_dscp isc_socket_dscp
isc__socket_dup isc_socket_dup
isc__socket_filter isc_socket_filter
isc__socket_getfd isc_socket_getfd
isc__socket_getname isc_socket_getname
isc__socket_getpeername isc_socket_getpeername
isc__socket_getsockname isc_socket_getsockname
isc__socket_gettag isc_socket_gettag
isc__socket_gettype isc_socket_gettype
isc__socket_ipv6only isc_socket_ipv6only
isc__socket_isbound isc_socket_isbound
isc__socket_listen isc_socket_listen
isc__socket_open isc_socket_open
isc__socket_permunix isc_socket_permunix
isc__socket_recv isc_socket_recv
isc__socket_recv2 isc_socket_recv2
isc__socket_recvv isc_socket_recvv
isc__socket_register isc_socket_register
isc__socket_send isc_socket_send
isc__socket_sendto isc_socket_sendto
isc__socket_sendto2 isc_socket_sendto2
isc__socket_sendtov isc_socket_sendtov
isc__socket_sendtov2 isc_socket_sendtov2
isc__socket_sendv isc_socket_sendv
isc__socket_setname isc_socket_setname
isc__socketmgr_create isc_socketmgr_create
isc__socketmgr_create2 isc_socketmgr_create2
isc__socketmgr_destroy isc_socketmgr_destroy
isc__socketmgr_getmaxsockets isc_socketmgr_getmaxsockets
isc__socketmgr_setreserved isc_socketmgr_setreserved
isc__socketmgr_setstats isc_socketmgr_setstats
isc__strerror isc__strerror
isc__task_getname isc_task_getname
isc__task_gettag isc_task_gettag
isc__task_unsendrange isc_task_unsendrange
isc__taskmgr_mode isc_taskmgr_mode
isc__taskmgr_pause isc__taskmgr_pause
isc__taskmgr_resume isc__taskmgr_resume
isc_aes128_crypt isc_aes128_crypt
+46 -91
View File
@@ -1810,19 +1810,19 @@ socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
if (dup_socket) { if (dup_socket) {
#ifndef ISC_ALLOW_MAPPED #ifndef ISC_ALLOW_MAPPED
isc__socket_ipv6only(sock, ISC_TRUE); isc_socket_ipv6only(sock, ISC_TRUE);
#endif #endif
if (dup_socket->bound) { if (dup_socket->bound) {
isc_sockaddr_t local; isc_sockaddr_t local;
result = isc__socket_getsockname(dup_socket, &local); result = isc_socket_getsockname(dup_socket, &local);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
isc_socket_close(sock); isc_socket_close(sock);
return (result); return (result);
} }
result = isc__socket_bind(sock, &local, result = isc_socket_bind(sock, &local,
ISC_SOCKET_REUSEADDRESS); ISC_SOCKET_REUSEADDRESS);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
isc_socket_close(sock); isc_socket_close(sock);
return (result); return (result);
@@ -1848,14 +1848,14 @@ socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
} }
isc_result_t isc_result_t
isc__socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
isc_socket_t **socketp) isc_socket_t **socketp)
{ {
return (socket_create(manager, pf, type, socketp, NULL)); return (socket_create(manager, pf, type, socketp, NULL));
} }
isc_result_t isc_result_t
isc__socket_dup(isc_socket_t *sock, isc_socket_t **socketp) { isc_socket_dup(isc_socket_t *sock, isc_socket_t **socketp) {
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
REQUIRE(socketp != NULL && *socketp == NULL); REQUIRE(socketp != NULL && *socketp == NULL);
@@ -1875,7 +1875,7 @@ isc_socket_open(isc_socket_t *sock) {
* Attach to a socket. Caller must explicitly detach when it is done. * Attach to a socket. Caller must explicitly detach when it is done.
*/ */
void void
isc__socket_attach(isc_socket_t *sock, isc_socket_t **socketp) { isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
REQUIRE(socketp != NULL && *socketp == NULL); REQUIRE(socketp != NULL && *socketp == NULL);
@@ -1892,7 +1892,7 @@ isc__socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
* up by destroying the socket. * up by destroying the socket.
*/ */
void void
isc__socket_detach(isc_socket_t **socketp) { isc_socket_detach(isc_socket_t **socketp) {
isc_socket_t *sock; isc_socket_t *sock;
REQUIRE(socketp != NULL); REQUIRE(socketp != NULL);
@@ -2650,12 +2650,12 @@ SocketIoThread(LPVOID ThreadContext) {
* Create a new socket manager. * Create a new socket manager.
*/ */
isc_result_t isc_result_t
isc__socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) { isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
return (isc_socketmgr_create2(mctx, managerp, 0)); return (isc_socketmgr_create2(mctx, managerp, 0));
} }
isc_result_t isc_result_t
isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
unsigned int maxsocks) unsigned int maxsocks)
{ {
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
@@ -2723,7 +2723,7 @@ isc_socketmgr_setstats(isc_socketmgr_t *manager, isc_stats_t *stats) {
} }
void void
isc__socketmgr_destroy(isc_socketmgr_t **managerp) { isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
int i; int i;
isc_mem_t *mctx; isc_mem_t *mctx;
@@ -2848,7 +2848,7 @@ socket_recv(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
} }
isc_result_t isc_result_t
isc__socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist, isc;_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
unsigned int minimum, isc_task_t *task, unsigned int minimum, isc_task_t *task,
isc_taskaction_t action, void *arg) isc_taskaction_t action, void *arg)
{ {
@@ -2919,7 +2919,7 @@ isc__socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
} }
isc_result_t isc_result_t
isc__socket_recv(isc_socket_t *sock, isc_region_t *region, isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task, unsigned int minimum, isc_task_t *task,
isc_taskaction_t action, void *arg) isc_taskaction_t action, void *arg)
{ {
@@ -2958,7 +2958,7 @@ isc__socket_recv(isc_socket_t *sock, isc_region_t *region,
} }
isc_result_t isc_result_t
isc__socket_recv2(isc_socket_t *sock, isc_region_t *region, isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task, unsigned int minimum, isc_task_t *task,
isc_socketevent_t *event, unsigned int flags) isc_socketevent_t *event, unsigned int flags)
{ {
@@ -3069,7 +3069,7 @@ socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
} }
isc_result_t isc_result_t
isc__socket_send(isc_socket_t *sock, isc_region_t *region, isc_socket_send(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
/* /*
@@ -3080,7 +3080,7 @@ isc__socket_send(isc_socket_t *sock, isc_region_t *region,
} }
isc_result_t isc_result_t
isc__socket_sendto(isc_socket_t *sock, isc_region_t *region, isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, void *arg, isc_task_t *task, isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo) const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{ {
@@ -3124,7 +3124,7 @@ isc__socket_sendto(isc_socket_t *sock, isc_region_t *region,
} }
isc_result_t isc_result_t
isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist, isc_socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
return (isc_socket_sendtov2(sock, buflist, task, action, arg, NULL, return (isc_socket_sendtov2(sock, buflist, task, action, arg, NULL,
@@ -3132,8 +3132,8 @@ isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
} }
isc_result_t isc_result_t
isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist, isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg, isc_task_t *task, isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo) const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{ {
return (isc_socket_sendtov2(sock, buflist, task, action, arg, address, return (isc_socket_sendtov2(sock, buflist, task, action, arg, address,
@@ -3141,10 +3141,10 @@ isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
} }
isc_result_t isc_result_t
isc__socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist, isc_socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist,
isc_task_t *task, isc_taskaction_t action, void *arg, isc_task_t *task, isc_taskaction_t action, void *arg,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo, const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
unsigned int flags) unsigned int flags)
{ {
isc_socketevent_t *dev; isc_socketevent_t *dev;
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
@@ -3198,9 +3198,9 @@ isc__socket_sendtov2(isc_socket_t *sock, isc_bufferlist_t *buflist,
} }
isc_result_t isc_result_t
isc__socket_sendto2(isc_socket_t *sock, isc_region_t *region, isc_task_t *task, isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region, isc_task_t *task,
const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo, const isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
isc_socketevent_t *event, unsigned int flags) isc_socketevent_t *event, unsigned int flags)
{ {
isc_result_t ret; isc_result_t ret;
@@ -3232,8 +3232,8 @@ isc__socket_sendto2(isc_socket_t *sock, isc_region_t *region, isc_task_t *task,
} }
isc_result_t isc_result_t
isc__socket_bind(isc_socket_t *sock, const isc_sockaddr_t *sockaddr, isc_socket_bind(isc_socket_t *sock, const isc_sockaddr_t *sockaddr,
isc_socket_options_t options) isc_socket_options_t options)
{ {
int bind_errno; int bind_errno;
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
@@ -3300,7 +3300,7 @@ isc__socket_bind(isc_socket_t *sock, const isc_sockaddr_t *sockaddr,
} }
isc_result_t isc_result_t
isc__socket_filter(isc_socket_t *sock, const char *filter) { isc_socket_filter(isc_socket_t *sock, const char *filter) {
UNUSED(sock); UNUSED(sock);
UNUSED(filter); UNUSED(filter);
@@ -3319,7 +3319,7 @@ isc__socket_filter(isc_socket_t *sock, const char *filter) {
* as well keep things simple rather than having to track them. * as well keep things simple rather than having to track them.
*/ */
isc_result_t isc_result_t
isc__socket_listen(isc_socket_t *sock, unsigned int backlog) { isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
#if defined(ISC_PLATFORM_HAVETFO) && defined(TCP_FASTOPEN) #if defined(ISC_PLATFORM_HAVETFO) && defined(TCP_FASTOPEN)
char on = 1; char on = 1;
@@ -3378,8 +3378,8 @@ isc__socket_listen(isc_socket_t *sock, unsigned int backlog) {
* This should try to do aggressive accept() XXXMLG * This should try to do aggressive accept() XXXMLG
*/ */
isc_result_t isc_result_t
isc__socket_accept(isc_socket_t *sock, isc_socket_accept(isc_socket_t *sock,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
isc_socket_newconnev_t *adev; isc_socket_newconnev_t *adev;
isc_socketmgr_t *manager; isc_socketmgr_t *manager;
@@ -3496,8 +3496,8 @@ isc__socket_accept(isc_socket_t *sock,
} }
isc_result_t isc_result_t
isc__socket_connect(isc_socket_t *sock, const isc_sockaddr_t *addr, isc_socket_connect(isc_socket_t *sock, const isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action, void *arg) isc_task_t *task, isc_taskaction_t action, void *arg)
{ {
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
isc_socket_connev_t *cdev; isc_socket_connev_t *cdev;
@@ -3627,7 +3627,7 @@ isc__socket_connect(isc_socket_t *sock, const isc_sockaddr_t *addr,
} }
isc_result_t isc_result_t
isc__socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) { isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
isc_result_t result; isc_result_t result;
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
@@ -3657,7 +3657,7 @@ isc__socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
} }
isc_result_t isc_result_t
isc__socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) { isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
ISC_SOCKADDR_LEN_T len; ISC_SOCKADDR_LEN_T len;
isc_result_t result; isc_result_t result;
char strbuf[ISC_STRERRORSIZE]; char strbuf[ISC_STRERRORSIZE];
@@ -3704,7 +3704,7 @@ isc__socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
* queued for task "task" of type "how". "how" is a bitmask. * queued for task "task" of type "how". "how" is a bitmask.
*/ */
void void
isc__socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) { isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
@@ -3830,7 +3830,7 @@ isc__socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
} }
isc_sockettype_t isc_sockettype_t
isc__socket_gettype(isc_socket_t *sock) { isc_socket_gettype(isc_socket_t *sock) {
isc_sockettype_t type; isc_sockettype_t type;
REQUIRE(VALID_SOCKET(sock)); REQUIRE(VALID_SOCKET(sock));
@@ -3850,31 +3850,8 @@ isc__socket_gettype(isc_socket_t *sock) {
return (type); return (type);
} }
isc_boolean_t
isc__socket_isbound(isc_socket_t *sock) {
isc_boolean_t val;
REQUIRE(VALID_SOCKET(sock));
LOCK(&sock->lock);
CONSISTENT(sock);
/*
* make sure that the socket's not closed
*/
if (sock->fd == INVALID_SOCKET) {
UNLOCK(&sock->lock);
return (ISC_FALSE);
}
val = ((sock->bound) ? ISC_TRUE : ISC_FALSE);
UNLOCK(&sock->lock);
return (val);
}
void void
isc__socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) { isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
#if defined(IPV6_V6ONLY) #if defined(IPV6_V6ONLY)
int onoff = yes ? 1 : 0; int onoff = yes ? 1 : 0;
#else #else
@@ -3892,7 +3869,7 @@ isc__socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
} }
void void
isc__socket_dscp(isc_socket_t *sock, isc_dscp_t dscp) { isc_socket_dscp(isc_socket_t *sock, isc_dscp_t dscp) {
#if !defined(IP_TOS) && !defined(IPV6_TCLASS) #if !defined(IP_TOS) && !defined(IPV6_TCLASS)
UNUSED(dscp); UNUSED(dscp);
#else #else
@@ -3920,13 +3897,13 @@ isc__socket_dscp(isc_socket_t *sock, isc_dscp_t dscp) {
} }
void void
isc__socket_cleanunix(const isc_sockaddr_t *addr, isc_boolean_t active) { isc_socket_cleanunix(const isc_sockaddr_t *addr, isc_boolean_t active) {
UNUSED(addr); UNUSED(addr);
UNUSED(active); UNUSED(active);
} }
isc_result_t isc_result_t
isc__socket_permunix(const isc_sockaddr_t *addr, isc_uint32_t perm, isc_socket_permunix(const isc_sockaddr_t *addr, isc_uint32_t perm,
isc_uint32_t owner, isc_uint32_t group) isc_uint32_t owner, isc_uint32_t group)
{ {
UNUSED(addr); UNUSED(addr);
@@ -3937,7 +3914,7 @@ isc__socket_permunix(const isc_sockaddr_t *addr, isc_uint32_t perm,
} }
void void
isc__socket_setname(isc_socket_t *socket, const char *name, void *tag) { isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
/* /*
* Name 'socket'. * Name 'socket'.
@@ -3952,33 +3929,26 @@ isc__socket_setname(isc_socket_t *socket, const char *name, void *tag) {
} }
const char * const char *
isc__socket_getname(isc_socket_t *socket) { isc_socket_getname(isc_socket_t *socket) {
return (socket->name); return (socket->name);
} }
void * void *
isc__socket_gettag(isc_socket_t *socket) { isc_socket_gettag(isc_socket_t *socket) {
return (socket->tag); return (socket->tag);
} }
int int
isc__socket_getfd(isc_socket_t *socket) { isc_socket_getfd(isc_socket_t *socket) {
return ((short) socket->fd); return ((short) socket->fd);
} }
void void
isc__socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) { isc_socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) {
UNUSED(manager); UNUSED(manager);
UNUSED(reserved); UNUSED(reserved);
} }
void
isc___socketmgr_maxudp(isc_socketmgr_t *manager, int maxudp) {
UNUSED(manager);
UNUSED(maxudp);
}
isc_socketevent_t * isc_socketevent_t *
isc_socket_socketevent(isc_mem_t *mctx, void *sender, isc_socket_socketevent(isc_mem_t *mctx, void *sender,
isc_eventtype_t eventtype, isc_taskaction_t action, isc_eventtype_t eventtype, isc_taskaction_t action,
@@ -4015,12 +3985,6 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer)
LOCK(&mgr->lock); LOCK(&mgr->lock);
#ifndef ISC_PLATFORM_USETHREADS
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs));
TRY0(xmlTextWriterEndElement(writer));
#endif
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets"));
sock = ISC_LIST_HEAD(mgr->socklist); sock = ISC_LIST_HEAD(mgr->socklist);
while (sock != NULL) { while (sock != NULL) {
@@ -4252,15 +4216,6 @@ isc_socketmgr_renderjson(isc_socketmgr_t *mgr, json_object *stats) {
} }
#endif /* HAVE_JSON */ #endif /* HAVE_JSON */
/*
* Replace ../socket_api.c
*/
isc_result_t
isc__socket_register(void) {
return (ISC_R_SUCCESS);
}
isc_result_t isc_result_t
isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx, isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
isc_socketmgr_t **managerp) isc_socketmgr_t **managerp)
-16
View File
@@ -26,9 +26,7 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
isc_int32_t prev = val; isc_int32_t prev = val;
__asm__ volatile( __asm__ volatile(
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xadd %0, %1" "xadd %0, %1"
:"=q"(prev) :"=q"(prev)
:"m"(*p), "0"(prev) :"m"(*p), "0"(prev)
@@ -43,9 +41,7 @@ isc_atomic_xaddq(isc_int64_t *p, isc_int64_t val) {
isc_int64_t prev = val; isc_int64_t prev = val;
__asm__ volatile( __asm__ volatile(
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xaddq %0, %1" "xaddq %0, %1"
:"=q"(prev) :"=q"(prev)
:"m"(*p), "0"(prev) :"m"(*p), "0"(prev)
@@ -61,13 +57,11 @@ isc_atomic_xaddq(isc_int64_t *p, isc_int64_t val) {
static __inline__ void static __inline__ void
isc_atomic_store(isc_int32_t *p, isc_int32_t val) { isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
__asm__ volatile( __asm__ volatile(
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* xchg should automatically lock memory, but we add it * xchg should automatically lock memory, but we add it
* explicitly just in case (it at least doesn't harm) * explicitly just in case (it at least doesn't harm)
*/ */
"lock;" "lock;"
#endif
"xchgl %1, %0" "xchgl %1, %0"
: :
@@ -82,13 +76,11 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
static __inline__ void static __inline__ void
isc_atomic_storeq(isc_int64_t *p, isc_int64_t val) { isc_atomic_storeq(isc_int64_t *p, isc_int64_t val) {
__asm__ volatile( __asm__ volatile(
#ifdef ISC_PLATFORM_USETHREADS
/* /*
* xchg should automatically lock memory, but we add it * xchg should automatically lock memory, but we add it
* explicitly just in case (it at least doesn't harm) * explicitly just in case (it at least doesn't harm)
*/ */
"lock;" "lock;"
#endif
"xchgq %1, %0" "xchgq %1, %0"
: :
@@ -105,9 +97,7 @@ isc_atomic_storeq(isc_int64_t *p, isc_int64_t val) {
static __inline__ isc_int32_t static __inline__ isc_int32_t
isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) { isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
__asm__ volatile( __asm__ volatile(
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"cmpxchgl %1, %2" "cmpxchgl %1, %2"
: "=a"(cmpval) : "=a"(cmpval)
: "r"(val), "m"(*p), "a"(cmpval) : "r"(val), "m"(*p), "a"(cmpval)
@@ -132,9 +122,7 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
__asm ( __asm (
"movl 8(%ebp), %ecx\n" "movl 8(%ebp), %ecx\n"
"movl 12(%ebp), %edx\n" "movl 12(%ebp), %edx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xadd %edx, (%ecx)\n" "xadd %edx, (%ecx)\n"
/* /*
@@ -154,9 +142,7 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
__asm ( __asm (
"movl 8(%ebp), %ecx\n" "movl 8(%ebp), %ecx\n"
"movl 12(%ebp), %edx\n" "movl 12(%ebp), %edx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xchgl (%ecx), %edx\n" "xchgl (%ecx), %edx\n"
); );
} }
@@ -171,9 +157,7 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
"movl 8(%ebp), %ecx\n" "movl 8(%ebp), %ecx\n"
"movl 12(%ebp), %eax\n" /* must be %eax for cmpxchgl */ "movl 12(%ebp), %eax\n" /* must be %eax for cmpxchgl */
"movl 16(%ebp), %edx\n" "movl 16(%ebp), %edx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
/* /*
* If (%ecx) == %eax then (%ecx) := %edx. * If (%ecx) == %eax then (%ecx) := %edx.
-10
View File
@@ -38,9 +38,7 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
__asm ( __asm (
"movq %rdi, %rdx\n" "movq %rdi, %rdx\n"
"movl %esi, %eax\n" "movl %esi, %eax\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xadd %eax, (%rdx)\n" "xadd %eax, (%rdx)\n"
/* /*
* XXX: assume %eax will be used as the return value. * XXX: assume %eax will be used as the return value.
@@ -57,9 +55,7 @@ isc_atomic_xaddq(isc_int64_t *p, isc_int64_t val) {
__asm ( __asm (
"movq %rdi, %rdx\n" "movq %rdi, %rdx\n"
"movq %rsi, %rax\n" "movq %rsi, %rax\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xaddq %rax, (%rdx)\n" "xaddq %rax, (%rdx)\n"
/* /*
* XXX: assume %rax will be used as the return value. * XXX: assume %rax will be used as the return value.
@@ -76,9 +72,7 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
__asm ( __asm (
"movq %rdi, %rax\n" "movq %rdi, %rax\n"
"movl %esi, %edx\n" "movl %esi, %edx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xchgl (%rax), %edx\n" "xchgl (%rax), %edx\n"
); );
} }
@@ -92,9 +86,7 @@ isc_atomic_storeq(isc_int64_t *p, isc_int64_t val) {
__asm ( __asm (
"movq %rdi, %rax\n" "movq %rdi, %rax\n"
"movq %rsi, %rdx\n" "movq %rsi, %rdx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
"xchgq (%rax), %rdx\n" "xchgq (%rax), %rdx\n"
); );
} }
@@ -114,9 +106,7 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
"movl %esi, %eax\n" "movl %esi, %eax\n"
"movq %rdi, %rdx\n" "movq %rdi, %rdx\n"
#ifdef ISC_PLATFORM_USETHREADS
"lock;" "lock;"
#endif
/* /*
* If [%rdi] == %eax then [%rdi] := %ecx (equal to %edx * If [%rdi] == %eax then [%rdi] := %ecx (equal to %edx
* from above), and %eax is untouched (equal to %esi) * from above), and %eax is untouched (equal to %esi)
-5
View File
@@ -34,7 +34,6 @@
* *
* The state must be seeded so that it is not everywhere zero. * The state must be seeded so that it is not everywhere zero.
*/ */
#if defined(ISC_PLATFORM_USETHREADS)
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
#include <windows.h> #include <windows.h>
static volatile HANDLE _mutex = NULL; static volatile HANDLE _mutex = NULL;
@@ -65,10 +64,6 @@ static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
#define _LOCK() pthread_mutex_lock(&_mutex) #define _LOCK() pthread_mutex_lock(&_mutex)
#define _UNLOCK() pthread_mutex_unlock(&_mutex) #define _UNLOCK() pthread_mutex_unlock(&_mutex)
#endif /* defined(_WIN32) || defined(_WIN64) */ #endif /* defined(_WIN32) || defined(_WIN64) */
#else /* defined(ISC_PLATFORM_USETHREADS) */
#define _LOCK()
#define _UNLOCK()
#endif
static inline isc_uint32_t rotl(const isc_uint32_t x, int k) { static inline isc_uint32_t rotl(const isc_uint32_t x, int k) {
return (x << k) | (x >> (32 - k)); return (x << k) | (x >> (32 - k));
-8
View File
@@ -99,7 +99,6 @@
#define SEND_BUFFER_SIZE 4096 #define SEND_BUFFER_SIZE 4096
#define RECV_BUFFER_SIZE 4096 #define RECV_BUFFER_SIZE 4096
#ifdef ISC_PLATFORM_USETHREADS
#define NMCTXS 100 #define NMCTXS 100
/*%< /*%<
* Number of 'mctx pools' for clients. (Should this be configurable?) * Number of 'mctx pools' for clients. (Should this be configurable?)
@@ -109,13 +108,6 @@
* completely avoiding contentions among threads for an authoritative-only * completely avoiding contentions among threads for an authoritative-only
* server. * server.
*/ */
#else
#define NMCTXS 0
/*%<
* If named with built without thread, simply share manager's context. Using
* a separate context in this case would simply waste memory.
*/
#endif
#define COOKIE_SIZE 24U /* 8 + 4 + 4 + 8 */ #define COOKIE_SIZE 24U /* 8 + 4 + 4 + 8 */
#define ECS_SIZE 20U /* 2 + 1 + 1 + [0..16] */ #define ECS_SIZE 20U /* 2 + 1 + 1 + [0..16] */
-14
View File
@@ -140,17 +140,12 @@ cleanup_managers(void) {
} }
while (run_managers && !shutdown_done) { while (run_managers && !shutdown_done) {
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#else
/* /*
* There's no straightforward way to determine * There's no straightforward way to determine
* whether all the clients have shut down, so * whether all the clients have shut down, so
* we'll just sleep for a bit and hope. * we'll just sleep for a bit and hope.
*/ */
ns_test_nap(500000); ns_test_nap(500000);
#endif
} }
if (sctx != NULL) if (sctx != NULL)
@@ -176,11 +171,7 @@ create_managers(void) {
isc_result_t result; isc_result_t result;
ns_listenlist_t *listenon = NULL; ns_listenlist_t *listenon = NULL;
isc_event_t *event = NULL; isc_event_t *event = NULL;
#ifdef ISC_PLATFORM_USETHREADS
ncpus = isc_os_ncpus(); ncpus = isc_os_ncpus();
#else
ncpus = 1;
#endif
CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr)); CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr));
CHECK(isc_task_create(taskmgr, 0, &maintask)); CHECK(isc_task_create(taskmgr, 0, &maintask));
@@ -210,17 +201,12 @@ create_managers(void) {
scan_interfaces, NULL, scan_interfaces, NULL,
sizeof (isc_event_t)); sizeof (isc_event_t));
isc_task_send(maintask, &event); isc_task_send(maintask, &event);
#ifndef ISC_PLATFORM_USETHREADS
while (isc__taskmgr_ready(taskmgr))
isc__taskmgr_dispatch(taskmgr);
#else
/* /*
* There's no straightforward way to determine * There's no straightforward way to determine
* whether the interfaces have been scanned, * whether the interfaces have been scanned,
* we'll just sleep for a bit and hope. * we'll just sleep for a bit and hope.
*/ */
ns_test_nap(500000); ns_test_nap(500000);
#endif
run_managers = ISC_TRUE; run_managers = ISC_TRUE;
-2
View File
@@ -3407,7 +3407,6 @@
./lib/isc/alpha/include/isc/Makefile.in MAKE 2007,2012,2015,2016,2018 ./lib/isc/alpha/include/isc/Makefile.in MAKE 2007,2012,2015,2016,2018
./lib/isc/alpha/include/isc/atomic.h C 2005,2007,2009,2016,2018 ./lib/isc/alpha/include/isc/atomic.h C 2005,2007,2009,2016,2018
./lib/isc/api X 1999,2000,2001,2006,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 ./lib/isc/api X 1999,2000,2001,2006,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018
./lib/isc/app_api.c C 2009,2013,2014,2015,2016,2018
./lib/isc/assertions.c C 1997,1998,1999,2000,2001,2004,2005,2007,2008,2009,2015,2016,2018 ./lib/isc/assertions.c C 1997,1998,1999,2000,2001,2004,2005,2007,2008,2009,2015,2016,2018
./lib/isc/backtrace-emptytbl.c C 2009,2016,2018 ./lib/isc/backtrace-emptytbl.c C 2009,2016,2018
./lib/isc/backtrace.c C 2009,2013,2014,2015,2016,2018 ./lib/isc/backtrace.c C 2009,2013,2014,2015,2016,2018
@@ -3604,7 +3603,6 @@
./lib/isc/sha1.c C 2000,2001,2003,2004,2005,2007,2009,2011,2012,2014,2016,2017,2018 ./lib/isc/sha1.c C 2000,2001,2003,2004,2005,2007,2009,2011,2012,2014,2016,2017,2018
./lib/isc/sha2.c C 2005,2006,2007,2009,2011,2012,2014,2016,2017,2018 ./lib/isc/sha2.c C 2005,2006,2007,2009,2011,2012,2014,2016,2017,2018
./lib/isc/sockaddr.c C 1999,2000,2001,2002,2003,2004,2005,2006,2007,2010,2011,2012,2014,2015,2016,2017,2018 ./lib/isc/sockaddr.c C 1999,2000,2001,2002,2003,2004,2005,2006,2007,2010,2011,2012,2014,2015,2016,2017,2018
./lib/isc/socket_api.c C 2009,2011,2012,2013,2014,2015,2016,2018
./lib/isc/sparc64/Makefile.in MAKE 2007,2012,2016,2018 ./lib/isc/sparc64/Makefile.in MAKE 2007,2012,2016,2018
./lib/isc/sparc64/include/Makefile.in MAKE 2007,2012,2016,2018 ./lib/isc/sparc64/include/Makefile.in MAKE 2007,2012,2016,2018
./lib/isc/sparc64/include/isc/Makefile.in MAKE 2007,2012,2015,2016,2018 ./lib/isc/sparc64/include/isc/Makefile.in MAKE 2007,2012,2015,2016,2018