mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
Merge remote branch 'amitay/tevent-sync'
(This used to be ctdb commit 17ff3f240b0d72c72ed28d70fb9aeb3b20c80670)
This commit is contained in:
commit
db411aaada
@ -22,7 +22,6 @@
|
||||
#include "db_wrap.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/locale.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "../include/ctdb_client.h"
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/time.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -21,7 +21,6 @@
|
||||
protocol design and packet details
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <net/ethernet.h>
|
||||
#include <netinet/ip6.h>
|
||||
#include <net/if_arp.h>
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <net/ethernet.h>
|
||||
#include <netinet/ip6.h>
|
||||
#include <net/if_arp.h>
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <net/ethernet.h>
|
||||
#include <netinet/ip6.h>
|
||||
#include <net/if_arp.h>
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <netinet/if_ether.h>
|
||||
#include <netinet/ip6.h>
|
||||
#include <netinet/icmp6.h>
|
||||
|
@ -21,7 +21,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <system/network.h>
|
||||
#include <assert.h>
|
||||
#include "ctdb_private.h"
|
||||
|
@ -21,7 +21,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include <system/network.h>
|
||||
#include <assert.h>
|
||||
#include "ctdb_private.h"
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include <time.h>
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "ib/ibwrapper.h"
|
||||
|
||||
struct ibwtest_ctx {
|
||||
|
@ -11,6 +11,13 @@
|
||||
#include "idtree.h"
|
||||
#include "ctdb_client.h"
|
||||
|
||||
/* Allow use of deprecated function tevent_loop_allow_nesting() */
|
||||
#define TEVENT_DEPRECATED
|
||||
/* Saves ctdb from massive churn. */
|
||||
#define TEVENT_COMPAT_DEFINES 1
|
||||
|
||||
#include "tevent.h"
|
||||
|
||||
typedef bool BOOL;
|
||||
|
||||
#define True 1
|
||||
|
@ -14,6 +14,7 @@ _tevent_req_done: void (struct tevent_req *, const char *)
|
||||
_tevent_req_error: bool (struct tevent_req *, uint64_t, const char *)
|
||||
_tevent_req_nomem: bool (const void *, struct tevent_req *, const char *)
|
||||
_tevent_req_notify_callback: void (struct tevent_req *, const char *)
|
||||
_tevent_req_oom: void (struct tevent_req *, const char *)
|
||||
_tevent_schedule_immediate: void (struct tevent_immediate *, struct tevent_context *, tevent_immediate_handler_t, void *, const char *, const char *)
|
||||
tevent_backend_list: const char **(TALLOC_CTX *)
|
||||
tevent_cleanup_pending_signal_handlers: void (struct tevent_signal *)
|
||||
@ -40,12 +41,16 @@ tevent_fd_set_flags: void (struct tevent_fd *, uint16_t)
|
||||
tevent_loop_allow_nesting: void (struct tevent_context *)
|
||||
tevent_loop_set_nesting_hook: void (struct tevent_context *, tevent_nesting_hook, void *)
|
||||
tevent_queue_add: bool (struct tevent_queue *, struct tevent_context *, struct tevent_req *, tevent_queue_trigger_fn_t, void *)
|
||||
tevent_queue_add_entry: struct tevent_queue_entry *(struct tevent_queue *, struct tevent_context *, struct tevent_req *, tevent_queue_trigger_fn_t, void *)
|
||||
tevent_queue_add_optimize_empty: struct tevent_queue_entry *(struct tevent_queue *, struct tevent_context *, struct tevent_req *, tevent_queue_trigger_fn_t, void *)
|
||||
tevent_queue_length: size_t (struct tevent_queue *)
|
||||
tevent_queue_running: bool (struct tevent_queue *)
|
||||
tevent_queue_start: void (struct tevent_queue *)
|
||||
tevent_queue_stop: void (struct tevent_queue *)
|
||||
tevent_re_initialise: int (struct tevent_context *)
|
||||
tevent_register_backend: bool (const char *, const struct tevent_ops *)
|
||||
tevent_req_default_print: char *(struct tevent_req *, TALLOC_CTX *)
|
||||
tevent_req_defer_callback: void (struct tevent_req *, struct tevent_context *)
|
||||
tevent_req_is_error: bool (struct tevent_req *, enum tevent_req_state *, uint64_t *)
|
||||
tevent_req_is_in_progress: bool (struct tevent_req *)
|
||||
tevent_req_poll: bool (struct tevent_req *, struct tevent_context *)
|
@ -1,79 +0,0 @@
|
||||
#!gmake
|
||||
#
|
||||
# Makefile for tdb directory
|
||||
#
|
||||
|
||||
CC = @CC@
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
includedir = @includedir@
|
||||
libdir = @libdir@
|
||||
VPATH = @srcdir@:@libreplacedir@
|
||||
srcdir = @srcdir@
|
||||
builddir = @builddir@
|
||||
sharedbuilddir = @sharedbuilddir@
|
||||
INSTALLCMD = @INSTALL@
|
||||
CPPFLAGS = @CPPFLAGS@ -I$(srcdir)/include -Iinclude -I.
|
||||
LDFLAGS = @LDFLAGS@
|
||||
EXEEXT = @EXEEXT@
|
||||
SHLD = @SHLD@
|
||||
SHLD_FLAGS = @SHLD_FLAGS@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PICFLAG = @PICFLAG@
|
||||
SHLIBEXT = @SHLIBEXT@
|
||||
LIB_PATH_VAR = @LIB_PATH_VAR@
|
||||
teventdir = @teventdir@
|
||||
|
||||
TALLOC_CFLAGS = @TALLOC_CFLAGS@
|
||||
TALLOC_LDFLAGS = @TALLOC_CFLAGS@
|
||||
TALLOC_LIBS = @TALLOC_LIBS@
|
||||
|
||||
TEVENT_CFLAGS = @TEVENT_CFLAGS@
|
||||
TEVENT_LDFLAGS = @TEVENT_CFLAGS@
|
||||
TEVENT_LIBS = @TEVENT_LIBS@
|
||||
|
||||
CFLAGS = $(CPPFLAGS) $(TALLOC_CFLAGS) $(TEVENT_CFLAGS) @CFLAGS@
|
||||
LDFLAGS = $(TALLOC_LDFLAGS) $(TEVENT_LDFLAGS) @LDFLAGS@
|
||||
LIBS = $(TALLOC_LIBS) $(TEVENT_LIBS) @LIBS@
|
||||
|
||||
TEVENT_OBJ = @TEVENT_OBJ@ @LIBREPLACEOBJ@
|
||||
|
||||
SONAMEFLAG = @SONAMEFLAG@
|
||||
VERSIONSCRIPT = @VERSIONSCRIPT@
|
||||
EXPORTSFILE = @EXPORTSFILE@
|
||||
|
||||
default: all
|
||||
|
||||
include $(teventdir)/tevent.mk
|
||||
include $(teventdir)/rules.mk
|
||||
|
||||
all:: showflags dirs $(PROGS) $(TEVENT_SOLIB) libtevent.a
|
||||
|
||||
install:: all
|
||||
$(TEVENT_SOLIB): $(TEVENT_OBJ)
|
||||
$(SHLD) $(SHLD_FLAGS) $(LDFLAGS) $(LIBS) -o $@ $(TEVENT_OBJ) $(VERSIONSCRIPT) $(EXPORTSFILE) $(SONAMEFLAG)$(TEVENT_SONAME)
|
||||
|
||||
shared-build: all
|
||||
${INSTALLCMD} -d $(sharedbuilddir)/lib
|
||||
${INSTALLCMD} -m 644 libtevent.a $(sharedbuilddir)/lib
|
||||
${INSTALLCMD} -m 755 $(TEVENT_SOLIB) $(sharedbuilddir)/lib
|
||||
ln -sf $(TEVENT_SOLIB) $(sharedbuilddir)/lib/$(TEVENT_SONAME)
|
||||
ln -sf $(TEVENT_SOLIB) $(sharedbuilddir)/lib/libtevent.so
|
||||
${INSTALLCMD} -d $(sharedbuilddir)/include
|
||||
${INSTALLCMD} -m 644 $(srcdir)/tevent.h $(sharedbuilddir)/include
|
||||
|
||||
check: test
|
||||
|
||||
installcheck:: test install
|
||||
|
||||
clean::
|
||||
rm -f *.o *.a */*.o
|
||||
rm -fr abi
|
||||
|
||||
distclean:: clean
|
||||
rm -f config.log config.status config.h config.cache
|
||||
rm -f Makefile
|
||||
|
||||
realdistclean:: distclean
|
||||
rm -f configure config.h.in
|
@ -1 +0,0 @@
|
||||
../../buildtools/scripts/autogen-waf.sh
|
@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
rm -rf autom4te.cache
|
||||
rm -f configure config.h.in
|
||||
|
||||
IPATHS="-I libreplace -I lib/replace -I ../libreplace -I ../replace -I ../../../lib/replace"
|
||||
autoconf $IPATHS || exit 1
|
||||
autoheader $IPATHS || exit 1
|
||||
|
||||
rm -rf autom4te.cache
|
||||
|
||||
echo "Now run ./configure and then make."
|
||||
exit 0
|
@ -1,14 +0,0 @@
|
||||
AC_DEFUN(BUILD_WITH_SHARED_BUILD_DIR,
|
||||
[ AC_ARG_WITH([shared-build-dir],
|
||||
[AC_HELP_STRING([--with-shared-build-dir=DIR],
|
||||
[temporary build directory where libraries are installed [$srcdir/sharedbuild]])])
|
||||
|
||||
sharedbuilddir="$srcdir/sharedbuild"
|
||||
if test x"$with_shared_build_dir" != x; then
|
||||
sharedbuilddir=$with_shared_build_dir
|
||||
CFLAGS="$CFLAGS -I$with_shared_build_dir/include"
|
||||
CPPFLAGS="$CPPFLAGS -I$with_shared_build_dir/include"
|
||||
LDFLAGS="$LDFLAGS -L$with_shared_build_dir/lib"
|
||||
fi
|
||||
AC_SUBST(sharedbuilddir)
|
||||
])
|
1561
ctdb/lib/tevent/config.guess
vendored
1561
ctdb/lib/tevent/config.guess
vendored
File diff suppressed because it is too large
Load Diff
1686
ctdb/lib/tevent/config.sub
vendored
1686
ctdb/lib/tevent/config.sub
vendored
File diff suppressed because it is too large
Load Diff
@ -1,25 +0,0 @@
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(tevent, 0.9.9)
|
||||
AC_CONFIG_SRCDIR([tevent.c])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
AC_LIBREPLACE_ALL_CHECKS
|
||||
|
||||
AC_LD_EXPORT_DYNAMIC
|
||||
AC_LD_SONAMEFLAG
|
||||
AC_LD_VERSIONSCRIPT
|
||||
AC_LD_PICFLAG
|
||||
AC_LD_SHLIBEXT
|
||||
AC_LIBREPLACE_SHLD
|
||||
AC_LIBREPLACE_SHLD_FLAGS
|
||||
AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR
|
||||
|
||||
m4_include(build_macros.m4)
|
||||
BUILD_WITH_SHARED_BUILD_DIR
|
||||
|
||||
m4_include(pkg.m4)
|
||||
m4_include(libtalloc.m4)
|
||||
|
||||
m4_include(libtevent.m4)
|
||||
|
||||
AC_OUTPUT(Makefile tevent.pc)
|
@ -8,7 +8,7 @@
|
||||
* signals, and the classic file descriptor events.
|
||||
*
|
||||
* Tevent also provide helpers to deal with asynchronous code providing the
|
||||
* tevent_req (tevent tequest) functions.
|
||||
* tevent_req (tevent request) functions.
|
||||
*
|
||||
* @section tevent_download Download
|
||||
*
|
||||
|
@ -1,238 +0,0 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# install - install a program, script, or datafile
|
||||
# This comes from X11R5.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
#
|
||||
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
transformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
stripcmd=""
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=""
|
||||
dst=""
|
||||
dir_arg=""
|
||||
|
||||
while [ x"$1" != x ]; do
|
||||
case $1 in
|
||||
-c) instcmd="$cpprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd="$stripprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
*) if [ x"$src" = x ]
|
||||
then
|
||||
src=$1
|
||||
else
|
||||
# this colon is to work around a 386BSD /bin/sh bug
|
||||
:
|
||||
dst=$1
|
||||
fi
|
||||
shift
|
||||
continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ x"$src" = x ]
|
||||
then
|
||||
echo "install: no input file specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]; then
|
||||
dst=$src
|
||||
src=""
|
||||
|
||||
if [ -d $dst ]; then
|
||||
instcmd=:
|
||||
else
|
||||
instcmd=mkdir
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
|
||||
if [ -f $src -o -d $src ]
|
||||
then
|
||||
true
|
||||
else
|
||||
echo "install: $src does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ x"$dst" = x ]
|
||||
then
|
||||
echo "install: no destination specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# If destination is a directory, append the input filename; if your system
|
||||
# does not like double slashes in filenames, you may need to add some logic
|
||||
|
||||
if [ -d $dst ]
|
||||
then
|
||||
dst="$dst"/`basename $src`
|
||||
else
|
||||
true
|
||||
fi
|
||||
fi
|
||||
|
||||
## this sed command emulates the dirname command
|
||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if [ ! -d "$dstdir" ]; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-${defaultIFS}}"
|
||||
|
||||
oIFS="${IFS}"
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS="${oIFS}"
|
||||
|
||||
pathcomp=''
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
pathcomp="${pathcomp}${1}"
|
||||
shift
|
||||
|
||||
if [ ! -d "${pathcomp}" ] ;
|
||||
then
|
||||
$mkdirprog "${pathcomp}"
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
pathcomp="${pathcomp}/"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]
|
||||
then
|
||||
$doit $instcmd $dst &&
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||
else
|
||||
|
||||
# If we're going to rename the final executable, determine the name now.
|
||||
|
||||
if [ x"$transformarg" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
dstfile=`basename $dst $transformbasename |
|
||||
sed $transformarg`$transformbasename
|
||||
fi
|
||||
|
||||
# don't allow the sed command to completely eliminate the filename
|
||||
|
||||
if [ x"$dstfile" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
$doit $instcmd $src $dsttmp &&
|
||||
|
||||
trap "rm -f ${dsttmp}" 0 &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits
|
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
|
||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||
|
||||
fi &&
|
||||
|
||||
|
||||
exit 0
|
@ -1,7 +0,0 @@
|
||||
AC_SUBST(TALLOC_OBJ)
|
||||
AC_SUBST(TALLOC_CFLAGS)
|
||||
AC_SUBST(TALLOC_LIBS)
|
||||
|
||||
AC_CHECK_HEADER(talloc.h,
|
||||
[AC_CHECK_LIB(talloc, talloc_init, [TALLOC_LIBS="-ltalloc"]) ],
|
||||
[PKG_CHECK_MODULES(TALLOC, talloc)])
|
@ -39,7 +39,7 @@ if test x"$INCLUDED_TEVENT" != x"no" ; then
|
||||
TEVENT_OBJ="tevent.o tevent_debug.o tevent_util.o"
|
||||
TEVENT_OBJ="$TEVENT_OBJ tevent_fd.o tevent_timed.o tevent_immediate.o tevent_signal.o"
|
||||
TEVENT_OBJ="$TEVENT_OBJ tevent_req.o tevent_wakeup.o tevent_queue.o"
|
||||
TEVENT_OBJ="$TEVENT_OBJ tevent_standard.o tevent_select.o"
|
||||
TEVENT_OBJ="$TEVENT_OBJ tevent_standard.o tevent_select.o tevent_poll.o"
|
||||
AC_SUBST(TEVENT_OBJ)
|
||||
|
||||
TEVENT_CFLAGS="-I$teventdir"
|
||||
@ -55,8 +55,3 @@ if test x"$INCLUDED_TEVENT" != x"no" ; then
|
||||
AC_DEFINE(HAVE_EPOLL, 1, [Whether epoll available])
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"$VERSIONSCRIPT" != "x"; then
|
||||
EXPORTSFILE=tevent.exports
|
||||
AC_SUBST(EXPORTSFILE)
|
||||
fi
|
||||
|
@ -1,156 +0,0 @@
|
||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
#
|
||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
# ----------------------------------
|
||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||
fi
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
_pkg_min_version=m4_default([$1], [0.9.0])
|
||||
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
|
||||
fi[]dnl
|
||||
])# PKG_PROG_PKG_CONFIG
|
||||
|
||||
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
# Check to see whether a particular set of modules exists. Similar
|
||||
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
#
|
||||
#
|
||||
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
|
||||
# this or PKG_CHECK_MODULES is called, or make sure to call
|
||||
# PKG_CHECK_EXISTS manually
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||
m4_ifval([$2], [$2], [:])
|
||||
m4_ifvaln([$3], [else
|
||||
$3])dnl
|
||||
fi])
|
||||
|
||||
|
||||
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
# ---------------------------------------------
|
||||
m4_define([_PKG_CONFIG],
|
||||
[if test -n "$PKG_CONFIG"; then
|
||||
if test -n "$$1"; then
|
||||
pkg_cv_[]$1="$$1"
|
||||
else
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
||||
[pkg_failed=yes])
|
||||
fi
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi[]dnl
|
||||
])# _PKG_CONFIG
|
||||
|
||||
# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
# -----------------------------
|
||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
_pkg_short_errors_supported=yes
|
||||
else
|
||||
_pkg_short_errors_supported=no
|
||||
fi[]dnl
|
||||
])# _PKG_SHORT_ERRORS_SUPPORTED
|
||||
|
||||
|
||||
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
#
|
||||
# Note that if there is a possibility the first call to
|
||||
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
#
|
||||
#
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_MODULES],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
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
|
||||
|
||||
pkg_failed=no
|
||||
AC_MSG_CHECKING([for $1])
|
||||
|
||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||
|
||||
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
|
||||
and $1[]_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details.])
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
_PKG_SHORT_ERRORS_SUPPORTED
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
|
||||
else
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
||||
|
||||
ifelse([$4], , [AC_MSG_ERROR(dnl
|
||||
[Package requirements ($2) were not met:
|
||||
|
||||
$$1_PKG_ERRORS
|
||||
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
_PKG_TEXT
|
||||
])],
|
||||
[AC_MSG_RESULT([no])
|
||||
$4])
|
||||
elif test $pkg_failed = untried; then
|
||||
ifelse([$4], , [AC_MSG_FAILURE(dnl
|
||||
[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
|
||||
path to pkg-config.
|
||||
|
||||
_PKG_TEXT
|
||||
|
||||
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
|
||||
[$4])
|
||||
else
|
||||
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||
AC_MSG_RESULT([yes])
|
||||
ifelse([$3], , :, [$3])
|
||||
fi[]dnl
|
||||
])# PKG_CHECK_MODULES
|
@ -1,48 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$1" = "" ]; then
|
||||
echo "Please provide version string, eg: 1.2.0"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "lib/tevent" ]; then
|
||||
echo "Run this script from the samba base directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git clean -f -x -d lib/tevent
|
||||
git clean -f -x -d lib/replace
|
||||
|
||||
curbranch=`git-branch |grep "^*" | tr -d "* "`
|
||||
|
||||
version=$1
|
||||
strver=`echo ${version} | tr "." "-"`
|
||||
|
||||
# Checkout the release tag
|
||||
git branch -f tevent-release-script-${strver} tevent-${strver}
|
||||
if [ ! "$?" = "0" ]; then
|
||||
echo "Unable to checkout tevent-${strver} release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout tevent-release-script-${strver}
|
||||
|
||||
# Test configure agrees with us
|
||||
confver=`grep "^AC_INIT" lib/tevent/configure.ac | tr -d "AC_INIT(tevent, " | tr -d ")"`
|
||||
if [ ! "$confver" = "$version" ]; then
|
||||
echo "Wrong version, requested release for ${version}, found ${confver}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Now build tarball
|
||||
cp -a lib/tevent tevent-${version}
|
||||
cp -a lib/replace tevent-${version}/libreplace
|
||||
pushd tevent-${version}
|
||||
./autogen.sh
|
||||
popd
|
||||
tar cvzf tevent-${version}.tar.gz tevent-${version}
|
||||
rm -fr tevent-${version}
|
||||
|
||||
#Clean up
|
||||
git checkout $curbranch
|
||||
git branch -d tevent-release-script-${strver}
|
@ -1,18 +0,0 @@
|
||||
.SUFFIXES: .i _wrap.c
|
||||
|
||||
showflags::
|
||||
@echo 'libtevent will be compiled with flags:'
|
||||
@echo ' CFLAGS = $(CFLAGS)'
|
||||
@echo ' CPPFLAGS = $(CPPFLAGS)'
|
||||
@echo ' LDFLAGS = $(LDFLAGS)'
|
||||
@echo ' LIBS = $(LIBS)'
|
||||
|
||||
.SUFFIXES: .c .o
|
||||
|
||||
.c.o:
|
||||
@echo Compiling $*.c
|
||||
@mkdir -p `dirname $@`
|
||||
@$(CC) $(PICFLAG) $(CFLAGS) $(ABI_CHECK) -c $< -o $@
|
||||
|
||||
distclean::
|
||||
rm -f *~ */*~
|
@ -1,11 +0,0 @@
|
||||
|
||||
teventdir="\$(libteventsrcdir)"
|
||||
m4_include(../lib/tevent/libtevent.m4)
|
||||
|
||||
SMB_EXT_LIB(LIBTEVENT_EXT, [${TEVENT_LIBS}])
|
||||
SMB_ENABLE(LIBTEVENT_EXT)
|
||||
|
||||
SMB_SUBSYSTEM(LIBTEVENT,
|
||||
[\$(addprefix \$(libteventsrcdir)/, ${TEVENT_OBJ})],
|
||||
[LIBTEVENT_EXT],
|
||||
[${TEVENT_CFLAGS}])
|
@ -1,91 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# abi_checks.sh - check for possible abi changes
|
||||
#
|
||||
# Copyright (C) 2009 Micheal Adam <obnox@samba.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 3 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
#
|
||||
# USAGE: abi_checks.sh LIBNAME header1 [header2 ...]
|
||||
#
|
||||
# This script creates symbol and signature lists from the provided header
|
||||
# files with the aid of the mksyms.sh and mksigs.pl scripts (saved as
|
||||
# $LIBNAME.exports.check and $LIBNAME.sigatures.check). It then compares
|
||||
# the resulting files with the files $LIBNAME.exports and $LIBNME.signatures
|
||||
# which it expects to find in the current directory.
|
||||
#
|
||||
|
||||
LANG=C; export LANG
|
||||
LC_ALL=C; export LC_ALL
|
||||
LC_COLLATE=C; export LC_COLLATE
|
||||
|
||||
script=$0
|
||||
dir_name=$(dirname ${script})
|
||||
|
||||
if test x"$1" = "x" ; then
|
||||
echo "USAGE: ${script} libname header [header ...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
libname="$1"
|
||||
shift
|
||||
|
||||
if test x"$1" = "x" ; then
|
||||
echo "USAGE: ${script} libname header [header ...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
headers="$*"
|
||||
|
||||
exports_file=${libname}.exports
|
||||
exports_file_check=${exports_file}.check
|
||||
signatures_file=${libname}.signatures
|
||||
signatures_file_check=${signatures_file}.check
|
||||
|
||||
|
||||
${dir_name}/mksyms.sh awk ${exports_file_check} ${headers} 2>&1 > /dev/null
|
||||
|
||||
cat ${headers} | ${dir_name}/mksigs.pl > ${signatures_file_check} 2> /dev/null
|
||||
|
||||
normalize_exports_file() {
|
||||
filename=$1
|
||||
cat ${filename} \
|
||||
| sed -e 's/^[ \t]*//g' \
|
||||
| sed -e 's/^$//g' \
|
||||
| sed -e 's/^#.*$//g' \
|
||||
| sort | uniq > ${filename}.sort
|
||||
}
|
||||
|
||||
normalize_exports_file ${exports_file}
|
||||
normalize_exports_file ${exports_file_check}
|
||||
|
||||
normalize_exports_file ${signatures_file}
|
||||
normalize_exports_file ${signatures_file_check}
|
||||
|
||||
diff -u ${exports_file}.sort ${exports_file_check}.sort
|
||||
if test "x$?" != "x0" ; then
|
||||
echo "WARNING: possible ABI change detected in exports!"
|
||||
else
|
||||
echo "exports check: OK"
|
||||
fi
|
||||
|
||||
diff -u ${signatures_file}.sort ${signatures_file_check}.sort
|
||||
if test "x$?" != "x0" ; then
|
||||
echo "WARNING: possible ABI change detected in signatures!"
|
||||
else
|
||||
echo "signatures check: OK"
|
||||
fi
|
@ -1,31 +0,0 @@
|
||||
#!/bin/bash
|
||||
make clean
|
||||
|
||||
mkdir abi
|
||||
ABI_CHECKS="-aux-info abi/\$@.X"
|
||||
make ABI_CHECK="$ABI_CHECKS" CC="/usr/bin/gcc"
|
||||
|
||||
for i in abi/*.X; do cat $i | grep 'tevent\.h'; done | sort | uniq | awk -F "extern " '{ print $2 }' | sort> abi/signatures
|
||||
|
||||
cat > abi/exports << EOF
|
||||
{
|
||||
global:
|
||||
EOF
|
||||
cat abi/signatures | awk -F '(' '{ print $1 }' | awk -F ' ' '{ print " "$NF";" }' | tr -d '*' | sort >> abi/exports
|
||||
cat >> abi/exports << EOF
|
||||
|
||||
local: *;
|
||||
};
|
||||
EOF
|
||||
|
||||
rm -fr abi/*.X
|
||||
|
||||
diff -u tevent.signatures abi/signatures
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "WARNING: Possible ABI Change!!"
|
||||
fi
|
||||
|
||||
diff -u tevent.exports abi/exports
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "WARNING: Export file may be outdated!!"
|
||||
fi
|
@ -1,183 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# mksigs.pl - extract signatures from C headers
|
||||
#
|
||||
# Copyright (C) Michael Adam 2009
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 3 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# USAGE: cat $header_files | mksigs.pl > $signature_file
|
||||
#
|
||||
# The header files to parse are read from stdin.
|
||||
# The output is in a form as produced by gcc with the -aux-info switch
|
||||
# and printed to stdout.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my $in_comment = 0;
|
||||
my $extern_C_block = 0;
|
||||
|
||||
while (my $LINE = <>) {
|
||||
# find end of started multi-line-comment
|
||||
if ($in_comment) {
|
||||
if ($LINE =~ /^.*?\*\/(.*)$/) {
|
||||
$LINE = $1;
|
||||
$in_comment = 0;
|
||||
} else {
|
||||
# whole line within comment
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
# strip C++-style comments
|
||||
$LINE =~ s/^(.*?)\/\/.*$/$1/;
|
||||
|
||||
# strip in-line-comments:
|
||||
while ($LINE =~ /\/\*.*?\*\//) {
|
||||
$LINE =~ s/\/\*.*?\*\///;
|
||||
}
|
||||
|
||||
# find starts of multi-line-comments
|
||||
if ($LINE =~ /^(.*)\/\*/) {
|
||||
$in_comment = 1;
|
||||
$LINE = $1;
|
||||
}
|
||||
|
||||
# skip empty lines
|
||||
next if $LINE =~ /^\s*$/;
|
||||
|
||||
# remove leading spaces
|
||||
$LINE =~ s/^\s*(.*)$/$1/;
|
||||
|
||||
# concatenate lines split with "\" (usually macro defines)
|
||||
while ($LINE =~ /^(.*?)\s+\\$/) {
|
||||
my $LINE2 = <>;
|
||||
$LINE = $1;
|
||||
$LINE2 =~ s/^\s*(.*)$/$1/;
|
||||
$LINE .= " " . $LINE2;
|
||||
}
|
||||
|
||||
# remove all preprocessor directives
|
||||
next if ($LINE =~ /^#/);
|
||||
|
||||
if ($LINE =~ /^extern\s+"C"\s+\{/) {
|
||||
$extern_C_block = 1;
|
||||
next;
|
||||
}
|
||||
|
||||
if (($LINE =~ /^[^\{]*\}/) and $extern_C_block) {
|
||||
$extern_C_block = 0;
|
||||
next;
|
||||
}
|
||||
|
||||
$LINE =~ s/^extern\s//;
|
||||
|
||||
# concatenate braces stretched over multiple lines
|
||||
# (from structs or enums)
|
||||
my $REST = $LINE;
|
||||
my $braces = 0;
|
||||
while (($REST =~ /[\{\}]/) or ($braces)) {
|
||||
while ($REST =~ /[\{\}]/) {
|
||||
# collect opening
|
||||
while ($REST =~ /^[^\{\}]*\{(.*)$/) {
|
||||
$braces++;
|
||||
$REST = $1;
|
||||
}
|
||||
|
||||
# collect closing
|
||||
while ($REST =~ /^[^\{\}]*\}(.*)$/) {
|
||||
$braces--;
|
||||
$REST = $1;
|
||||
}
|
||||
}
|
||||
|
||||
# concatenate if not balanced
|
||||
if ($braces) {
|
||||
if (my $LINE2 = <>) {
|
||||
$LINE2 =~ s/^\s*(.*)$/$1/;
|
||||
chomp($LINE);
|
||||
$LINE .= " " . $LINE2;
|
||||
chomp $REST;
|
||||
$REST .= " " . $LINE2;
|
||||
} else {
|
||||
print "ERROR: unbalanced braces ($braces)\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# concetenate function prototypes that stretch over multiple lines
|
||||
$REST = $LINE;
|
||||
my $parenthesis = 0;
|
||||
while (($REST =~ /[\(\)]/) or ($parenthesis)) {
|
||||
while ($REST =~ /[\(\)]/) {
|
||||
# collect opening
|
||||
while ($REST =~ /^[^\(\)]*\((.*)$/) {
|
||||
$parenthesis++;
|
||||
$REST = $1;
|
||||
}
|
||||
|
||||
# collect closing
|
||||
while ($REST =~ /^[^\(\)]*\)(.*)$/) {
|
||||
$parenthesis--;
|
||||
$REST = $1;
|
||||
}
|
||||
}
|
||||
|
||||
# concatenate if not balanced
|
||||
if ($parenthesis) {
|
||||
if (my $LINE2 = <>) {
|
||||
$LINE2 =~ s/^\s*(.*)$/$1/;
|
||||
chomp($LINE);
|
||||
$LINE .= " " . $LINE2;
|
||||
chomp($REST);
|
||||
$REST .= " " . $LINE2;
|
||||
} else {
|
||||
print "ERROR: unbalanced parantheses ($parenthesis)\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next if ($LINE =~ /^typedef\s/);
|
||||
next if ($LINE =~ /^enum\s+[^\{\(]+\s+\{/);
|
||||
next if ($LINE =~ /^struct\s+[^\{\(]+\s+\{.*\}\s*;/);
|
||||
next if ($LINE =~ /^struct\s+[a-zA-Z0-9_]+\s*;/);
|
||||
|
||||
# remove trailing spaces
|
||||
$LINE =~ s/(.*?)\s*$/$1/;
|
||||
|
||||
$LINE =~ s/^(.*\))\s+PRINTF_ATTRIBUTE\([^\)]*\)(\s*[;,])/$1$2/;
|
||||
$LINE =~ s/^(.*\))\s*[a-zA-Z0-9_]+\s*;$/$1;/;
|
||||
|
||||
# remove parameter names - slightly too coarse probably
|
||||
$LINE =~ s/([\s\(]\*?)[_0-9a-zA-Z]+\s*([,\)])/$1$2/g;
|
||||
|
||||
# remedy (void) from last line
|
||||
$LINE =~ s/\(\)/(void)/g;
|
||||
|
||||
# normalize spaces
|
||||
$LINE =~ s/\s*\)\s*/)/g;
|
||||
$LINE =~ s/\s*\(\s*/ (/g;
|
||||
$LINE =~ s/\s*,\s*/, /g;
|
||||
|
||||
# normalize unsigned
|
||||
$LINE =~ s/([\s,\(])unsigned([,\)])/$1unsigned int$2/g;
|
||||
|
||||
# normalize bool
|
||||
$LINE =~ s/(\b)bool(\b)/_Bool/g;
|
||||
|
||||
print $LINE . "\n";
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
#
|
||||
# mksyms.awk
|
||||
#
|
||||
# Extract symbols to export from C-header files.
|
||||
# output in version-script format for linking shared libraries.
|
||||
#
|
||||
# Copyright (C) 2008 Michael Adam <obnox@samba.org>
|
||||
#
|
||||
BEGIN {
|
||||
inheader=0;
|
||||
current_file="";
|
||||
print "#"
|
||||
print "# This file is automatically generated with \"make symbols\". DO NOT EDIT "
|
||||
print "#"
|
||||
print "{"
|
||||
print "\tglobal:"
|
||||
}
|
||||
|
||||
END {
|
||||
print""
|
||||
print "\tlocal: *;"
|
||||
print "};"
|
||||
}
|
||||
|
||||
{
|
||||
if (FILENAME!=current_file) {
|
||||
print "\t\t# The following definitions come from",FILENAME
|
||||
current_file=FILENAME
|
||||
}
|
||||
if (inheader) {
|
||||
if (match($0,"[)][^()]*[;][ \t]*$")) {
|
||||
inheader = 0;
|
||||
}
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
/^static/ || /^[ \t]*typedef/ || !/^[a-zA-Z\_]/ {
|
||||
next;
|
||||
}
|
||||
|
||||
/^extern[ \t]+[^()]+[;][ \t]*$/ {
|
||||
gsub(/[^ \t]+[ \t]+/, "");
|
||||
sub(/[;][ \t]*$/, "");
|
||||
printf "\t\t%s;\n", $0;
|
||||
next;
|
||||
}
|
||||
|
||||
# look for function headers:
|
||||
{
|
||||
gotstart = 0;
|
||||
if ($0 ~ /^[A-Za-z_][A-Za-z0-9_]+/) {
|
||||
gotstart = 1;
|
||||
}
|
||||
if(!gotstart) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
/[_A-Za-z0-9]+[ \t]*[(].*[)][^()]*;[ \t]*$/ {
|
||||
sub(/[(].*$/, "");
|
||||
gsub(/[^ \t]+[ \t]+/, "");
|
||||
gsub(/^[*]+/, "");
|
||||
printf "\t\t%s;\n",$0;
|
||||
next;
|
||||
}
|
||||
|
||||
/[_A-Za-z0-9]+[ \t]*[(]/ {
|
||||
inheader=1;
|
||||
sub(/[(].*$/, "");
|
||||
gsub(/[^ \t]+[ \t]+/, "");
|
||||
gsub(/^[*]/, "");
|
||||
printf "\t\t%s;\n",$0;
|
||||
next;
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
#
|
||||
# mksyms.sh
|
||||
#
|
||||
# Extract symbols to export from C-header files.
|
||||
# output in version-script format for linking shared libraries.
|
||||
#
|
||||
# This is the shell wrapper for the mksyms.awk core script.
|
||||
#
|
||||
# Copyright (C) 2008 Michael Adam <obnox@samba.org>
|
||||
#
|
||||
|
||||
LANG=C; export LANG
|
||||
LC_ALL=C; export LC_ALL
|
||||
LC_COLLATE=C; export LC_COLLATE
|
||||
|
||||
if [ $# -lt 2 ]
|
||||
then
|
||||
echo "Usage: $0 awk output_file header_files"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
awk="$1"
|
||||
shift
|
||||
|
||||
symsfile="$1"
|
||||
shift
|
||||
symsfile_tmp="$symsfile.$$.tmp~"
|
||||
|
||||
proto_src="`echo $@ | tr ' ' '\n' | sort | uniq `"
|
||||
|
||||
echo creating $symsfile
|
||||
|
||||
mkdir -p `dirname $symsfile`
|
||||
|
||||
${awk} -f `dirname $0`/mksyms.awk $proto_src > $symsfile_tmp
|
||||
|
||||
if cmp -s $symsfile $symsfile_tmp 2>/dev/null
|
||||
then
|
||||
echo "$symsfile unchanged"
|
||||
rm $symsfile_tmp
|
||||
else
|
||||
mv $symsfile_tmp $symsfile
|
||||
fi
|
@ -101,7 +101,9 @@ static bool test_event_context(struct torture_context *test,
|
||||
#ifdef SA_RESTART
|
||||
se1 = event_add_signal(ev_ctx, ev_ctx, SIGALRM, SA_RESTART, count_handler, &alarm_count);
|
||||
#endif
|
||||
#ifdef SA_RESETHAND
|
||||
se2 = event_add_signal(ev_ctx, ev_ctx, SIGALRM, SA_RESETHAND, count_handler, &alarm_count);
|
||||
#endif
|
||||
#ifdef SA_SIGINFO
|
||||
se3 = event_add_signal(ev_ctx, ev_ctx, SIGUSR1, SA_SIGINFO, count_handler, &info_count);
|
||||
#endif
|
||||
@ -146,7 +148,7 @@ static bool test_event_context(struct torture_context *test,
|
||||
|
||||
struct torture_suite *torture_local_event(TALLOC_CTX *mem_ctx)
|
||||
{
|
||||
struct torture_suite *suite = torture_suite_create(mem_ctx, "EVENT");
|
||||
struct torture_suite *suite = torture_suite_create(mem_ctx, "event");
|
||||
const char **list = event_backend_list(suite);
|
||||
int i;
|
||||
|
||||
|
@ -64,9 +64,6 @@
|
||||
#include "tevent_internal.h"
|
||||
#include "tevent_util.h"
|
||||
|
||||
/* needed for the special ctdbd "track if time jumps unexpectedly */
|
||||
#include <time.h>
|
||||
|
||||
struct tevent_ops_list {
|
||||
struct tevent_ops_list *next, *prev;
|
||||
const char *name;
|
||||
@ -91,7 +88,7 @@ bool tevent_register_backend(const char *name, const struct tevent_ops *ops)
|
||||
}
|
||||
}
|
||||
|
||||
e = talloc(talloc_autofree_context(), struct tevent_ops_list);
|
||||
e = talloc(NULL, struct tevent_ops_list);
|
||||
if (e == NULL) return false;
|
||||
|
||||
e->name = name;
|
||||
@ -107,8 +104,7 @@ bool tevent_register_backend(const char *name, const struct tevent_ops *ops)
|
||||
void tevent_set_default_backend(const char *backend)
|
||||
{
|
||||
talloc_free(tevent_default_backend);
|
||||
tevent_default_backend = talloc_strdup(talloc_autofree_context(),
|
||||
backend);
|
||||
tevent_default_backend = talloc_strdup(NULL, backend);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -117,6 +113,7 @@ void tevent_set_default_backend(const char *backend)
|
||||
static void tevent_backend_init(void)
|
||||
{
|
||||
tevent_select_init();
|
||||
tevent_poll_init();
|
||||
tevent_standard_init();
|
||||
#ifdef HAVE_EPOLL
|
||||
tevent_epoll_init();
|
||||
@ -188,6 +185,17 @@ int tevent_common_context_destructor(struct tevent_context *ev)
|
||||
tevent_cleanup_pending_signal_handlers(se);
|
||||
}
|
||||
|
||||
/* removing nesting hook or we get an abort when nesting is
|
||||
* not allowed. -- SSS
|
||||
* Note that we need to leave the allowed flag at its current
|
||||
* value, otherwise the use in tevent_re_initialise() will
|
||||
* leave the event context with allowed forced to false, which
|
||||
* will break users that expect nesting to be allowed
|
||||
*/
|
||||
ev->nesting.level = 0;
|
||||
ev->nesting.hook_fn = NULL;
|
||||
ev->nesting.hook_private = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -394,7 +402,6 @@ struct tevent_immediate *_tevent_create_immediate(TALLOC_CTX *mem_ctx,
|
||||
|
||||
/*
|
||||
schedule an immediate event
|
||||
return NULL on failure
|
||||
*/
|
||||
void _tevent_schedule_immediate(struct tevent_immediate *im,
|
||||
struct tevent_context *ev,
|
||||
@ -581,14 +588,12 @@ done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
return on failure or (with 0) if all fd events are removed
|
||||
*/
|
||||
int tevent_common_loop_wait(struct tevent_context *ev,
|
||||
const char *location)
|
||||
{
|
||||
|
||||
/*
|
||||
* loop as long as we have events pending
|
||||
*/
|
||||
|
@ -1,62 +0,0 @@
|
||||
{
|
||||
global:
|
||||
_tevent_add_fd;
|
||||
_tevent_add_signal;
|
||||
_tevent_add_timer;
|
||||
tevent_backend_list;
|
||||
tevent_context_init;
|
||||
tevent_context_init_byname;
|
||||
_tevent_create_immediate;
|
||||
tevent_fd_get_flags;
|
||||
tevent_fd_set_auto_close;
|
||||
tevent_fd_set_close_fn;
|
||||
tevent_fd_set_flags;
|
||||
tevent_loop_allow_nesting;
|
||||
_tevent_loop_once;
|
||||
tevent_loop_set_nesting_hook;
|
||||
_tevent_loop_until;
|
||||
_tevent_loop_wait;
|
||||
tevent_queue_add;
|
||||
_tevent_queue_create;
|
||||
tevent_queue_length;
|
||||
tevent_queue_start;
|
||||
tevent_queue_stop;
|
||||
tevent_register_backend;
|
||||
_tevent_req_callback_data;
|
||||
_tevent_req_create;
|
||||
_tevent_req_data;
|
||||
tevent_req_default_print;
|
||||
_tevent_req_done;
|
||||
_tevent_req_error;
|
||||
tevent_req_is_error;
|
||||
tevent_req_is_in_progress;
|
||||
_tevent_req_nomem;
|
||||
_tevent_req_notify_callback;
|
||||
tevent_req_poll;
|
||||
tevent_req_post;
|
||||
tevent_req_print;
|
||||
tevent_req_received;
|
||||
tevent_req_set_callback;
|
||||
tevent_req_set_endtime;
|
||||
tevent_req_set_print_fn;
|
||||
_tevent_schedule_immediate;
|
||||
tevent_set_abort_fn;
|
||||
tevent_set_debug;
|
||||
tevent_set_debug_stderr;
|
||||
tevent_set_default_backend;
|
||||
tevent_signal_support;
|
||||
tevent_timeval_add;
|
||||
tevent_timeval_compare;
|
||||
tevent_timeval_current;
|
||||
tevent_timeval_current_ofs;
|
||||
tevent_timeval_is_zero;
|
||||
tevent_timeval_set;
|
||||
tevent_timeval_until;
|
||||
tevent_timeval_zero;
|
||||
tevent_wakeup_recv;
|
||||
tevent_wakeup_send;
|
||||
_tevent_req_cancel;
|
||||
tevent_req_set_cancel_fn;
|
||||
|
||||
local: *;
|
||||
};
|
@ -28,10 +28,6 @@
|
||||
#ifndef __TEVENT_H__
|
||||
#define __TEVENT_H__
|
||||
|
||||
#ifndef TEVENT_DEPRECATED
|
||||
#define TEVENT_DEPRECATED
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <talloc.h>
|
||||
#include <sys/time.h>
|
||||
@ -115,7 +111,7 @@ typedef void (*tevent_signal_handler_t)(struct tevent_context *ev,
|
||||
struct tevent_context *tevent_context_init(TALLOC_CTX *mem_ctx);
|
||||
|
||||
/**
|
||||
* @brief Create a event_context structure and name it.
|
||||
* @brief Create a event_context structure and select a specific backend.
|
||||
*
|
||||
* This must be the first events call, and all subsequent calls pass this
|
||||
* event_context as the first element. Event handlers also receive this as
|
||||
@ -123,7 +119,7 @@ struct tevent_context *tevent_context_init(TALLOC_CTX *mem_ctx);
|
||||
*
|
||||
* @param[in] mem_ctx The memory context to use.
|
||||
*
|
||||
* @param[in] name The name for the tevent context.
|
||||
* @param[in] name The name of the backend to use.
|
||||
*
|
||||
* @return An allocated tevent context, NULL on error.
|
||||
*/
|
||||
@ -140,7 +136,7 @@ struct tevent_context *tevent_context_init_byname(TALLOC_CTX *mem_ctx, const cha
|
||||
const char **tevent_backend_list(TALLOC_CTX *mem_ctx);
|
||||
|
||||
/**
|
||||
* @brief Set the default tevent backent.
|
||||
* @brief Set the default tevent backend.
|
||||
*
|
||||
* @param[in] backend The name of the backend to set.
|
||||
*/
|
||||
@ -513,50 +509,121 @@ int tevent_set_debug_stderr(struct tevent_context *ev);
|
||||
* @defgroup tevent_request The tevent request functions.
|
||||
* @ingroup tevent
|
||||
*
|
||||
* This represents an async request being processed by callbacks via an event
|
||||
* context. A user can issue for example a write request to a socket, giving
|
||||
* an implementation function the fd, the buffer and the number of bytes to
|
||||
* transfer. The function issuing the request will immediately return without
|
||||
* blocking most likely without having sent anything. The API user then fills
|
||||
* in req->async.fn and req->async.private_data, functions that are called
|
||||
* when the request is finished.
|
||||
* A tevent_req represents an asynchronous computation.
|
||||
*
|
||||
* It is up to the user of the async request to talloc_free it after it has
|
||||
* finished. This can happen while the completion function is called.
|
||||
* The tevent_req group of API calls is the recommended way of
|
||||
* programming async computations within tevent. In particular the
|
||||
* file descriptor (tevent_add_fd) and timer (tevent_add_timed) events
|
||||
* are considered too low-level to be used in larger computations. To
|
||||
* read and write from and to sockets, Samba provides two calls on top
|
||||
* of tevent_add_fd: read_packet_send/recv and writev_send/recv. These
|
||||
* requests are much easier to compose than the low-level event
|
||||
* handlers called from tevent_add_fd.
|
||||
*
|
||||
* A lot of the simplicity tevent_req has brought to the notoriously
|
||||
* hairy async programming came via a set of conventions that every
|
||||
* async computation programmed should follow. One central piece of
|
||||
* these conventions is the naming of routines and variables.
|
||||
*
|
||||
* Every async computation needs a name (sensibly called "computation"
|
||||
* down from here). From this name quite a few naming conventions are
|
||||
* derived.
|
||||
*
|
||||
* Every computation that requires local state needs a
|
||||
* @code
|
||||
* struct computation_state {
|
||||
* int local_var;
|
||||
* };
|
||||
* @endcode
|
||||
* Even if no local variables are required, such a state struct should
|
||||
* be created containing a dummy variable. Quite a few helper
|
||||
* functions and macros (for example tevent_req_create()) assume such
|
||||
* a state struct.
|
||||
*
|
||||
* An async computation is started by a computation_send
|
||||
* function. When it is finished, its result can be received by a
|
||||
* computation_recv function. For an example how to set up an async
|
||||
* computation, see the code example in the documentation for
|
||||
* tevent_req_create() and tevent_req_post(). The prototypes for _send
|
||||
* and _recv functions should follow some conventions:
|
||||
*
|
||||
* @code
|
||||
* struct tevent_req *computation_send(TALLOC_CTX *mem_ctx,
|
||||
* struct tevent_req *ev,
|
||||
* ... further args);
|
||||
* int computation_recv(struct tevent_req *req, ... further output args);
|
||||
* @endcode
|
||||
*
|
||||
* The "int" result of computation_recv() depends on the result the
|
||||
* sync version of the function would have, "int" is just an example
|
||||
* here.
|
||||
*
|
||||
* Another important piece of the conventions is that the program flow
|
||||
* is interrupted as little as possible. Because a blocking
|
||||
* sub-computation requires that the flow needs to continue in a
|
||||
* separate function that is the logical sequel of some computation,
|
||||
* it should lexically follow sending off the blocking
|
||||
* sub-computation. Setting the callback function via
|
||||
* tevent_req_set_callback() requires referencing a function lexically
|
||||
* below the call to tevent_req_set_callback(), forward declarations
|
||||
* are required. A lot of the async computations thus begin with a
|
||||
* sequence of declarations such as
|
||||
*
|
||||
* @code
|
||||
* static void computation_step1_done(struct tevent_req *subreq);
|
||||
* static void computation_step2_done(struct tevent_req *subreq);
|
||||
* static void computation_step3_done(struct tevent_req *subreq);
|
||||
* @endcode
|
||||
*
|
||||
* It really helps readability a lot to do these forward declarations,
|
||||
* because the lexically sequential program flow makes the async
|
||||
* computations almost as clear to read as a normal, sync program
|
||||
* flow.
|
||||
*
|
||||
* It is up to the user of the async computation to talloc_free it
|
||||
* after it has finished. If an async computation should be aborted,
|
||||
* the tevent_req structure can be talloc_free'ed. After it has
|
||||
* finished, it should talloc_free'ed by the API user.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* An async request moves between the following 4 states:
|
||||
* An async request moves from TEVENT_REQ_INIT to
|
||||
* TEVENT_REQ_IN_PROGRESS. All other states are valid after a request
|
||||
* has finished.
|
||||
*/
|
||||
enum tevent_req_state {
|
||||
/**
|
||||
* we are creating the request
|
||||
* We are creating the request
|
||||
*/
|
||||
TEVENT_REQ_INIT,
|
||||
/**
|
||||
* we are waiting the request to complete
|
||||
* We are waiting the request to complete
|
||||
*/
|
||||
TEVENT_REQ_IN_PROGRESS,
|
||||
/**
|
||||
* the request is finished
|
||||
* The request is finished successfully
|
||||
*/
|
||||
TEVENT_REQ_DONE,
|
||||
/**
|
||||
* A user error has occurred
|
||||
* A user error has occurred. The user error has been
|
||||
* indicated by tevent_req_error(), it can be retrieved via
|
||||
* tevent_req_is_error().
|
||||
*/
|
||||
TEVENT_REQ_USER_ERROR,
|
||||
/**
|
||||
* Request timed out
|
||||
* Request timed out after the timeout set by tevent_req_set_endtime.
|
||||
*/
|
||||
TEVENT_REQ_TIMED_OUT,
|
||||
/**
|
||||
* No memory in between
|
||||
* An internal allocation has failed, or tevent_req_nomem has
|
||||
* been given a NULL pointer as the first argument.
|
||||
*/
|
||||
TEVENT_REQ_NO_MEMORY,
|
||||
/**
|
||||
* the request is already received by the caller
|
||||
* The request has been received by the caller. No further
|
||||
* action is valid.
|
||||
*/
|
||||
TEVENT_REQ_RECEIVED
|
||||
};
|
||||
@ -576,6 +643,9 @@ typedef void (*tevent_req_fn)(struct tevent_req *req);
|
||||
/**
|
||||
* @brief Set an async request callback.
|
||||
*
|
||||
* See the documentation of tevent_req_post() for an example how this
|
||||
* is supposed to be used.
|
||||
*
|
||||
* @param[in] req The async request to set the callback.
|
||||
*
|
||||
* @param[in] fn The callback function to set.
|
||||
@ -587,9 +657,17 @@ void tevent_req_set_callback(struct tevent_req *req, tevent_req_fn fn, void *pvt
|
||||
|
||||
#ifdef DOXYGEN
|
||||
/**
|
||||
* @brief Get the private data casted to the given type for a callback from
|
||||
* @brief Get the private data cast to the given type for a callback from
|
||||
* a tevent request structure.
|
||||
*
|
||||
* @code
|
||||
* static void computation_done(struct tevent_req *subreq) {
|
||||
* struct tevent_req *req = tevent_req_callback_data(subreq, struct tevent_req);
|
||||
* struct computation_state *state = tevent_req_data(req, struct computation_state);
|
||||
* .... more things, eventually maybe call tevent_req_done(req);
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] req The structure to get the callback data from.
|
||||
*
|
||||
* @param[in] type The type of the private callback data to get.
|
||||
@ -623,11 +701,17 @@ void *tevent_req_callback_data_void(struct tevent_req *req);
|
||||
/**
|
||||
* @brief Get the private data from a tevent request structure.
|
||||
*
|
||||
* When the tevent_req has been created by tevent_req_create, the
|
||||
* result of tevent_req_data() is the state variable created by
|
||||
* tevent_req_create() as a child of the req.
|
||||
*
|
||||
* @param[in] req The structure to get the private data from.
|
||||
*
|
||||
* @param[in] type The type of the private data
|
||||
*
|
||||
* @return The private data or NULL if not set.
|
||||
*/
|
||||
void *tevent_req_data(struct tevent_req *req);
|
||||
void *tevent_req_data(struct tevent_req *req, #type);
|
||||
#else
|
||||
void *_tevent_req_data(struct tevent_req *req);
|
||||
#define tevent_req_data(_req, _type) \
|
||||
@ -759,22 +843,29 @@ bool _tevent_req_cancel(struct tevent_req *req, const char *location);
|
||||
/**
|
||||
* @brief Create an async tevent request.
|
||||
*
|
||||
* The new async request will be initialized in state ASYNC_REQ_IN_PROGRESS.
|
||||
* The new async request will be initialized in state TEVENT_REQ_IN_PROGRESS.
|
||||
*
|
||||
* @code
|
||||
* struct tevent_req *req;
|
||||
* struct computation_state *state;
|
||||
* req = tevent_req_create(mem_ctx, &state, struct computation_state);
|
||||
* @endcode
|
||||
*
|
||||
* Tevent_req_create() creates the state variable as a talloc child of
|
||||
* its result. The state variable should be used as the talloc parent
|
||||
* for all temporary variables that are allocated during the async
|
||||
* computation. This way, when the user of the async computation frees
|
||||
* the request, the state as a talloc child will be free'd along with
|
||||
* all the temporary variables hanging off the state.
|
||||
*
|
||||
* @param[in] mem_ctx The memory context for the result.
|
||||
*
|
||||
* @param[in] pstate The private state of the request.
|
||||
*
|
||||
* @param[in] state_size The size of the private state of the request.
|
||||
*
|
||||
* @param[in] pstate Pointer to the private request state.
|
||||
* @param[in] type The name of the request.
|
||||
*
|
||||
* @return A new async request. NULL on error.
|
||||
*/
|
||||
struct tevent_req *tevent_req_create(TALLOC_CTX *mem_ctx,
|
||||
void *pstate,
|
||||
size_t state_size,
|
||||
const char *type);
|
||||
void **pstate, #type);
|
||||
#else
|
||||
struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
|
||||
void *pstate,
|
||||
@ -904,32 +995,105 @@ bool _tevent_req_nomem(const void *p,
|
||||
_tevent_req_nomem(p, req, __location__)
|
||||
#endif
|
||||
|
||||
#ifdef DOXYGEN
|
||||
/**
|
||||
* @brief Indicate out of memory to a request
|
||||
*
|
||||
* @param[in] req The request being processed.
|
||||
*/
|
||||
void tevent_req_oom(struct tevent_req *req);
|
||||
#else
|
||||
void _tevent_req_oom(struct tevent_req *req,
|
||||
const char *location);
|
||||
#define tevent_req_oom(req) \
|
||||
_tevent_req_oom(req, __location__)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Finish a request before the caller had the change to set the callback.
|
||||
*
|
||||
* An implementation of an async request might find that it can either finish
|
||||
* the request without waiting for an external event, or it can't even start
|
||||
* the request without waiting for an external event, or it can not even start
|
||||
* the engine. To present the illusion of a callback to the user of the API,
|
||||
* the implementation can call this helper function which triggers an
|
||||
* immediate timed event. This way the caller can use the same calling
|
||||
* immediate event. This way the caller can use the same calling
|
||||
* conventions, independent of whether the request was actually deferred.
|
||||
*
|
||||
* @code
|
||||
* struct tevent_req *computation_send(TALLOC_CTX *mem_ctx,
|
||||
* struct tevent_context *ev)
|
||||
* {
|
||||
* struct tevent_req *req, *subreq;
|
||||
* struct computation_state *state;
|
||||
* req = tevent_req_create(mem_ctx, &state, struct computation_state);
|
||||
* if (req == NULL) {
|
||||
* return NULL;
|
||||
* }
|
||||
* subreq = subcomputation_send(state, ev);
|
||||
* if (tevent_req_nomem(subreq, req)) {
|
||||
* return tevent_req_post(req, ev);
|
||||
* }
|
||||
* tevent_req_set_callback(subreq, computation_done, req);
|
||||
* return req;
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] req The finished request.
|
||||
*
|
||||
* @param[in] ev The tevent_context for the timed event.
|
||||
* @param[in] ev The tevent_context for the immediate event.
|
||||
*
|
||||
* @return The given request will be returned.
|
||||
*/
|
||||
struct tevent_req *tevent_req_post(struct tevent_req *req,
|
||||
struct tevent_context *ev);
|
||||
|
||||
/**
|
||||
* @brief Finish multiple requests within one function
|
||||
*
|
||||
* Normally tevent_req_notify_callback() and all wrappers
|
||||
* (e.g. tevent_req_done() and tevent_req_error())
|
||||
* need to be the last thing an event handler should call.
|
||||
* This is because the callback is likely to destroy the
|
||||
* context of the current function.
|
||||
*
|
||||
* If a function wants to notify more than one caller,
|
||||
* it is dangerous if it just triggers multiple callbacks
|
||||
* in a row. With tevent_req_defer_callback() it is possible
|
||||
* to set an event context that will be used to defer the callback
|
||||
* via an immediate event (similar to tevent_req_post()).
|
||||
*
|
||||
* @code
|
||||
* struct complete_state {
|
||||
* struct tevent_context *ev;
|
||||
*
|
||||
* struct tevent_req **reqs;
|
||||
* };
|
||||
*
|
||||
* void complete(struct complete_state *state)
|
||||
* {
|
||||
* size_t i, c = talloc_array_length(state->reqs);
|
||||
*
|
||||
* for (i=0; i < c; i++) {
|
||||
* tevent_req_defer_callback(state->reqs[i], state->ev);
|
||||
* tevent_req_done(state->reqs[i]);
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] req The finished request.
|
||||
*
|
||||
* @param[in] ev The tevent_context for the immediate event.
|
||||
*
|
||||
* @return The given request will be returned.
|
||||
*/
|
||||
void tevent_req_defer_callback(struct tevent_req *req,
|
||||
struct tevent_context *ev);
|
||||
|
||||
/**
|
||||
* @brief Check if the given request is still in progress.
|
||||
*
|
||||
* It is typically used by sync wrapper functions.
|
||||
*
|
||||
* This function destroys the attached private data.
|
||||
*
|
||||
* @param[in] req The request to poll.
|
||||
*
|
||||
* @return The boolean form of "is in progress".
|
||||
@ -967,7 +1131,21 @@ bool tevent_req_poll(struct tevent_req *req,
|
||||
struct tevent_context *ev);
|
||||
|
||||
/**
|
||||
* @brief Get the tevent request and the actual error code you've set.
|
||||
* @brief Get the tevent request state and the actual error set by
|
||||
* tevent_req_error.
|
||||
*
|
||||
* @code
|
||||
* int computation_recv(struct tevent_req *req, uint64_t *perr)
|
||||
* {
|
||||
* enum tevent_req_state state;
|
||||
* uint64_t err;
|
||||
* if (tevent_req_is_error(req, &state, &err)) {
|
||||
* *perr = err;
|
||||
* return -1;
|
||||
* }
|
||||
* return 0;
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] req The tevent request to get the error from.
|
||||
*
|
||||
@ -1008,7 +1186,7 @@ void tevent_req_received(struct tevent_req *req);
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* static my_callback_wakeup_done(tevent_req *req)
|
||||
* static void my_callback_wakeup_done(tevent_req *subreq)
|
||||
* {
|
||||
* struct tevent_req *req = tevent_req_callback_data(subreq,
|
||||
* struct tevent_req);
|
||||
@ -1096,7 +1274,7 @@ struct timeval tevent_timeval_current(void);
|
||||
*
|
||||
* @param[in] secs The seconds to set.
|
||||
*
|
||||
* @param[in] usecs The milliseconds to set.
|
||||
* @param[in] usecs The microseconds to set.
|
||||
*
|
||||
* @return A timeval structure with the given values.
|
||||
*/
|
||||
@ -1131,7 +1309,7 @@ bool tevent_timeval_is_zero(const struct timeval *tv);
|
||||
*
|
||||
* @param[in] secs The seconds to add to the timeval.
|
||||
*
|
||||
* @param[in] usecs The milliseconds to add to the timeval.
|
||||
* @param[in] usecs The microseconds to add to the timeval.
|
||||
*
|
||||
* @return The timeval structure with the new time.
|
||||
*/
|
||||
@ -1143,7 +1321,7 @@ struct timeval tevent_timeval_add(const struct timeval *tv, uint32_t secs,
|
||||
*
|
||||
* @param[in] secs The seconds of the offset from now.
|
||||
*
|
||||
* @param[in] usecs The milliseconds of the offset from now.
|
||||
* @param[in] usecs The microseconds of the offset from now.
|
||||
*
|
||||
* @return A timval with the given offset in the future.
|
||||
*/
|
||||
@ -1169,6 +1347,7 @@ struct timeval tevent_timeval_current_ofs(uint32_t secs, uint32_t usecs);
|
||||
*/
|
||||
|
||||
struct tevent_queue;
|
||||
struct tevent_queue_entry;
|
||||
|
||||
#ifdef DOXYGEN
|
||||
/**
|
||||
@ -1180,8 +1359,8 @@ struct tevent_queue;
|
||||
*
|
||||
* @return An allocated tevent queue on success, NULL on error.
|
||||
*
|
||||
* @see tevent_start()
|
||||
* @see tevent_stop()
|
||||
* @see tevent_queue_start()
|
||||
* @see tevent_queue_stop()
|
||||
*/
|
||||
struct tevent_queue *tevent_queue_create(TALLOC_CTX *mem_ctx,
|
||||
const char *name);
|
||||
@ -1203,6 +1382,8 @@ struct tevent_queue *_tevent_queue_create(TALLOC_CTX *mem_ctx,
|
||||
* tevent_queue_add().
|
||||
*
|
||||
* @see tevent_queue_add()
|
||||
* @see tevent_queue_add_entry()
|
||||
* @see tevent_queue_add_optimize_empty()
|
||||
*/
|
||||
typedef void (*tevent_queue_trigger_fn_t)(struct tevent_req *req,
|
||||
void *private_data);
|
||||
@ -1217,7 +1398,9 @@ typedef void (*tevent_queue_trigger_fn_t)(struct tevent_req *req,
|
||||
* @param[in] req The tevent request to add to the queue.
|
||||
*
|
||||
* @param[in] trigger The function triggered by the queue when the request
|
||||
* is called.
|
||||
* is called. Since tevent 0.9.14 it's possible to
|
||||
* pass NULL, in order to just add a "blocker" to the
|
||||
* queue.
|
||||
*
|
||||
* @param[in] private_data The private data passed to the trigger function.
|
||||
*
|
||||
@ -1230,6 +1413,79 @@ bool tevent_queue_add(struct tevent_queue *queue,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data);
|
||||
|
||||
/**
|
||||
* @brief Add a tevent request to the queue.
|
||||
*
|
||||
* The request can be removed from the queue by calling talloc_free()
|
||||
* (or a similar function) on the returned queue entry. This
|
||||
* is the only difference to tevent_queue_add().
|
||||
*
|
||||
* @param[in] queue The queue to add the request.
|
||||
*
|
||||
* @param[in] ev The event handle to use for the request.
|
||||
*
|
||||
* @param[in] req The tevent request to add to the queue.
|
||||
*
|
||||
* @param[in] trigger The function triggered by the queue when the request
|
||||
* is called. Since tevent 0.9.14 it's possible to
|
||||
* pass NULL, in order to just add a "blocker" to the
|
||||
* queue.
|
||||
*
|
||||
* @param[in] private_data The private data passed to the trigger function.
|
||||
*
|
||||
* @return a pointer to the tevent_queue_entry if the request
|
||||
* has been successfully added, NULL otherwise.
|
||||
*
|
||||
* @see tevent_queue_add()
|
||||
* @see tevent_queue_add_optimize_empty()
|
||||
*/
|
||||
struct tevent_queue_entry *tevent_queue_add_entry(
|
||||
struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data);
|
||||
|
||||
/**
|
||||
* @brief Add a tevent request to the queue using a possible optimization.
|
||||
*
|
||||
* This tries to optimize for the empty queue case and may calls
|
||||
* the trigger function directly. This is the only difference compared
|
||||
* to tevent_queue_add_entry().
|
||||
*
|
||||
* The caller needs to be prepared that the trigger function has
|
||||
* already called tevent_req_notify_callback(), tevent_req_error(),
|
||||
* tevent_req_done() or a similar function.
|
||||
*
|
||||
* The request can be removed from the queue by calling talloc_free()
|
||||
* (or a similar function) on the returned queue entry.
|
||||
*
|
||||
* @param[in] queue The queue to add the request.
|
||||
*
|
||||
* @param[in] ev The event handle to use for the request.
|
||||
*
|
||||
* @param[in] req The tevent request to add to the queue.
|
||||
*
|
||||
* @param[in] trigger The function triggered by the queue when the request
|
||||
* is called. Since tevent 0.9.14 it's possible to
|
||||
* pass NULL, in order to just add a "blocker" to the
|
||||
* queue.
|
||||
*
|
||||
* @param[in] private_data The private data passed to the trigger function.
|
||||
*
|
||||
* @return a pointer to the tevent_queue_entry if the request
|
||||
* has been successfully added, NULL otherwise.
|
||||
*
|
||||
* @see tevent_queue_add()
|
||||
* @see tevent_queue_add_entry()
|
||||
*/
|
||||
struct tevent_queue_entry *tevent_queue_add_optimize_empty(
|
||||
struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data);
|
||||
|
||||
/**
|
||||
* @brief Start a tevent queue.
|
||||
*
|
||||
@ -1257,6 +1513,17 @@ void tevent_queue_stop(struct tevent_queue *queue);
|
||||
*/
|
||||
size_t tevent_queue_length(struct tevent_queue *queue);
|
||||
|
||||
/**
|
||||
* @brief Is the tevent queue running.
|
||||
*
|
||||
* The queue is started by default.
|
||||
*
|
||||
* @param[in] queue The queue.
|
||||
*
|
||||
* @return Wether the queue is running or not..
|
||||
*/
|
||||
bool tevent_queue_running(struct tevent_queue *queue);
|
||||
|
||||
typedef int (*tevent_nesting_hook)(struct tevent_context *ev,
|
||||
void *private_data,
|
||||
uint32_t level,
|
||||
@ -1264,7 +1531,6 @@ typedef int (*tevent_nesting_hook)(struct tevent_context *ev,
|
||||
void *stack_ptr,
|
||||
const char *location);
|
||||
#ifdef TEVENT_DEPRECATED
|
||||
#if (TEVENT_DEPRECATED_QUIET != 1)
|
||||
#ifndef _DEPRECATED_
|
||||
#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
|
||||
#define _DEPRECATED_ __attribute__ ((deprecated))
|
||||
@ -1272,10 +1538,6 @@ typedef int (*tevent_nesting_hook)(struct tevent_context *ev,
|
||||
#define _DEPRECATED_
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#undef _DEPRECATED_
|
||||
#define _DEPRECATED_
|
||||
#endif
|
||||
void tevent_loop_allow_nesting(struct tevent_context *ev) _DEPRECATED_;
|
||||
void tevent_loop_set_nesting_hook(struct tevent_context *ev,
|
||||
tevent_nesting_hook hook,
|
||||
@ -1367,8 +1629,6 @@ bool tevent_register_backend(const char *name, const struct tevent_ops *ops);
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Saves ctdb from massive churn. */
|
||||
#define TEVENT_COMPAT_DEFINES 1
|
||||
#ifdef TEVENT_COMPAT_DEFINES
|
||||
|
||||
#define event_context tevent_context
|
||||
|
@ -1,46 +0,0 @@
|
||||
TEVENT_SOBASE = libtevent.$(SHLIBEXT)
|
||||
TEVENT_SONAME = $(TEVENT_SOBASE).0
|
||||
TEVENT_SOLIB = $(TEVENT_SOBASE).$(PACKAGE_VERSION)
|
||||
TEVENT_STLIB = libtevent.a
|
||||
|
||||
$(TEVENT_STLIB): $(TEVENT_OBJ)
|
||||
ar -rv $(TEVENT_STLIB) $(TEVENT_OBJ)
|
||||
|
||||
$(TEVENT_SOBASE): $(TEVENT_SOLIB)
|
||||
ln -fs $< $@
|
||||
|
||||
$(TEVENT_SONAME): $(TEVENT_SOLIB)
|
||||
ln -fs $< $@
|
||||
|
||||
dirs::
|
||||
@mkdir -p lib
|
||||
|
||||
installdirs::
|
||||
mkdir -p $(DESTDIR)$(includedir)
|
||||
mkdir -p $(DESTDIR)$(libdir)
|
||||
mkdir -p $(DESTDIR)$(libdir)/pkgconfig
|
||||
|
||||
installheaders:: installdirs
|
||||
cp $(srcdir)/tevent.h $(DESTDIR)$(includedir)
|
||||
|
||||
installlibs:: installdirs
|
||||
cp tevent.pc $(DESTDIR)$(libdir)/pkgconfig
|
||||
cp $(TEVENT_STLIB) $(TEVENT_SOLIB) $(DESTDIR)$(libdir)
|
||||
rm -f $(DESTDIR)$(libdir)/$(TEVENT_SONAME)
|
||||
ln -s $(TEVENT_SOLIB) $(DESTDIR)$(libdir)/$(TEVENT_SONAME)
|
||||
rm -f $(DESTDIR)$(libdir)/$(TEVENT_SOBASE)
|
||||
ln -s $(TEVENT_SOLIB) $(DESTDIR)$(libdir)/$(TEVENT_SOBASE)
|
||||
|
||||
install:: all installdirs installheaders installlibs $(PYTHON_INSTALL_TARGET)
|
||||
|
||||
abi_checks::
|
||||
@echo ABI checks:
|
||||
@./script/abi_checks.sh tevent tevent.h
|
||||
|
||||
test:: abi_checks
|
||||
|
||||
clean::
|
||||
rm -f $(TEVENT_SOBASE) $(TEVENT_SONAME) $(TEVENT_SOLIB) $(TEVENT_STLIB)
|
||||
rm -f tevent.pc
|
||||
rm -f tevent.exports.sort tevent.exports.check tevent.exports.check.sort
|
||||
rm -f tevent.signatures.sort tevent.signatures.check tevent.signatures.check.sort
|
@ -1,57 +0,0 @@
|
||||
_Bool tevent_queue_add (struct tevent_queue *, struct tevent_context *, struct tevent_req *, tevent_queue_trigger_fn_t, void *);
|
||||
_Bool tevent_register_backend (const char *, const struct tevent_ops *);
|
||||
_Bool _tevent_req_error (struct tevent_req *, uint64_t, const char *);
|
||||
_Bool tevent_req_is_error (struct tevent_req *, enum tevent_req_state *, uint64_t *);
|
||||
_Bool tevent_req_is_in_progress (struct tevent_req *);
|
||||
_Bool _tevent_req_nomem (const void *, struct tevent_req *, const char *);
|
||||
_Bool tevent_req_poll (struct tevent_req *, struct tevent_context *);
|
||||
_Bool tevent_req_set_endtime (struct tevent_req *, struct tevent_context *, struct timeval);
|
||||
_Bool tevent_signal_support (struct tevent_context *);
|
||||
_Bool tevent_timeval_is_zero (const struct timeval *);
|
||||
_Bool tevent_wakeup_recv (struct tevent_req *);
|
||||
char *tevent_req_default_print (struct tevent_req *, TALLOC_CTX *);
|
||||
char *tevent_req_print (TALLOC_CTX *, struct tevent_req *);
|
||||
const char **tevent_backend_list (TALLOC_CTX *);
|
||||
int _tevent_loop_once (struct tevent_context *, const char *);
|
||||
int _tevent_loop_until (struct tevent_context *, _Bool (*) (void *), void *, const char *);
|
||||
int _tevent_loop_wait (struct tevent_context *, const char *);
|
||||
int tevent_set_debug_stderr (struct tevent_context *);
|
||||
int tevent_set_debug (struct tevent_context *, void (*) (void *, enum tevent_debug_level, const char *, va_list), void *);
|
||||
int tevent_timeval_compare (const struct timeval *, const struct timeval *);
|
||||
size_t tevent_queue_length (struct tevent_queue *);
|
||||
struct tevent_context *tevent_context_init_byname (TALLOC_CTX *, const char *);
|
||||
struct tevent_context *tevent_context_init (TALLOC_CTX *);
|
||||
struct tevent_fd *_tevent_add_fd (struct tevent_context *, TALLOC_CTX *, int, uint16_t, tevent_fd_handler_t, void *, const char *, const char *);
|
||||
struct tevent_immediate *_tevent_create_immediate (TALLOC_CTX *, const char *);
|
||||
struct tevent_queue *_tevent_queue_create (TALLOC_CTX *, const char *, const char *);
|
||||
struct tevent_req *_tevent_req_create (TALLOC_CTX *, void *, size_t, const char *, const char *);
|
||||
struct tevent_req *tevent_req_post (struct tevent_req *, struct tevent_context *);
|
||||
struct tevent_req *tevent_wakeup_send (TALLOC_CTX *, struct tevent_context *, struct timeval);
|
||||
struct tevent_signal *_tevent_add_signal (struct tevent_context *, TALLOC_CTX *, int, int, tevent_signal_handler_t, void *, const char *, const char *);
|
||||
struct tevent_timer *_tevent_add_timer (struct tevent_context *, TALLOC_CTX *, struct timeval, tevent_timer_handler_t, void *, const char *, const char *);
|
||||
struct timeval tevent_timeval_add (const struct timeval *, uint32_t, uint32_t);
|
||||
struct timeval tevent_timeval_current_ofs (uint32_t, uint32_t);
|
||||
struct timeval tevent_timeval_current (void);
|
||||
struct timeval tevent_timeval_set (uint32_t, uint32_t);
|
||||
struct timeval tevent_timeval_until (const struct timeval *, const struct timeval *);
|
||||
struct timeval tevent_timeval_zero (void);
|
||||
uint16_t tevent_fd_get_flags (struct tevent_fd *);
|
||||
void tevent_fd_set_auto_close (struct tevent_fd *);
|
||||
void tevent_fd_set_close_fn (struct tevent_fd *, tevent_fd_close_fn_t);
|
||||
void tevent_fd_set_flags (struct tevent_fd *, uint16_t);
|
||||
void tevent_loop_allow_nesting (struct tevent_context *);
|
||||
void tevent_loop_set_nesting_hook (struct tevent_context *, tevent_nesting_hook, void *);
|
||||
void tevent_queue_start (struct tevent_queue *);
|
||||
void tevent_queue_stop (struct tevent_queue *);
|
||||
void *_tevent_req_callback_data (struct tevent_req *);
|
||||
void *_tevent_req_data (struct tevent_req *);
|
||||
void _tevent_req_done (struct tevent_req *, const char *);
|
||||
void _tevent_req_notify_callback (struct tevent_req *, const char *);
|
||||
void tevent_req_received (struct tevent_req *);
|
||||
void tevent_req_set_callback (struct tevent_req *, tevent_req_fn, void *);
|
||||
void tevent_req_set_print_fn (struct tevent_req *, tevent_req_print_fn);
|
||||
void _tevent_schedule_immediate (struct tevent_immediate *, struct tevent_context *, tevent_immediate_handler_t, void *, const char *, const char *);
|
||||
void tevent_set_abort_fn (void (*) (const char *));
|
||||
void tevent_set_default_backend (const char *);
|
||||
_Bool _tevent_req_cancel (struct tevent_req *, const char *);
|
||||
void tevent_req_set_cancel_fn (struct tevent_req *, tevent_req_cancel_fn);
|
@ -42,8 +42,7 @@ struct epoll_event_context {
|
||||
};
|
||||
|
||||
/*
|
||||
called when a epoll call fails, and we should fallback
|
||||
to using select
|
||||
called when a epoll call fails
|
||||
*/
|
||||
static void epoll_panic(struct epoll_event_context *epoll_ev, const char *reason)
|
||||
{
|
||||
@ -79,11 +78,20 @@ static int epoll_ctx_destructor(struct epoll_event_context *epoll_ev)
|
||||
static int epoll_init_ctx(struct epoll_event_context *epoll_ev)
|
||||
{
|
||||
epoll_ev->epoll_fd = epoll_create(64);
|
||||
epoll_ev->pid = getpid();
|
||||
talloc_set_destructor(epoll_ev, epoll_ctx_destructor);
|
||||
if (epoll_ev->epoll_fd == -1) {
|
||||
tevent_debug(epoll_ev->ev, TEVENT_DEBUG_FATAL,
|
||||
"Failed to create epoll handle.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!ev_set_close_on_exec(epoll_ev->epoll_fd)) {
|
||||
tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
|
||||
"Failed to set close-on-exec, file descriptor may be leaked to children.\n");
|
||||
}
|
||||
|
||||
epoll_ev->pid = getpid();
|
||||
talloc_set_destructor(epoll_ev, epoll_ctx_destructor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -109,6 +117,12 @@ static void epoll_check_reopen(struct epoll_event_context *epoll_ev)
|
||||
"Failed to recreate epoll handle after fork\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ev_set_close_on_exec(epoll_ev->epoll_fd)) {
|
||||
tevent_debug(epoll_ev->ev, TEVENT_DEBUG_WARNING,
|
||||
"Failed to set close-on-exec, file descriptor may be leaked to children.\n");
|
||||
}
|
||||
|
||||
epoll_ev->pid = getpid();
|
||||
for (fde=epoll_ev->ev->fd_events;fde;fde=fde->next) {
|
||||
epoll_add_event(epoll_ev, fde);
|
||||
@ -228,8 +242,6 @@ static void epoll_change_event(struct epoll_event_context *epoll_ev, struct teve
|
||||
}
|
||||
}
|
||||
|
||||
extern pid_t ctdbd_pid;
|
||||
|
||||
/*
|
||||
event loop handling using epoll
|
||||
*/
|
||||
@ -252,9 +264,7 @@ static int epoll_event_loop(struct epoll_event_context *epoll_ev, struct timeval
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getpid() == ctdbd_pid) tevent_before_wait(epoll_ev->ev);
|
||||
ret = epoll_wait(epoll_ev->epoll_fd, events, MAXEVENTS, timeout);
|
||||
if (getpid() == ctdbd_pid) tevent_after_wait(epoll_ev->ev);
|
||||
|
||||
if (ret == -1 && errno == EINTR && epoll_ev->ev->signal_events) {
|
||||
if (tevent_common_check_signal(epoll_ev->ev)) {
|
||||
|
@ -51,6 +51,12 @@ struct tevent_fd *tevent_common_add_fd(struct tevent_context *ev, TALLOC_CTX *me
|
||||
{
|
||||
struct tevent_fd *fde;
|
||||
|
||||
/* tevent will crash later on select() if we save
|
||||
* a negative file descriptor. Better to fail here
|
||||
* so that consumers will be able to debug it
|
||||
*/
|
||||
if (fd < 0) return NULL;
|
||||
|
||||
fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
|
||||
if (!fde) return NULL;
|
||||
|
||||
|
@ -141,6 +141,12 @@ struct tevent_req {
|
||||
*/
|
||||
struct tevent_immediate *trigger;
|
||||
|
||||
/**
|
||||
* @brief An event context which will be used to
|
||||
* defer the _tevent_req_notify_callback().
|
||||
*/
|
||||
struct tevent_context *defer_callback_ev;
|
||||
|
||||
/**
|
||||
* @brief the timer event if tevent_req_set_endtime was used
|
||||
*
|
||||
@ -162,7 +168,7 @@ struct tevent_fd {
|
||||
const char *handler_name;
|
||||
const char *location;
|
||||
/* this is private for the events_ops implementation */
|
||||
uint16_t additional_flags;
|
||||
uint64_t additional_flags;
|
||||
void *additional_data;
|
||||
};
|
||||
|
||||
@ -303,6 +309,7 @@ void tevent_cleanup_pending_signal_handlers(struct tevent_signal *se);
|
||||
|
||||
bool tevent_standard_init(void);
|
||||
bool tevent_select_init(void);
|
||||
bool tevent_poll_init(void);
|
||||
#ifdef HAVE_EPOLL
|
||||
bool tevent_epoll_init(void);
|
||||
#endif
|
||||
|
312
ctdb/lib/tevent/tevent_poll.c
Normal file
312
ctdb/lib/tevent/tevent_poll.c
Normal file
@ -0,0 +1,312 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
main select loop and event handling
|
||||
Copyright (C) Andrew Tridgell 2003-2005
|
||||
Copyright (C) Stefan Metzmacher 2005-2009
|
||||
|
||||
** NOTE! The following LGPL license applies to the tevent
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "replace.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/select.h"
|
||||
#include "tevent.h"
|
||||
#include "tevent_util.h"
|
||||
#include "tevent_internal.h"
|
||||
|
||||
struct poll_event_context {
|
||||
/*
|
||||
* These two arrays are maintained together.
|
||||
*/
|
||||
struct pollfd *fds;
|
||||
struct tevent_fd **fd_events;
|
||||
uint64_t num_fds;
|
||||
|
||||
/* information for exiting from the event loop */
|
||||
int exit_code;
|
||||
};
|
||||
|
||||
/*
|
||||
create a select_event_context structure.
|
||||
*/
|
||||
static int poll_event_context_init(struct tevent_context *ev)
|
||||
{
|
||||
struct poll_event_context *poll_ev;
|
||||
|
||||
poll_ev = talloc_zero(ev, struct poll_event_context);
|
||||
if (poll_ev == NULL) {
|
||||
return -1;
|
||||
}
|
||||
ev->additional_data = poll_ev;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
destroy an fd_event
|
||||
*/
|
||||
static int poll_event_fd_destructor(struct tevent_fd *fde)
|
||||
{
|
||||
struct tevent_context *ev = fde->event_ctx;
|
||||
struct poll_event_context *poll_ev = NULL;
|
||||
struct tevent_fd *moved_fde;
|
||||
uint64_t del_idx = fde->additional_flags;
|
||||
|
||||
if (ev == NULL) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
poll_ev = talloc_get_type_abort(
|
||||
ev->additional_data, struct poll_event_context);
|
||||
|
||||
moved_fde = poll_ev->fd_events[poll_ev->num_fds-1];
|
||||
poll_ev->fd_events[del_idx] = moved_fde;
|
||||
poll_ev->fds[del_idx] = poll_ev->fds[poll_ev->num_fds-1];
|
||||
moved_fde->additional_flags = del_idx;
|
||||
|
||||
poll_ev->num_fds -= 1;
|
||||
done:
|
||||
return tevent_common_fd_destructor(fde);
|
||||
}
|
||||
|
||||
/*
|
||||
add a fd based event
|
||||
return NULL on failure (memory allocation error)
|
||||
*/
|
||||
static struct tevent_fd *poll_event_add_fd(struct tevent_context *ev,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
int fd, uint16_t flags,
|
||||
tevent_fd_handler_t handler,
|
||||
void *private_data,
|
||||
const char *handler_name,
|
||||
const char *location)
|
||||
{
|
||||
struct poll_event_context *poll_ev = talloc_get_type_abort(
|
||||
ev->additional_data, struct poll_event_context);
|
||||
struct pollfd *pfd;
|
||||
struct tevent_fd *fde;
|
||||
|
||||
fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
|
||||
handler, private_data,
|
||||
handler_name, location);
|
||||
if (fde == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* we allocate 16 slots to avoid a lot of reallocations */
|
||||
if (talloc_array_length(poll_ev->fds) == poll_ev->num_fds) {
|
||||
struct pollfd *tmp_fds;
|
||||
struct tevent_fd **tmp_fd_events;
|
||||
tmp_fds = talloc_realloc(
|
||||
poll_ev, poll_ev->fds, struct pollfd,
|
||||
poll_ev->num_fds + 16);
|
||||
if (tmp_fds == NULL) {
|
||||
TALLOC_FREE(fde);
|
||||
return NULL;
|
||||
}
|
||||
poll_ev->fds = tmp_fds;
|
||||
|
||||
tmp_fd_events = talloc_realloc(
|
||||
poll_ev, poll_ev->fd_events, struct tevent_fd *,
|
||||
poll_ev->num_fds + 16);
|
||||
if (tmp_fd_events == NULL) {
|
||||
TALLOC_FREE(fde);
|
||||
return NULL;
|
||||
}
|
||||
poll_ev->fd_events = tmp_fd_events;
|
||||
}
|
||||
|
||||
pfd = &poll_ev->fds[poll_ev->num_fds];
|
||||
|
||||
pfd->fd = fd;
|
||||
|
||||
pfd->events = 0;
|
||||
pfd->revents = 0;
|
||||
|
||||
if (flags & TEVENT_FD_READ) {
|
||||
pfd->events |= (POLLIN|POLLHUP);
|
||||
}
|
||||
if (flags & TEVENT_FD_WRITE) {
|
||||
pfd->events |= (POLLOUT);
|
||||
}
|
||||
|
||||
fde->additional_flags = poll_ev->num_fds;
|
||||
poll_ev->fd_events[poll_ev->num_fds] = fde;
|
||||
|
||||
poll_ev->num_fds += 1;
|
||||
|
||||
talloc_set_destructor(fde, poll_event_fd_destructor);
|
||||
|
||||
return fde;
|
||||
}
|
||||
|
||||
/*
|
||||
set the fd event flags
|
||||
*/
|
||||
static void poll_event_set_fd_flags(struct tevent_fd *fde, uint16_t flags)
|
||||
{
|
||||
struct poll_event_context *poll_ev = talloc_get_type_abort(
|
||||
fde->event_ctx->additional_data, struct poll_event_context);
|
||||
uint64_t idx = fde->additional_flags;
|
||||
uint16_t pollflags = 0;
|
||||
|
||||
if (flags & TEVENT_FD_READ) {
|
||||
pollflags |= (POLLIN|POLLHUP);
|
||||
}
|
||||
if (flags & TEVENT_FD_WRITE) {
|
||||
pollflags |= (POLLOUT);
|
||||
}
|
||||
|
||||
poll_ev->fds[idx].events = pollflags;
|
||||
|
||||
fde->flags = flags;
|
||||
}
|
||||
|
||||
/*
|
||||
event loop handling using poll()
|
||||
*/
|
||||
static int poll_event_loop_poll(struct tevent_context *ev,
|
||||
struct timeval *tvalp)
|
||||
{
|
||||
struct poll_event_context *poll_ev = talloc_get_type_abort(
|
||||
ev->additional_data, struct poll_event_context);
|
||||
struct tevent_fd *fde;
|
||||
int pollrtn;
|
||||
int timeout = -1;
|
||||
|
||||
if (ev->signal_events && tevent_common_check_signal(ev)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tvalp != NULL) {
|
||||
timeout = tvalp->tv_sec * 1000;
|
||||
timeout += (tvalp->tv_usec + 999) / 1000;
|
||||
}
|
||||
|
||||
pollrtn = poll(poll_ev->fds, poll_ev->num_fds, timeout);
|
||||
|
||||
if (pollrtn == -1 && errno == EINTR && ev->signal_events) {
|
||||
tevent_common_check_signal(ev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pollrtn == -1 && errno == EBADF) {
|
||||
/* the socket is dead! this should never
|
||||
happen as the socket should have first been
|
||||
made readable and that should have removed
|
||||
the event, so this must be a bug. This is a
|
||||
fatal error. */
|
||||
tevent_debug(ev, TEVENT_DEBUG_FATAL,
|
||||
"ERROR: EBADF on poll_event_loop_once\n");
|
||||
poll_ev->exit_code = EBADF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pollrtn == 0 && tvalp) {
|
||||
/* we don't care about a possible delay here */
|
||||
tevent_common_loop_timer_delay(ev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pollrtn <= 0) {
|
||||
/*
|
||||
* No fd's ready
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* at least one file descriptor is ready - check
|
||||
which ones and call the handler, being careful to allow
|
||||
the handler to remove itself when called */
|
||||
|
||||
for (fde = ev->fd_events; fde; fde = fde->next) {
|
||||
struct pollfd *pfd;
|
||||
uint64_t pfd_idx = fde->additional_flags;
|
||||
uint16_t flags = 0;
|
||||
|
||||
pfd = &poll_ev->fds[pfd_idx];
|
||||
|
||||
if (pfd->revents & (POLLHUP|POLLERR)) {
|
||||
/* If we only wait for TEVENT_FD_WRITE, we
|
||||
should not tell the event handler about it,
|
||||
and remove the writable flag, as we only
|
||||
report errors when waiting for read events
|
||||
to match the select behavior. */
|
||||
if (!(fde->flags & TEVENT_FD_READ)) {
|
||||
TEVENT_FD_NOT_WRITEABLE(fde);
|
||||
continue;
|
||||
}
|
||||
flags |= TEVENT_FD_READ;
|
||||
}
|
||||
if (pfd->revents & POLLIN) {
|
||||
flags |= TEVENT_FD_READ;
|
||||
}
|
||||
if (pfd->revents & POLLOUT) {
|
||||
flags |= TEVENT_FD_WRITE;
|
||||
}
|
||||
if (flags != 0) {
|
||||
fde->handler(ev, fde, flags, fde->private_data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
do a single event loop using the events defined in ev
|
||||
*/
|
||||
static int poll_event_loop_once(struct tevent_context *ev,
|
||||
const char *location)
|
||||
{
|
||||
struct timeval tval;
|
||||
|
||||
if (ev->signal_events &&
|
||||
tevent_common_check_signal(ev)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ev->immediate_events &&
|
||||
tevent_common_loop_immediate(ev)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
tval = tevent_common_loop_timer_delay(ev);
|
||||
if (tevent_timeval_is_zero(&tval)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return poll_event_loop_poll(ev, &tval);
|
||||
}
|
||||
|
||||
static const struct tevent_ops poll_event_ops = {
|
||||
.context_init = poll_event_context_init,
|
||||
.add_fd = poll_event_add_fd,
|
||||
.set_fd_close_fn = tevent_common_fd_set_close_fn,
|
||||
.get_fd_flags = tevent_common_fd_get_flags,
|
||||
.set_fd_flags = poll_event_set_fd_flags,
|
||||
.add_timer = tevent_common_add_timer,
|
||||
.schedule_immediate = tevent_common_schedule_immediate,
|
||||
.add_signal = tevent_common_add_signal,
|
||||
.loop_once = poll_event_loop_once,
|
||||
.loop_wait = tevent_common_loop_wait,
|
||||
};
|
||||
|
||||
_PRIVATE_ bool tevent_poll_init(void)
|
||||
{
|
||||
return tevent_register_backend("poll", &poll_event_ops);
|
||||
}
|
@ -144,17 +144,19 @@ static void tevent_queue_immediate_trigger(struct tevent_context *ev,
|
||||
q->list->trigger(q->list->req, q->list->private_data);
|
||||
}
|
||||
|
||||
bool tevent_queue_add(struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data)
|
||||
static struct tevent_queue_entry *tevent_queue_add_internal(
|
||||
struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data,
|
||||
bool allow_direct)
|
||||
{
|
||||
struct tevent_queue_entry *e;
|
||||
|
||||
e = talloc_zero(req, struct tevent_queue_entry);
|
||||
if (e == NULL) {
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
e->queue = queue;
|
||||
@ -163,16 +165,53 @@ bool tevent_queue_add(struct tevent_queue *queue,
|
||||
e->trigger = trigger;
|
||||
e->private_data = private_data;
|
||||
|
||||
/*
|
||||
* if there is no trigger, it is just a blocker
|
||||
*/
|
||||
if (trigger == NULL) {
|
||||
e->triggered = true;
|
||||
}
|
||||
|
||||
if (queue->length > 0) {
|
||||
/*
|
||||
* if there are already entries in the
|
||||
* queue do not optimize.
|
||||
*/
|
||||
allow_direct = false;
|
||||
}
|
||||
|
||||
if (req->async.fn != NULL) {
|
||||
/*
|
||||
* If the callers wants to optimize for the
|
||||
* empty queue case, call the trigger only
|
||||
* if there is no callback defined for the
|
||||
* request yet.
|
||||
*/
|
||||
allow_direct = false;
|
||||
}
|
||||
|
||||
DLIST_ADD_END(queue->list, e, struct tevent_queue_entry *);
|
||||
queue->length++;
|
||||
talloc_set_destructor(e, tevent_queue_entry_destructor);
|
||||
|
||||
if (!queue->running) {
|
||||
return true;
|
||||
return e;
|
||||
}
|
||||
|
||||
if (queue->list->triggered) {
|
||||
return true;
|
||||
return e;
|
||||
}
|
||||
|
||||
/*
|
||||
* If allowed we directly call the trigger
|
||||
* avoiding possible delays caused by
|
||||
* an immediate event.
|
||||
*/
|
||||
if (allow_direct) {
|
||||
queue->list->triggered = true;
|
||||
queue->list->trigger(queue->list->req,
|
||||
queue->list->private_data);
|
||||
return e;
|
||||
}
|
||||
|
||||
tevent_schedule_immediate(queue->immediate,
|
||||
@ -180,9 +219,48 @@ bool tevent_queue_add(struct tevent_queue *queue,
|
||||
tevent_queue_immediate_trigger,
|
||||
queue);
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
bool tevent_queue_add(struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data)
|
||||
{
|
||||
struct tevent_queue_entry *e;
|
||||
|
||||
e = tevent_queue_add_internal(queue, ev, req,
|
||||
trigger, private_data, false);
|
||||
if (e == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct tevent_queue_entry *tevent_queue_add_entry(
|
||||
struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data)
|
||||
{
|
||||
return tevent_queue_add_internal(queue, ev, req,
|
||||
trigger, private_data, false);
|
||||
}
|
||||
|
||||
struct tevent_queue_entry *tevent_queue_add_optimize_empty(
|
||||
struct tevent_queue *queue,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_req *req,
|
||||
tevent_queue_trigger_fn_t trigger,
|
||||
void *private_data)
|
||||
{
|
||||
return tevent_queue_add_internal(queue, ev, req,
|
||||
trigger, private_data, true);
|
||||
}
|
||||
|
||||
void tevent_queue_start(struct tevent_queue *queue)
|
||||
{
|
||||
if (queue->running) {
|
||||
@ -215,3 +293,8 @@ size_t tevent_queue_length(struct tevent_queue *queue)
|
||||
{
|
||||
return queue->length;
|
||||
}
|
||||
|
||||
bool tevent_queue_running(struct tevent_queue *queue)
|
||||
{
|
||||
return queue->running;
|
||||
}
|
||||
|
@ -74,6 +74,7 @@ struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
|
||||
talloc_free(req);
|
||||
return NULL;
|
||||
}
|
||||
req->internal.defer_callback_ev = NULL;
|
||||
|
||||
data = talloc_zero_size(req, data_size);
|
||||
if (data == NULL) {
|
||||
@ -91,6 +92,11 @@ struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx,
|
||||
void _tevent_req_notify_callback(struct tevent_req *req, const char *location)
|
||||
{
|
||||
req->internal.finish_location = location;
|
||||
if (req->internal.defer_callback_ev) {
|
||||
(void)tevent_req_post(req, req->internal.defer_callback_ev);
|
||||
req->internal.defer_callback_ev = NULL;
|
||||
return;
|
||||
}
|
||||
if (req->async.fn != NULL) {
|
||||
req->async.fn(req);
|
||||
}
|
||||
@ -123,6 +129,11 @@ bool _tevent_req_error(struct tevent_req *req,
|
||||
return true;
|
||||
}
|
||||
|
||||
void _tevent_req_oom(struct tevent_req *req, const char *location)
|
||||
{
|
||||
tevent_req_finish(req, TEVENT_REQ_NO_MEMORY, location);
|
||||
}
|
||||
|
||||
bool _tevent_req_nomem(const void *p,
|
||||
struct tevent_req *req,
|
||||
const char *location)
|
||||
@ -130,7 +141,7 @@ bool _tevent_req_nomem(const void *p,
|
||||
if (p != NULL) {
|
||||
return false;
|
||||
}
|
||||
tevent_req_finish(req, TEVENT_REQ_NO_MEMORY, location);
|
||||
_tevent_req_oom(req, location);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -164,6 +175,12 @@ struct tevent_req *tevent_req_post(struct tevent_req *req,
|
||||
return req;
|
||||
}
|
||||
|
||||
void tevent_req_defer_callback(struct tevent_req *req,
|
||||
struct tevent_context *ev)
|
||||
{
|
||||
req->internal.defer_callback_ev = ev;
|
||||
}
|
||||
|
||||
bool tevent_req_is_in_progress(struct tevent_req *req)
|
||||
{
|
||||
if (req->internal.state == TEVENT_REQ_IN_PROGRESS) {
|
||||
|
@ -111,6 +111,11 @@ static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_C
|
||||
struct select_event_context);
|
||||
struct tevent_fd *fde;
|
||||
|
||||
if (fd < 0 || fd >= FD_SETSIZE) {
|
||||
errno = EBADF;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
|
||||
handler, private_data,
|
||||
handler_name, location);
|
||||
@ -125,8 +130,6 @@ static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_C
|
||||
return fde;
|
||||
}
|
||||
|
||||
extern pid_t ctdbd_pid;
|
||||
|
||||
/*
|
||||
event loop handling using select()
|
||||
*/
|
||||
@ -146,6 +149,11 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
|
||||
|
||||
/* setup any fd events */
|
||||
for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
|
||||
if (fde->fd < 0 || fde->fd >= FD_SETSIZE) {
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fde->flags & TEVENT_FD_READ) {
|
||||
FD_SET(fde->fd, &r_fds);
|
||||
}
|
||||
@ -159,9 +167,7 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getpid() == ctdbd_pid) tevent_before_wait(select_ev->ev);
|
||||
selrtn = select(select_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp);
|
||||
if (getpid() == ctdbd_pid) tevent_after_wait(select_ev->ev);
|
||||
|
||||
if (selrtn == -1 && errno == EINTR &&
|
||||
select_ev->ev->signal_events) {
|
||||
|
@ -208,7 +208,7 @@ struct tevent_signal *tevent_common_add_signal(struct tevent_context *ev,
|
||||
/* the sig_state needs to be on a global context as it can last across
|
||||
multiple event contexts */
|
||||
if (sig_state == NULL) {
|
||||
sig_state = talloc_zero(talloc_autofree_context(), struct tevent_sig_state);
|
||||
sig_state = talloc_zero(NULL, struct tevent_sig_state);
|
||||
if (sig_state == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@ -307,6 +307,15 @@ struct tevent_signal *tevent_common_add_signal(struct tevent_context *ev,
|
||||
return se;
|
||||
}
|
||||
|
||||
struct tevent_se_exists {
|
||||
struct tevent_se_exists **myself;
|
||||
};
|
||||
|
||||
static int tevent_se_exists_destructor(struct tevent_se_exists *s)
|
||||
{
|
||||
*s->myself = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
check if a signal is pending
|
||||
@ -335,7 +344,25 @@ int tevent_common_check_signal(struct tevent_context *ev)
|
||||
}
|
||||
for (sl=sig_state->sig_handlers[i];sl;sl=next) {
|
||||
struct tevent_signal *se = sl->se;
|
||||
struct tevent_se_exists *exists;
|
||||
|
||||
next = sl->next;
|
||||
|
||||
/*
|
||||
* We have to be careful to not touch "se"
|
||||
* after it was deleted in its handler. Thus
|
||||
* we allocate a child whose destructor will
|
||||
* tell by nulling out itself that its parent
|
||||
* is gone.
|
||||
*/
|
||||
exists = talloc(se, struct tevent_se_exists);
|
||||
if (exists == NULL) {
|
||||
continue;
|
||||
}
|
||||
exists->myself = &exists;
|
||||
talloc_set_destructor(
|
||||
exists, tevent_se_exists_destructor);
|
||||
|
||||
#ifdef SA_SIGINFO
|
||||
if (se->sa_flags & SA_SIGINFO) {
|
||||
uint32_t j;
|
||||
@ -352,17 +379,26 @@ int tevent_common_check_signal(struct tevent_context *ev)
|
||||
se->handler(ev, se, i, 1,
|
||||
(void*)&sig_state->sig_info[i][ofs],
|
||||
se->private_data);
|
||||
if (!exists) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (se->sa_flags & SA_RESETHAND) {
|
||||
#ifdef SA_RESETHAND
|
||||
if (exists && (se->sa_flags & SA_RESETHAND)) {
|
||||
talloc_free(se);
|
||||
}
|
||||
#endif
|
||||
talloc_free(exists);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
se->handler(ev, se, i, count, NULL, se->private_data);
|
||||
if (se->sa_flags & SA_RESETHAND) {
|
||||
#ifdef SA_RESETHAND
|
||||
if (exists && (se->sa_flags & SA_RESETHAND)) {
|
||||
talloc_free(se);
|
||||
}
|
||||
#endif
|
||||
talloc_free(exists);
|
||||
}
|
||||
|
||||
#ifdef SA_SIGINFO
|
||||
|
@ -100,6 +100,17 @@ static int epoll_ctx_destructor(struct std_event_context *std_ev)
|
||||
static void epoll_init_ctx(struct std_event_context *std_ev)
|
||||
{
|
||||
std_ev->epoll_fd = epoll_create(64);
|
||||
if (std_ev->epoll_fd == -1) {
|
||||
tevent_debug(std_ev->ev, TEVENT_DEBUG_FATAL,
|
||||
"Failed to create epoll handle.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ev_set_close_on_exec(std_ev->epoll_fd)) {
|
||||
tevent_debug(std_ev->ev, TEVENT_DEBUG_WARNING,
|
||||
"Failed to set close-on-exec, file descriptor may be leaked to children.\n");
|
||||
}
|
||||
|
||||
std_ev->pid = getpid();
|
||||
talloc_set_destructor(std_ev, epoll_ctx_destructor);
|
||||
}
|
||||
@ -126,6 +137,12 @@ static void epoll_check_reopen(struct std_event_context *std_ev)
|
||||
"Failed to recreate epoll handle after fork\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ev_set_close_on_exec(std_ev->epoll_fd)) {
|
||||
tevent_debug(std_ev->ev, TEVENT_DEBUG_WARNING,
|
||||
"Failed to set close-on-exec, file descriptor may be leaked to children.\n");
|
||||
}
|
||||
|
||||
std_ev->pid = getpid();
|
||||
for (fde=std_ev->ev->fd_events;fde;fde=fde->next) {
|
||||
epoll_add_event(std_ev, fde);
|
||||
@ -239,8 +256,6 @@ static void epoll_change_event(struct std_event_context *std_ev, struct tevent_f
|
||||
}
|
||||
}
|
||||
|
||||
extern pid_t ctdbd_pid;
|
||||
|
||||
/*
|
||||
event loop handling using epoll
|
||||
*/
|
||||
@ -263,9 +278,7 @@ static int epoll_event_loop(struct std_event_context *std_ev, struct timeval *tv
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getpid() == ctdbd_pid) tevent_before_wait(std_ev->ev);
|
||||
ret = epoll_wait(std_ev->epoll_fd, events, MAXEVENTS, timeout);
|
||||
if (getpid() == ctdbd_pid) tevent_after_wait(std_ev->ev);
|
||||
|
||||
if (ret == -1 && errno == EINTR && std_ev->ev->signal_events) {
|
||||
if (tevent_common_check_signal(std_ev->ev)) {
|
||||
@ -461,6 +474,10 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva
|
||||
|
||||
/* setup any fd events */
|
||||
for (fde = std_ev->ev->fd_events; fde; fde = fde->next) {
|
||||
if (fde->fd < 0 || fde->fd >= FD_SETSIZE) {
|
||||
std_ev->exit_code = EBADF;
|
||||
return -1;
|
||||
}
|
||||
if (fde->flags & TEVENT_FD_READ) {
|
||||
FD_SET(fde->fd, &r_fds);
|
||||
}
|
||||
@ -509,7 +526,7 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva
|
||||
|
||||
if (FD_ISSET(fde->fd, &r_fds)) flags |= TEVENT_FD_READ;
|
||||
if (FD_ISSET(fde->fd, &w_fds)) flags |= TEVENT_FD_WRITE;
|
||||
if (flags) {
|
||||
if (flags & fde->flags) {
|
||||
fde->handler(std_ev->ev, fde, flags, fde->private_data);
|
||||
break;
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ struct tevent_timer *tevent_common_add_timer(struct tevent_context *ev, TALLOC_C
|
||||
/*
|
||||
do a single event loop using the events defined in ev
|
||||
|
||||
return the delay untill the next timed event,
|
||||
return the delay until the next timed event,
|
||||
or zero if a timed event was triggered
|
||||
*/
|
||||
struct timeval tevent_common_loop_timer_delay(struct tevent_context *ev)
|
||||
@ -208,7 +208,7 @@ struct timeval tevent_common_loop_timer_delay(struct tevent_context *ev)
|
||||
if (!te) {
|
||||
/* have a default tick time of 30 seconds. This guarantees
|
||||
that code that uses its own timeout checking will be
|
||||
able to proceeed eventually */
|
||||
able to proceed eventually */
|
||||
return tevent_timeval_set(30, 0);
|
||||
}
|
||||
|
||||
|
@ -89,53 +89,19 @@ int ev_set_blocking(int fd, bool set)
|
||||
#undef FLAG_TO_SET
|
||||
}
|
||||
|
||||
static struct timeval tevent_before_wait_ts;
|
||||
static struct timeval tevent_after_wait_ts;
|
||||
bool ev_set_close_on_exec(int fd)
|
||||
{
|
||||
#ifdef FD_CLOEXEC
|
||||
int val;
|
||||
|
||||
/*
|
||||
* measure the time difference between multiple arrivals
|
||||
* to the point where we wait for new events to come in
|
||||
*
|
||||
* allows to measure how long it takes to work on a
|
||||
* event
|
||||
*/
|
||||
void tevent_before_wait(struct event_context *ev) {
|
||||
|
||||
struct timeval diff;
|
||||
struct timeval now = tevent_timeval_current();
|
||||
|
||||
if (!tevent_timeval_is_zero(&tevent_after_wait_ts)) {
|
||||
diff = tevent_timeval_until(&tevent_after_wait_ts, &now);
|
||||
if (diff.tv_sec > 3) {
|
||||
tevent_debug(ev, TEVENT_DEBUG_ERROR, __location__
|
||||
" Handling event took %d seconds!",
|
||||
(int) diff.tv_sec);
|
||||
val = fcntl(fd, F_GETFD, 0);
|
||||
if (val >= 0) {
|
||||
val |= FD_CLOEXEC;
|
||||
val = fcntl(fd, F_SETFD, val);
|
||||
if (val != -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
tevent_before_wait_ts = tevent_timeval_current();
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* measure how long the select()/epoll() call took
|
||||
*
|
||||
* allows to measure how long we are waiting for new events
|
||||
*/
|
||||
void tevent_after_wait(struct event_context *ev) {
|
||||
|
||||
struct timeval diff;
|
||||
struct timeval now = tevent_timeval_current();
|
||||
|
||||
if (!tevent_timeval_is_zero(&tevent_before_wait_ts)) {
|
||||
diff = tevent_timeval_until(&tevent_before_wait_ts, &now);
|
||||
if (diff.tv_sec > 3) {
|
||||
tevent_debug(ev, TEVENT_DEBUG_FATAL, __location__
|
||||
" No event for %d seconds!",
|
||||
(int) diff.tv_sec);
|
||||
}
|
||||
}
|
||||
|
||||
tevent_after_wait_ts = tevent_timeval_current();
|
||||
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
@ -183,10 +183,7 @@ do { \
|
||||
const char **ev_str_list_add(const char **list, const char *s);
|
||||
int ev_set_blocking(int fd, bool set);
|
||||
size_t ev_str_list_length(const char **list);
|
||||
|
||||
void tevent_before_wait(struct event_context *ev);
|
||||
void tevent_after_wait(struct event_context *ev);
|
||||
|
||||
bool ev_set_close_on_exec(int fd);
|
||||
|
||||
/* Defined here so we can build against older talloc versions that don't
|
||||
* have this define yet. */
|
||||
|
@ -1,75 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
APPNAME = 'tevent'
|
||||
VERSION = '0.9.9'
|
||||
|
||||
blddir = 'bin'
|
||||
|
||||
import sys, os
|
||||
|
||||
# find the buildtools directory
|
||||
srcdir = '.'
|
||||
while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
|
||||
srcdir = '../' + srcdir
|
||||
sys.path.insert(0, srcdir + '/buildtools/wafsamba')
|
||||
|
||||
import wafsamba, samba_dist
|
||||
|
||||
samba_dist.DIST_DIRS('lib/tevent:. lib/replace:lib/replace lib/talloc:lib/talloc buildtools:buildtools')
|
||||
|
||||
def set_options(opt):
|
||||
opt.BUILTIN_DEFAULT('replace')
|
||||
opt.BUNDLED_EXTENSION_DEFAULT('tevent', noextension='tevent')
|
||||
opt.RECURSE('lib/replace')
|
||||
opt.RECURSE('lib/talloc')
|
||||
|
||||
def configure(conf):
|
||||
conf.RECURSE('lib/replace')
|
||||
conf.RECURSE('lib/talloc')
|
||||
|
||||
conf.env.standalone_tevent = conf.IN_LAUNCH_DIR()
|
||||
|
||||
if not conf.env.standalone_tevent:
|
||||
if conf.CHECK_BUNDLED_SYSTEM('tevent', minversion=VERSION,
|
||||
onlyif='talloc', implied_deps='replace talloc'):
|
||||
conf.define('USING_SYSTEM_TEVENT', 1)
|
||||
|
||||
if conf.CHECK_FUNCS('epoll_create', headers='sys/epoll.h'):
|
||||
conf.DEFINE('HAVE_EPOLL', 1)
|
||||
|
||||
conf.SAMBA_CONFIG_H()
|
||||
|
||||
def build(bld):
|
||||
bld.RECURSE('lib/replace')
|
||||
bld.RECURSE('lib/talloc')
|
||||
|
||||
SRC = '''tevent.c tevent_debug.c tevent_fd.c tevent_immediate.c
|
||||
tevent_queue.c tevent_req.c tevent_select.c
|
||||
tevent_signal.c tevent_standard.c tevent_timed.c tevent_util.c tevent_wakeup.c'''
|
||||
|
||||
if bld.CONFIG_SET('HAVE_EPOLL'):
|
||||
SRC += ' tevent_epoll.c'
|
||||
|
||||
if not bld.CONFIG_SET('USING_SYSTEM_TEVENT'):
|
||||
bld.SAMBA_LIBRARY('tevent',
|
||||
SRC,
|
||||
deps='replace talloc',
|
||||
enabled= not bld.CONFIG_SET('USING_SYSTEM_TEVENT'),
|
||||
abi_file='ABI/tevent-%s.sigs' % VERSION,
|
||||
abi_match='tevent_* _tevent_*',
|
||||
vnum=VERSION,
|
||||
is_bundled=not bld.env.standalone_tevent)
|
||||
|
||||
if bld.env.standalone_tevent:
|
||||
bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
|
||||
bld.PKG_CONFIG_FILES('tevent.pc', vnum=VERSION)
|
||||
bld.INSTALL_FILES('${INCLUDEDIR}', 'tevent.h')
|
||||
|
||||
def test(ctx):
|
||||
'''test tevent'''
|
||||
print("The tevent testsuite is part of smbtorture in samba4")
|
||||
|
||||
|
||||
def dist():
|
||||
'''makes a tarball for distribution'''
|
||||
samba_dist.dist()
|
@ -28,7 +28,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "db_wrap.h"
|
||||
|
||||
|
@ -17,7 +17,6 @@
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/time.h"
|
||||
#include "system/network.h"
|
||||
|
@ -21,7 +21,6 @@
|
||||
protocol design and packet details
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/network.h"
|
||||
|
@ -17,7 +17,6 @@
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include "includes.h"
|
||||
#include "db_wrap.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -17,7 +17,6 @@
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "db_wrap.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "../include/ctdb_client.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "system/syslog.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "db_wrap.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/time.h"
|
||||
#include "system/network.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/time.h"
|
||||
#include "system/network.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include <string.h>
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
|
||||
static void ctdb_statistics_update(struct event_context *ev, struct timed_event *te,
|
||||
|
@ -19,7 +19,6 @@
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/network.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/wait.h"
|
||||
#include "db_wrap.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "db_wrap.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "ctdb_private.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "system/syslog.h"
|
||||
#include "system/time.h"
|
||||
|
@ -20,7 +20,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
@ -28,7 +27,6 @@
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "db_wrap.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "../common/rb_tree.h"
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "system/time.h"
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "system/dir.h"
|
||||
#include "system/locale.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "../common/rb_tree.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/network.h"
|
||||
#include "system/filesys.h"
|
||||
#include "../include/ctdb_private.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "system/network.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <time.h>
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -26,12 +26,7 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include "lib/tevent/tevent.h"
|
||||
|
||||
#define tevent_context_init(x) tevent_context_init_foobar(x)
|
||||
struct tevent_context *tevent_context_init_foobar(TALLOC_CTX *mem_ctx);
|
||||
#define tevent_loop_allow_nesting(x) tevent_loop_allow_nesting_foobar(x)
|
||||
void tevent_loop_allow_nesting_foobar(struct tevent_context *ev);
|
||||
#define ctdb_cmdline_client(x, y) ctdb_cmdline_client_foobar(x, y)
|
||||
#define ctdb_get_socketname(x) ctdb_get_socketname_foobar(x)
|
||||
|
||||
@ -46,8 +41,6 @@ void tevent_loop_allow_nesting_foobar(struct tevent_context *ev);
|
||||
#include "tools/ctdb.c"
|
||||
|
||||
#ifdef CTDB_TEST_USE_MAIN
|
||||
#undef tevent_context_init
|
||||
#undef tevent_loop_allow_nesting
|
||||
#undef ctdb_cmdline_client
|
||||
#undef ctdb_get_socketname
|
||||
#else
|
||||
|
@ -22,11 +22,6 @@
|
||||
|
||||
#include "libctdb_test.c"
|
||||
|
||||
void tevent_loop_allow_nesting_foobar(struct tevent_context *ev)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
struct ctdb_context *ctdb_cmdline_client_foobar(struct tevent_context *ev,
|
||||
struct timeval req_timeout)
|
||||
{
|
||||
@ -37,12 +32,6 @@ struct ctdb_context *ctdb_cmdline_client_foobar(struct tevent_context *ev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct tevent_context *tevent_context_init_foobar(TALLOC_CTX *mem_ctx)
|
||||
{
|
||||
/* This should obviously never be used... */
|
||||
return (struct tevent_context *) 1;
|
||||
}
|
||||
|
||||
const char *ctdb_get_socketname_foobar(struct ctdb_context *ctdb)
|
||||
{
|
||||
return LIBCTDB_TEST_FAKESTATE;
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -20,7 +20,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
#include "cmdline.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/db_wrap.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
|
@ -21,7 +21,6 @@
|
||||
#define _CTDBD_TEST_C
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/tdb/include/tdb.h"
|
||||
#include "ctdb_private.h"
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "lib/util/dlinklist.h"
|
||||
#include "system/filesys.h"
|
||||
#include "popt.h"
|
||||
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/time.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/network.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "lib/tevent/tevent.h"
|
||||
#include "system/filesys.h"
|
||||
#include "system/network.h"
|
||||
#include "../include/ctdb_client.h"
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include <pcp/impl.h>
|
||||
#include <pcp/pmda.h>
|
||||
#include "../../include/includes.h"
|
||||
#include "../../lib/tevent/tevent.h"
|
||||
#include "../../include/ctdb.h"
|
||||
#include "../../include/ctdb_private.h"
|
||||
#include "../../include/ctdb_protocol.h"
|
||||
|
Loading…
Reference in New Issue
Block a user