Integrated mklove configure

This commit is contained in:
Magnus Edenhill 2014-03-16 14:38:19 +07:00
parent e48005eb21
commit 8388e25526
73 changed files with 2599 additions and 181 deletions

5
.gitignore vendored
View File

@ -1,3 +1,8 @@
config.h
config.log*
config.cache
Makefile.config
rdkafka.pc
*~
\#*
*.o

135
Makefile
View File

@ -1,136 +1,35 @@
LIBNAME=librdkafka
LIBVER=1
LIBSUBDIRS= src src-cpp
DESTDIR?=/usr/local
SRCS= rdkafka.c rdkafka_broker.c rdkafka_msg.c rdkafka_topic.c \
rdkafka_defaultconf.c rdkafka_timer.c rdkafka_offset.c
SRCS+= rdcrc32.c rdgz.c rdaddr.c rdrand.c rdthread.c rdqueue.c rdlog.c
SRCS+= snappy.c
HDRS= rdkafka.h
CFLAGS+=-O2 -Wall -Werror -Wfloat-equal -Wpointer-arith -I.
CFLAGS+=-g
# C++ interface
CXXSRCS+= RdKafka/RdKafka.cpp RdKafka/ConfImpl.cpp RdKafka/HandleImpl.cpp \
RdKafka/ConsumerImpl.cpp RdKafka/ProducerImpl.cpp \
RdKafka/TopicImpl.cpp RdKafka/MessageImpl.cpp
HDRS+= RdKafka/rdkafkacpp.h
CXXFLAGS+= -O2 -Wall -Werror -g -fPIC -std=c++03
OBJS= $(SRCS:.c=.o)
OBJS+= $(CXXSRCS:%.cpp=%.o)
DEPS= $(OBJS:%.o=%.d)
# Clang warnings to ignore
ifeq ($(CC),clang)
CFLAGS+=-Wno-gnu-designator
endif
# Enable iovecs in snappy
CFLAGS+=-DSG
# Profiling
#CFLAGS+=-O0
#CFLAGS += -pg
#LDFLAGS += -pg
LDFLAGS+= -g
UNAME_S = $(shell uname -s)
ifneq ($(findstring CYGWIN,$(UNAME_S)),CYGWIN)
LDFLAGS+=-fPIC
CFLAGS+=-fPIC
endif
CHECK_FILES+= CONFIGURATION.md \
examples/rdkafka_example examples/rdkafka_performance \
examples/rdkafka_example_cpp
.PHONY:
all: libs check
all: mklove-check libs CONFIGURATION.md check
libs: $(LIBNAME).so.$(LIBVER) $(LIBNAME).a CONFIGURATION.md
include mklove/Makefile.base
%.o: %.c
$(CC) -MD -MP $(CFLAGS) -c $<
%.o: %.cpp
$(CXX) -MD -MP $(CXXFLAGS) -c $< -o $@
libs:
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d || exit $?; done)
librdkafka.lds: rdkafka.h
@echo "\033[33mGenerating linker script $@\033[0m"
@./lds-gen.pl > $@
$(LIBNAME).so.$(LIBVER): $(OBJS) librdkafka.lds
@echo "\033[33mCreating shared library $@\033[0m"
@(if [ $(UNAME_S) = "Darwin" ]; then \
$(CC) $(LDFLAGS) \
$(OBJS) -dynamiclib -o $@ -lpthread -lz -lc ; \
else \
$(CC) $(LDFLAGS) \
-shared -Wl,-soname,$@ \
-Wl,--version-script=librdkafka.lds \
$(OBJS) -o $@ -lpthread -lrt -lz -lc ; \
fi)
$(LIBNAME).a: $(OBJS)
@echo "\033[33mCreating static library $@\033[0m"
$(AR) rcs $@ $(OBJS)
CONFIGURATION.md: rdkafka.h examples
CONFIGURATION.md: src/rdkafka.h examples
@echo "\033[33mUpdating $@\033[0m"
@(examples/rdkafka_performance -X list > CONFIGURATION.md.tmp; \
cmp CONFIGURATION.md CONFIGURATION.md.tmp || \
mv CONFIGURATION.md.tmp CONFIGURATION.md; \
rm -f CONFIGURATION.md.tmp)
examples: .PHONY
make -C $@
check: file-check
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ || exit $?; done)
install:
@echo "\033[33mInstall to root $(DESTDIR)\033[0m"
if [ "$(DESTDIR)" != "/usr/local" ]; then \
DESTDIR="$(DESTDIR)/usr"; \
else \
DESTDIR="$(DESTDIR)" ; \
fi ; \
install -d $$DESTDIR/include/librdkafka $$DESTDIR/lib ; \
install $(HDRS) $$DESTDIR/include/$(LIBNAME) ; \
install $(LIBNAME).a $$DESTDIR/lib ; \
install $(LIBNAME).so.$(LIBVER) $$DESTDIR/lib ; \
(cd $$DESTDIR/lib && ln -sf $(LIBNAME).so.$(LIBVER) $(LIBNAME).so)
tests: .PHONY check
make -C tests
check:
@echo "\033[33mChecking integrity\033[0m"
@(RET=true ; \
for f in librdkafka.so.1 librdkafka.a CONFIGURATION.md \
examples/rdkafka_example examples/rdkafka_performance ; do \
printf "%-30s " $$f ; \
if [ -f "$$f" ]; then \
echo "\033[32mOK\033[0m"; \
else \
echo "\033[31mMISSING\033[0m"; \
RET=false ; \
fi; \
done ; \
$$($$RET))
@(printf "%-30s " "Symbol visibility" ; \
((nm -D librdkafka.so.1 | grep -q rd_kafka_new) && \
(nm -D librdkafka.so.1 | grep -vq rd_kafka_destroy) && \
echo "\033[32mOK\033[0m") || \
echo "\033[31mFAILED\033[0m")
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ || exit $?; done)
examples tests: .PHONY
$(MAKE) -C $@
clean:
rm -f $(OBJS) $(DEPS) \
$(LIBNAME)*.a $(LIBNAME)*.so $(LIBNAME)*.so.$(LIBVER) \
librdkafka.lds
make -C tests clean
make -C examples clean
-include $(DEPS)
@$(MAKE) -C tests $@
@$(MAKE) -C examples $@
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ ; done)

204
configure vendored Executable file
View File

@ -0,0 +1,204 @@
#!/bin/bash
#
# Load base module
source mklove/modules/configure.base
# Read some special command line options right away that must be known prior to
# sourcing modules.
mkl_in_list "$*" "--no-download" && MKL_NO_DOWNLOAD=1
# Disable downloads when --help is used to avoid blocking calls.
mkl_in_list "$*" "--help" && MKL_NO_DOWNLOAD=1
mkl_in_list "$*" "--debug" && MKL_DEBUG=1
# Delete temporary Makefile and header files on exit.
trap "{ rm -f $MKL_OUTMK $MKL_OUTH; }" EXIT
##
## Load builtin modules
##
# Builtin options, etc.
mkl_require builtin
# Host/target support
mkl_require host
# Compiler detection
mkl_require cc
# Load application provided modules (in current directory), if any.
for fname in configure.* ; do
if [[ $fname = 'configure.*' ]]; then
continue
fi
# Skip temporary files
if [[ $fname = *~ ]]; then
continue
fi
mkl_require $fname
done
##
## Argument parsing (options)
##
##
# Parse arguments
while [[ ! -z $@ ]]; do
if [[ $1 != --* ]]; then
mkl_err "Unknown non-option argument: $1"
mkl_usage
exit 1
fi
opt=${1#--}
shift
if [[ $opt = *=* ]]; then
name="${opt%=*}"
arg="${opt#*=}"
eqarg=1
else
name="$opt"
arg=""
eqarg=0
fi
safeopt="$(mkl_env_esc $name)"
if ! mkl_func_exists opt_$safeopt ; then
mkl_err "Unknown option $opt"
mkl_usage
exit 1
fi
# Check if this option needs an argument.
reqarg=$(mkl_meta_get "MKL_OPT_ARGS" "$(mkl_env_esc $name)")
if [[ ! -z $reqarg ]]; then
if [[ $eqarg == 0 && -z $arg ]]; then
arg=$1
shift
if [[ -z $arg ]]; then
mkl_err "Missing argument to option --$name $reqarg"
exit 1
fi
fi
else
if [[ ! -z $arg ]]; then
mkl_err "Option --$name expects no argument"
exit 1
fi
arg=y
fi
case $name in
re|reconfigure)
oldcmd=$(grep '^# configure exec: ' config.log | \
sed -e 's/^\# configure exec: //')
if [[ -z $oldcmd ]]; then
echo "No previous execution found in config.log"
exit 1
fi
echo "Reconfiguring: $oldcmd"
exec $oldcmd
;;
list-modules)
echo "Modules loaded:"
for mod in $MKL_MODULES ; do
echo " $mod"
done
exit 0
;;
list-checks)
echo "Check functions in calling order:"
for mf in $MKL_CHECKS ; do
mod=${mf%:*}
func=${mf#*:}
echo -e "${MKL_GREEN}From module $mod:$MKL_CLR_RESET"
declare -f $func
echo ""
done
exit 0
;;
update-modules)
fails=0
echo "Updating modules"
for mod in $MKL_MODULES ; do
echo -n "Updating $mod..."
if mkl_module_download "$mod" > /dev/null ; then
echo -e "${MKL_GREEN}ok${MKL_CLR_RESET}"
else
echo -e "${MKL_RED}failed${MKL_CLR_RESET}"
fails=$(expr $fails + 1)
fi
done
exit $fails
;;
help)
mkl_usage
exit 0
;;
*)
opt_$safeopt $arg || exit 1
mkl_var_append MKL_OPTS_SET "$safeopt"
;;
esac
done
if [[ ! -z $MKL_CLEAN ]]; then
mkl_clean
exit 0
fi
# Move away previous log file
[[ -f $MKL_OUTDBG ]] && mv $MKL_OUTDBG ${MKL_OUTDBG}.old
# Create output files
echo "# configure exec: $0 $*" >> $MKL_OUTDBG
echo "# On $(date)" >> $MKL_OUTDBG
rm -f $MKL_OUTMK $MKL_OUTH
mkl_write_mk "# Automatically generated by $0 $*"
mkl_write_h "// Automatically generated by $0 $*"
mkl_write_h "#pragma once"
# Load cache file
mkl_cache_read
# Run checks
mkl_checks_run
# Check accumulated failures, will not return on failure.
mkl_check_fails
# Generate outputs
mkl_generate
# Summarize what happened
mkl_summary
# Write cache file
mkl_cache_write
echo ""
echo "Now type 'make' to build"
trap - EXIT
exit 0

33
configure.librdkafka Normal file
View File

@ -0,0 +1,33 @@
#!/bin/bash
#
mkl_require lib
mkl_require pic
mkl_require atomics must pass
mkl_require good_cflags
# Generate version variables from rdkafka.h hex version define
# so we can use it as string version when generating a pkg-config file.
verdef=$(grep -E '^#define +RD_KAFKA_VERSION +0x' src/rdkafka.h | sed -r 's/^#define +RD_KAFKA_VERSION +(0x[a-f0-9]+)\.*$/\1/')
mkl_require parseversion hex2str "%d.%d.%d" "$verdef" RDKAFKA_VERSION_STR
mkl_require gen-pkg-config "rdkafka" "The Apache Kafka C/C++ library" \
"Full Apache Kafka 0.8 protocol support, including producer and consumer" \
"\$RDKAFKA_VERSION_STR"
function checks {
# required libs
mkl_lib_check "libpthread" "" fail CC "-lpthread"
mkl_lib_check "zlib" "" fail CC "-lz"
# -lrt is needed on linux for clock_gettime: link it if it exists.
mkl_lib_check "librt" "" cont CC "-lrt"
# SG turns on scatter-gather support in snappy.c, which we need.
mkl_mkvar_append CFLAGS CFLAGS "-DSG"
# Older g++ (<=4.1?) gives invalid warnings for the C++ code.
mkl_mkvar_append CXXFLAGS CXXFLAGS "-Wno-non-virtual-dtor"
}

View File

@ -1,23 +1,15 @@
EXAMPLES ?= rdkafka_example rdkafka_performance rdkafka_example_cpp
CC ?= cc
CXX ?= g++
CFLAGS += -g -Wall -Werror -Wfloat-equal -Wpointer-arith -O2 -I../
CXXFLAGS += $(CFLAGS)
LDFLAGS += ../librdkafka.a
LDFLAGS += -lpthread -lz
ifeq ($(shell uname -s), Linux)
LDFLAGS += -lrt
endif
# Profiling
#CFLAGS += -O0 -pg
#LDFLAGS += -pg
all: $(EXAMPLES)
rdkafka_example: ../librdkafka.a rdkafka_example.c
@(test $@ -nt $< || \
$(CC) $(CFLAGS) rdkafka_example.c -o $@ $(LDFLAGS))
include ../mklove/Makefile.base
CFLAGS += -I../src
CXXFLAGS += -I../src-cpp
rdkafka_example: ../src/librdkafka.a rdkafka_example.c
$(CC) $(CPPFLAGS) $(CFLAGS) rdkafka_example.c -o $@ $(LDFLAGS) \
../src/librdkafka.a $(LIBS)
@echo "# $@ is ready"
@echo "#"
@echo "# Run producer (write messages on stdin)"
@ -30,9 +22,9 @@ rdkafka_example: ../librdkafka.a rdkafka_example.c
@echo "# More usage options:"
@echo "./rdkafka_example --help"
rdkafka_performance: ../librdkafka.a rdkafka_performance.c
@(test $@ -nt $< || \
$(CC) $(CFLAGS) rdkafka_performance.c -o $@ $(LDFLAGS))
rdkafka_performance: ../src/librdkafka.a rdkafka_performance.c
$(CC) $(CPPFLAGS) $(CFLAGS) rdkafka_performance.c -o $@ $(LDFLAGS) \
../src/librdkafka.a $(LIBS)
@echo "# $@ is ready"
@echo "#"
@echo "# Run producer"
@ -46,8 +38,9 @@ rdkafka_performance: ../librdkafka.a rdkafka_performance.c
@echo "./$@ --help"
rdkafka_example_cpp: ../librdkafka.a rdkafka_example.cpp
$(CXX) $(CXXFLAGS) rdkafka_example.cpp -o $@ $(LDFLAGS) -lstdc++
rdkafka_example_cpp: ../src-cpp/librdkafka++.a ../src/librdkafka.a rdkafka_example.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) rdkafka_example.cpp -o $@ $(LDFLAGS) \
../src-cpp/librdkafka++.a ../src/librdkafka.a $(LIBS) -lstdc++
clean:
rm -f $(EXAMPLES)

View File

@ -46,7 +46,7 @@
* Typically include path in a real application would be
* #include <librdkafka/rdkafkacpp.h>
*/
#include "../RdKafka/rdkafkacpp.h"
#include "rdkafkacpp.h"

View File

@ -5,18 +5,23 @@
# Generate linker script to only expose symbols of the public API
#
open(IN, "<rdkafka.h") or die("Failed to open rdkafka.h: $!\n");
@funcs = ();
while (<IN>) {
while (<>) {
push(@funcs, $2) if /^(\S+.*\s+\**)?(rd_kafka_\S+)\s+\(/;
}
close(IN);
print "# Automatically generated by lds-gen.pl - DO NOT EDIT\n";
print "{\n global:\n";
foreach my $f (sort @funcs) {
print " $f;\n";
if (scalar @funcs == 0) {
print " *;\n";
} else {
foreach my $f (sort @funcs) {
print " $f;\n";
}
print " local:\n *;\n";
}
print " local:\n *;\n};\n";
print "};\n";

114
mklove/Makefile.base Normal file
View File

@ -0,0 +1,114 @@
MKL_RED=\033[031m
MKL_GREEN=\033[032m
MKL_YELLOW=\033[033m
MKL_BLUE=\033[034m
MKL_CLR_RESET=\033[0m
DEPS= $(OBJS:%.o=%.d)
# TOPDIR is "TOPDIR/mklove/../" i.e., TOPDIR.
# We do it with two dir calls instead of /.. to support mklove being symlinked.
MKLOVE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
TOPDIR = $(MKLOVE_DIR:mklove/=.)
-include $(TOPDIR)/Makefile.config
INSTALL?= install
INSTALL_PROGRAM?= $(INSTALL)
INSTALL_DATA?= $(INSTALL) -m 644
prefix?= /usr/local
exec_prefix?= $(prefix)
bindir?= $(exec_prefix)/bin
sbindir?= $(exec_prefix)/sbin
libexecdir?= $(exec_prefix)/libexec/ # append PKGNAME on install
datarootdir?= $(prefix)/share
datadir?= $(datarootdir) # append PKGNAME on install
sysconfdir?= $(prefix)/etc
sharedstatedir?=$(prefix)/com
localestatedir?=$(prefix)/var
runstatedir?= $(localestatedir)/run
includedir?= $(prefix)/include
docdir?= $(datarootdir)/doc/$(PKGNAME)
infodir?= $(datarootdir)/info
libdir?= $(prefix)/lib
localedir?= $(datarootdir)/locale
mandir?= $(datarootdir)/man
man1dir?= $(mandir)/man1
man2dir?= $(mandir)/man2
man3dir?= $(mandir)/man3
man4dir?= $(mandir)/man4
man5dir?= $(mandir)/man5
man6dir?= $(mandir)/man6
man7dir?= $(mandir)/man7
man8dir?= $(mandir)/man8
# Checks that mklove is set up and ready for building
mklove-check:
@if [ ! -f "$(TOPDIR)/Makefile.config" ]; then \
echo "$(MKL_RED)$(TOPDIR)/Makefile.config missing: please run ./configure$(MKL_CLR_RESET)" ; \
exit 1 ; \
fi
%.o: %.c
$(CC) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $< -o $@
%.o: %.cpp
$(CXX) -MD -MP $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
lib: $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
$(LIBNAME).so.$(LIBVER): $(OBJS) $(LIBNAME).lds
@echo "$(MKL_YELLOW)Creating shared library $@$(MKL_CLR_RESET)"
$(CC) $(LDFLAGS) $(LIB_LDFLAGS) $(OBJS) -o $@ $(LIBS)
$(LIBNAME).a: $(OBJS)
@echo "$(MKL_YELLOW)Creating static library $@$(MKL_CLR_RESET)"
$(AR) rcs $@ $(OBJS)
file-check:
@(echo "$(MKL_YELLOW)Checking $(LIBNAME) integrity$(MKL_CLR_RESET)" ; \
RET=true ; \
for f in $(CHECK_FILES) ; do \
printf "%-30s " $$f ; \
if [ -f "$$f" ]; then \
echo "$(MKL_GREEN)OK$(MKL_CLR_RESET)"; \
else \
echo "$(MKL_RED)MISSING$(MKL_CLR_RESET)"; \
RET=false ; \
fi; \
done ; \
$$($$RET))
lib-install:
@echo "$(MKL_YELLOW)Install $(LIBNAME) to $$DESTDIR$(prefix)$(MKL_CLR_RESET)"
$(INSTALL) -d $$DESTDIR$(includedir)/$(PKGNAME) ; \
$(INSTALL) -d $$DESTDIR$(libdir) ; \
$(INSTALL) $(HDRS) $$DESTDIR$(includedir)/$(PKGNAME) ; \
$(INSTALL) $(LIBNAME).a $$DESTDIR/$(libdir) ; \
$(INSTALL) $(LIBNAME).so.$(LIBVER) $$DESTDIR/$(libdir) ; \
(cd $$DESTDIR/$(libdir) && ln -sf $(LIBNAME).so.$(LIBVER) $(LIBNAME).so)
lib-uninstall:
@echo "$(MKL_YELLOW)Uninstall $(LIBNAME) from $$DESTDIR$(prefix)$(MKL_CLR_RESET)"
for hdr in $(HDRS) ; do \
rm -f $$DESTDIR$(includedir)/$(PKGNAME)/$$hdr ; done
rm -f $$DESTDIR$(libdir)/$(LIBNAME).a
rm -f $$DESTDIR$(libdir)/$(LIBNAME).so.$(LIBVER)
rm -f $$DESTDIR$(libdir)/$(LIBNAME).so
rmdir $$DESTDIR$(includedir)/$(PKGNAME) || true
generic-clean:
rm -f $(OBJS) $(DEPS)
lib-clean: generic-clean
rm -f $(LIBNAME)*.a $(LIBNAME)*.so $(LIBNAME)*.so.$(LIBVER) \
$(LIBNAME).lds
bin-clean: generic-clean

View File

@ -0,0 +1,144 @@
#!/bin/bash
#
# Checks for atomic ops:
# compiler builtin (__sync_..) and portable libatomic's (__atomic_..)
# Will also provide abstraction by defining the prefix to use.
#
# Sets:
# HAVE_ATOMICS
# HAVE_ATOMICS_32
# HAVE_ATOMICS_64
# HAVE_ATOMICS_32_ATOMIC __atomic interface
# HAVE_ATOMICS_32_SYNC __sync interface
# HAVE_ATOMICS_64_ATOMIC __atomic interface
# HAVE_ATOMICS_64_SYNC __sync interface
# WITH_LIBATOMIC
# LIBS
#
# ATOMIC_OP(OP1,OP2,PTR,VAL)
# ATOMIC_OP32(OP1,OP2,PTR,VAL)
# ATOMIC_OP64(OP1,OP2,PTR,VAL)
# where op* is 'add,sub,fetch'
# e.g: ATOMIC_OP32(add, fetch, &i, 10)
# becomes __atomic_add_fetch(&i, 10, ..) or
# __sync_add_and_fetch(&i, 10)
#
function checks {
# We prefer the newer __atomic stuff, but 64-bit atomics might
# require linking with -latomic, so we need to perform these tests
# in the proper order:
# __atomic 32
# __atomic 32 -latomic
# __sync 32
#
# __atomic 64
# __atomic 64 -latomic
# __sync 64
local _libs=
local _a32="__atomic_ ## OP1 ## _ ## OP2(PTR, VAL, __ATOMIC_SEQ_CST)"
local _a64="__atomic_ ## OP1 ## _ ## OP2(PTR, VAL, __ATOMIC_SEQ_CST)"
# 32-bit:
# Try fully builtin __atomic
if ! mkl_compile_check __atomic_32 HAVE_ATOMICS_32 cont CC "" \
"
#include <inttypes.h>
int32_t foo (int32_t i) {
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
}"
then
# Try __atomic with -latomic
if mkl_compile_check __atomic_32_lib HAVE_ATOMICS_32 \
cont CC "-latomic" \
"
#include <inttypes.h>
int32_t foo (int32_t i) {
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
}"
then
_libs="-latomic"
mkl_allvar_set "__atomic_32_lib" "HAVE_ATOMICS_32_ATOMIC" "y"
else
# Try __sync interface
if mkl_compile_check __sync_32 HAVE_ATOMICS_32 disable CC "" \
"
#include <inttypes.h>
int32_t foo (int32_t i) {
return __sync_add_and_fetch(&i, 1);
}"
then
_a32="__sync_ ## OP1 ## _and_ ## OP2(PTR, VAL)"
mkl_allvar_set "__sync_32" "HAVE_ATOMICS_32_SYNC" "y"
else
_a32=""
fi
fi
else
mkl_allvar_set "__atomic_32" "HAVE_ATOMICS_32_ATOMIC" "y"
fi
if [[ ! -z $_a32 ]]; then
mkl_define_set "atomic_32" "ATOMIC_OP32(OP1,OP2,PTR,VAL)" "code:$_a32"
fi
# 64-bit:
# Try fully builtin __atomic
if ! mkl_compile_check __atomic_64 HAVE_ATOMICS_64 cont CC "" \
"
#include <inttypes.h>
int64_t foo (int64_t i) {
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
}"
then
# Try __atomic with -latomic
if mkl_compile_check __atomic_64_lib HAVE_ATOMICS_64 \
cont CC "-latomic" \
"
#include <inttypes.h>
int64_t foo (int64_t i) {
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
}"
then
_libs="-latomic"
mkl_allvar_set "__atomic_64_lib" "HAVE_ATOMICS_64_ATOMIC" "y"
else
# Try __sync interface
if mkl_compile_check __sync_64 HAVE_ATOMICS_64 disable CC "" \
"
#include <inttypes.h>
int64_t foo (int64_t i) {
return __sync_add_and_fetch(&i, 1);
}"
then
_a64="__sync_ ## OP1 ## _and_ ## OP2 (PTR, VAL)"
mkl_allvar_set "__sync_64" "HAVE_ATOMICS_64_SYNC" "y"
else
_a64=""
fi
fi
else
mkl_allvar_set "__atomic_64" "HAVE_ATOMICS_64_ATOMIC" "y"
fi
if [[ ! -z $_a64 ]]; then
mkl_define_set "atomic_64" "ATOMIC_OP64(OP1,OP2,PTR,VAL)" "code:$_a64"
# Define generic ATOMIC() macro identical to 64-bit atomics"
mkl_define_set "atomic_64" "ATOMIC_OP(OP1,OP2,PTR,VAL)" "code:$_a64"
fi
if [[ ! -z $_libs ]]; then
mkl_mkvar_append LDFLAGS LDFLAGS "-Wl,--as-needed"
mkl_mkvar_append LIBS LIBS "$_libs"
fi
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
#!/bin/bash
#
# mklove builtin checks and options
# Sets:
# prefix, etc..
mkl_option "Standard" prefix "--prefix=PATH" \
"Install arch-independent files in PATH" "/usr/local"
mkl_option "Standard" exec_prefix "--exec-prefix=PATH" \
"Install arch-dependent files in PATH" "\$prefix"
mkl_option "Standard" bindir "--bindir=PATH" "User executables" "\$exec_prefix/bin"
mkl_option "Standard" sbindir "--sbindir=PATH" "System admin executables" \
"\$exec_prefix/sbin"
mkl_option "Standard" libexecdir "--libexecdir=PATH" "Program executables" \
"\$exec_prefix/libexec"
mkl_option "Standard" datadir "--datadir=PATH" "Read-only arch-independent data" \
"\$prefix/share"
mkl_option "Standard" sysconfdir "--sysconfdir=PATH" "Configuration data" \
"\$prefix/etc"
mkl_option "Standard" sharedstatedir "--sharedstatedir=PATH" \
"Modifiable arch-independent data" "\$prefix/com"
mkl_option "Standard" localstatedir "--localstatedir=PATH" \
"Modifiable local state data" "\$prefix/var"
mkl_option "Standard" libdir "--libdir=PATH" "Libraries" "\$exec_prefix/lib"
mkl_option "Standard" includedir "--includedir=PATH" "C/C++ header files" \
"\$prefix/include"
mkl_option "Standard" infodir "--infodir=PATH" "Info documentation" "\$prefix/info"
mkl_option "Standard" mandir "--mandir=PATH" "Manual pages" "\$prefix/man"
mkl_option "Configure tool" "" "--list-modules" "List loaded mklove modules"
mkl_option "Configure tool" "" "--list-checks" "List checks"
mkl_option "Configure tool" env:MKL_FAILFATAL "--fail-fatal" "All failures are fatal"
mkl_option "Configure tool" env:MKL_NOCACHE "--no-cache" "Dont use or generate config.cache"
mkl_option "Configure tool" env:MKL_DEBUG "--debug" "Enable configure debugging"
mkl_option "Configure tool" env:MKL_CLEAN "--clean" "Remove generated configure files"
mkl_option "Configure tool" "" "--reconfigure" "Rerun configure with same arguments as last run"
mkl_option "Configure tool" env:MKL_NO_DOWNLOAD "--no-download" "Disable downloads of required mklove modules"
mkl_option "Configure tool" env:MKL_UPDATE_MODS "--update-modules" "Update modules from global repository"
mkl_option "Configure tool" env:MKL_MODULES_REPO_URL "--repo-url=URL_OR_PATH" "Override mklove modules repo URL" "$MKL_MODULES_REPO_URL"
mkl_option "Configure tool" "" "--help" "Show configure usage"
mkl_toggle_option "Compatibility" "mk:MKL_MAINT_MODE" "--enable-maintainer-mode" "Maintainer mode (no-op)"
mkl_option "Configure tool" "mk:PROGRAM_PREFIX" "--program-prefix=PFX" "Program prefix"
mkl_option "Compatibility" "mk:DISABL_DEP_TRACK" "--disable-dependency-tracking" "Disable dependency tracking (no-op)"

109
mklove/modules/configure.cc Normal file
View File

@ -0,0 +1,109 @@
#!/bin/bash
#
# Compiler detection
# Sets:
# CC, CXX, CFLAGS, CPPFLAGS, LDFLAGS, PKG_CONFIG, instALL
mkl_require host
function checks {
# C compiler
mkl_meta_set "ccenv" "name" "C compiler from CC env"
if ! mkl_command_check "ccenv" "WITH_CC" cont "$CC --version"; then
if mkl_command_check "gcc" "WITH_GCC" cont "gcc --version"; then
CC=gcc
elif mkl_command_check "clang" "WITH_CLANG" cont "clang --version"; then
CC=clang
elif mkl_command_check "cc" "WITH_CC" fail "cc --version"; then
CC=cc
fi
fi
export CC="${CC}"
mkl_mkvar_set CC CC "$CC"
# C++ compiler
mkl_meta_set "cxxenv" "name" "C++ compiler from CXX env"
if ! mkl_command_check "cxxenv" "WITH_CXX" cont "$CXX --version" ; then
mkl_meta_set "gxx" "name" "C++ compiler (g++)"
mkl_meta_set "clangxx" "name" "C++ compiler (clang++)"
mkl_meta_set "cxx" "name" "C++ compiler (c++)"
if mkl_command_check "gxx" "WITH_GXX" cont "g++ --version"; then
CXX=g++
elif mkl_command_check "clangxx" "WITH_CLANGXX" cont "clang++ --version"; then
CXX=clang++
elif mkl_command_check "cxx" "WITH_CXX" fail "c++ --version"; then
CXX=c++
fi
fi
export CXX="${CXX}"
mkl_mkvar_set "CXX" CXX $CXX
# Provide prefix and checks for various other build tools.
local t=
for t in LD:ld NM:nm OBJDUMP:objdump STRIP:strip ; do
local tenv=${t%:*}
t=${t#*:}
[[ -z ${!tenv} ]] && mkl_env_set "$tenv" "$t"
if mkl_command_check "$t" "" fail "${!tenv} --version" ; then
export "$tenv"="${!tenv}"
mkl_mkvar_set $tenv $tenv "${!tenv}"
fi
done
# Compiler and linker flags
[[ ! -z $CFLAGS ]] && mkl_mkvar_append "CFLAGS" "CFLAGS" $CFLAGS
[[ ! -z $CPPFLAGS ]] && mkl_mkvar_append "CPPFLAGS" "CPPFLAGS" $CPPFLAGS
[[ ! -z $CXXFLAGS ]] && mkl_mkvar_append "CFLAGS" "CXXFLAGS" $CXXFLAGS
[[ ! -z $LDFLAGS ]] && mkl_mkvar_append "CFLAGS" "LDFLAGS" $LDFLAGS
mkl_mkvar_append CPPFLAGS CPPFLAGS "-g"
# pkg-config
if [ -z "$PKG_CONFIG" ]; then
PKG_CONFIG=pkg-config
fi
if mkl_command_check "pkgconfig" "WITH_PKGCONFIG" cont "$PKG_CONFIG --version"; then
export PKG_CONFIG
fi
mkl_mkvar_set "pkgconfig" PKG_CONFIG $PKG_CONFIG
[[ ! -z "$PKG_CONFIG_PATH" ]] && mkl_env_append PKG_CONFIG_PATH "$PKG_CONFIG_PATH"
# install
if [ -z "$INSTALL" ]; then
INSTALL=install
fi
if mkl_command_check "install" "WITH_INSTALL" cont "$INSTALL --version"; then
export INSTALL
fi
mkl_mkvar_set "install" INSTALL $INSTALL
}
mkl_option "Compiler" "env:CC" "--cc=CC" "Build using C compiler CC" "\$CC"
mkl_option "Compiler" "env:CXX" "--cxx=CXX" "Build using C++ compiler CXX" "\$CXX"
mkl_option "Compiler" "ARCH" "--arch=ARCH" "Build for architecture" "$(uname -m)"
mkl_option "Compiler" "CPU" "--cpu=CPU" "Build and optimize for specific CPU" "generic"
for n in CFLAGS CPPFLAGS CXXFLAGS LDFLAGS; do
mkl_option "Compiler" "mk:$n" "--$n=$n" "Add $n flags"
done
mkl_option "Compiler" "env:PKG_CONFIG_PATH" "--pkg-config-path" "Extra paths for pkg-config"
mkl_option "Compiler" "WITH_PROFILING" "--enable-profiling" "Enable profiling"
function opt_enable-profiling {
if [[ $2 == "y" ]]; then
mkl_allvar_set "" "WITH_PROFILING" "y"
mkl_mkvar_append CPPFLAGS CPPFLAGS "-pg"
mkl_mkvar_append LDFLAGS LDFLAGS "-pg"
fi
}

View File

@ -0,0 +1,65 @@
#!/bin/bash
#
# Reads version from file and sets variables accordingly
# The first non-commented line in the file is expected to be the version string.
# Arguments:
# filename
# STR_VERSION_VARIABLE_NAME
# [ HEX_VERSION_VARIABLE_NAME ]
#
# Example: Set string version in variable named "MYVERSION_STR" and
# the hex representation in "MYVERSION"
# mkl_require VERSION.txt MYVERSION_STR MYVERSION
if [[ -z "$2" ]]; then
mkl_fail "fileversion" "none" "fail" "Missing argument(s), expected: FILENAME STR_VER HEX_VER"
return 0
fi
fileversion_file="$1"
fileversion_strvar="$2"
fileversion_hexvar="$3"
function checks {
mkl_check_begin "fileversion" "" "no-cache" "version from file $fileversion_file"
if [[ ! -s $fileversion_file ]]; then
mkl_check_failed "fileversion" "" "fail" \
"Version file $fileversion_file is not readable"
return 1
fi
local orig=$(grep -v ^\# "$fileversion_file" | grep -v '^$' | head -1)
# Strip v prefix if any
orig=${orig#v}
# Try to decode version string into hex
# Supported format is "[v]NN.NN.NN[.NN]"
if [[ ! -z $fileversion_hexvar ]]; then
local hex=""
local s=${orig#v} # Strip v prefix, if any.
local ncnt=0
local n=
for n in ${s//./ } ; do
if [[ ! ( "$n" =~ ^[0-9][0-9]?$ ) ]]; then
mkl_check_failed "fileversion" "" "fail" \
"$fileversion_file: Could not decode '$orig' into hex version, expecting format 'NN.NN.NN[.NN]'"
return 1
fi
hex="$hex$(printf %02x $n)"
ncnt=$(expr $ncnt + 1)
done
if [[ ! -z $hex ]]; then
# Finish all four bytess
for n in {$ncnt..4} ; do
hex="$hex$(printf %02x 0)"
done
mkl_allvar_set "fileversion" "$fileversion_hexvar" "0x$hex"
fi
fi
mkl_allvar_set "fileversion" "$fileversion_strvar" "$orig"
mkl_check_done "fileversion" "" "cont" "ok" "${!fileversion_strvar}"
}

View File

@ -0,0 +1,57 @@
#!/bin/bash
#
# Generates pkg-config file for library.
#
# Arguments:
# libname (e.g., "rdkafka" for librdkafka)
# name (e.g., "The Apache Kafka C/C++ library")
# description (e.g., "A full producer and consumer for Apache Kafka 0.8...")
# version (e.g., "1.2.3" or "$VERSION" or "\$VERSION" (for late reference)
if [[ -z "$4" ]]; then
mkl_fail "pkg_config_gen" "none" "fail" \
"Missing arguments to module: syntax: libname name description version"
else
mkl_var_set "MKL__PKG_CONFIG_libname" "$1"
mkl_var_set "MKL__PKG_CONFIG_name" "$2"
mkl_var_set "MKL__PKG_CONFIG_desc" "$3"
mkl_var_set "MKL__PKG_CONFIG_version" "$4"
fi
# Add line to generated pkg-config file.
# Arguments:
# line
function mkl_pkg-config_append {
printf -v "MKL__PKG_CONFIG_extra" "%s%s" "${MKL__PKG_CONFIG_extra}" "$1
"
}
# Generate .pc file
function generate {
local fname="$(mkl_var_get MKL__PKG_CONFIG_libname).pc"
# Evaluate late reference variables in version
local ver=$(eval echo ${MKL__PKG_CONFIG_version})
echo > $fname \
"prefix=$prefix
libdir=$libdir
includedir=$includedir
Name: ${MKL__PKG_CONFIG_name}
Description: ${MKL__PKG_CONFIG_desc}
Version: $ver
Cflags: -I\${includedir}
Libs: -L\${libdir} -l${MKL__PKG_CONFIG_libname}
${MKL__PKG_CONFIG_extra}"
echo "Generated $fname"
}
# Cleanup .pc file
function clean {
local fname="$(mkl_var_get MKL__PKG_CONFIG_libname).pc"
mkl_rm "$fname"
}

View File

@ -0,0 +1,19 @@
#!/bin/bash
#
# Sets version variable from git information.
# Optional arguments:
# "as"
# VARIABLE_NAME
#
# Example: Set version in variable named "MYVERSION":
# mkl_require gitversion as MYVERSION
if [[ $1 == "as" ]]; then
__MKL_GITVERSION_VARNAME="$2"
else
__MKL_GITVERSION_VARNAME="VERSION"
fi
function checks {
mkl_allvar_set "gitversion" "$__MKL_GITVERSION_VARNAME" "$(git describe --abbrev=6 --tags HEAD --always)"
}

View File

@ -0,0 +1,14 @@
#!/bin/bash
#
# Provides some known-good CFLAGS
# Sets:
# CFLAGS
# CXXFLAGS
# CPPFLAGS
function checks {
mkl_mkvar_append CPPFLAGS CPPFLAGS \
"-O2 -Wall -Werror -Wfloat-equal -Wpointer-arith"
mkl_mkvar_append LDFLAGS LDFLAGS "-g"
}

View File

@ -0,0 +1,70 @@
#!/bin/bash
#
# Host OS support
# Sets:
# HOST
# BUILD
# TARGET
# FIXME: No need for this right now
#mkl_require host_linux
#mkl_require host_osx
#mkl_require host_cygwin
#mkl_option "Cross-compilation" "mk:HOST_OS" "--host-os=osname" "Host OS (linux,osx,cygwin,..)" "auto"
# autoconf compatibility - does nothing at this point
mkl_option "Cross-compilation" "mk:HOST" "--host=HOST" "Configure to build programs to run on HOST (no-op)"
mkl_option "Cross-compilation" "mk:BUILD" "--build=BUILD" "Configure for building on BUILD (no-op)"
mkl_option "Cross-compilation" "mk:TARGET" "--target=TARGET" "Configure for building cross-toolkits for platform TARGET (no-op)"
#function checks {
# mkl_check_begin "host" "HOST_OS" "no-cache" "host OS"
#
# #
# # If --host-os=.. was not specified then this is most likely not a
# # a cross-compilation and we can base the host-os on the native OS.
# #
# if [[ $HOST_OS != "auto" ]]; then
# mkl_check_done "host" "HOST_OS" "cont" "ok" "$HOST_OS"
# return 0
# fi
#
# kn=$(uname -s)
# case $kn in
# Linux)
# hostos=linux
# ;;
# Darwin)
# hostos=osx
# ;;
# CYGWIN*)
# hostos=cygwin
# ;;
# *)
# hostos="$(mkl_lower $kn)"
# mkl_err "Unknown host OS kernel name: $kn"
# mkl_err0 " Will attempt to load module host_$hostos anyway."
# mkl_err0 " Please consider writing a configure.host_$hostos"
# ;;
# esac
#
# if ! mkl_require --try "host_$hostos"; then
# # Module not found
# mkl_check_done "host" "HOST_OS" "cont" "failed" "$kn?"
# else
# # Module loaded
#
# if mkl_func_exists "host_${hostos}_setup" ; then
# "host_${hostos}_setup"
# fi
#
# mkl_check_done "host" "HOST_OS" "cont" "ok" "$hostos"
# fi
#
# # Set HOST_OS var even if probing failed.
# mkl_mkvar_set "host" "HOST_OS" "$hostos"
#}

View File

@ -0,0 +1,26 @@
#!/bin/bash
#
# Module for building shared libraries
mkl_require pic
function checks {
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-shared'
# Check what arguments to pass to CC or LD for shared libraries
mkl_meta_set gnulib name "GNU-compatible linker options"
mkl_meta_set osxlib name "OSX linker options"
if mkl_compile_check gnulib WITH_GNULD cont CC \
"-shared -Wl,-soname,mkltest.0" "" ; then
# GNU linker
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-Wl,-soname,$(LIBNAME).so.$(LIBVER)'
elif mkl_compile_check osxlib WITH_OSXLD cont CC \
"-dynamiclib -Wl,-install_name,/tmp/mkltest.so.0" ; then
# OSX linker
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-dynamiclib -Wl,-install_name,$(DESTDIR)$(libdir)/$(LIBNAME).so.$(LIBVER)'
fi
}

View File

@ -0,0 +1,93 @@
#!/bin/bash
#
# Parses the provided version string and creates variables accordingly.
# [ "hex2str" <fmt> ] -- version-string is in hex (e.g., 0x00080300)
# version-string
# STR_VERSION_VARIABLE_NAME
# [ HEX_VERSION_VARIABLE_NAME ]
#
# Example: Set string version in variable named "MYVERSION_STR" and
# the hex representation in "MYVERSION"
# mkl_require parseversion "$(head -1 VERSION.txt)" MYVERSION_STR MYVERSION
if [[ $1 == "hex2str" ]]; then
parseversion_type="hex"
parseversion_fmt="${2}:END:%d%d%d%d"
shift
shift
else
parseversion_type=""
parseversion_fmt="%d.%d.%d.%d"
fi
if [[ -z "$2" ]]; then
mkl_fail "parseversion" "none" "fail" "Missing argument(s)"
return 0
fi
parseversion_orig="$1"
parseversion_strvar="$2"
parseversion_hexvar="$3"
function checks {
mkl_check_begin --verb "parsing" "parseversion" "" "no-cache" \
"version '$parseversion_orig'"
# Strip v prefix if any
orig=${parseversion_orig#v}
if [[ $orig == 0x* ]]; then
parseversion_type="hex"
orig=${orig#0x}
fi
if [[ -z $orig ]]; then
mkl_check_failed "parseversion" "" "fail" "Version string is empty"
return 1
fi
# If orig is in hex we construct a string format instead.
if [[ $parseversion_type == "hex" ]]; then
local s=$orig
local str=""
local vals=""
while [[ ! -z $s ]]; do
local n=${s:0:2}
s=${s:${#n}}
vals="${vals}$(printf %d 0x$n) "
done
str=$(printf "$parseversion_fmt" $vals)
orig=${str%:END:*}
fi
# Try to decode version string into hex
# Supported format is "[v]NN.NN.NN[.NN]"
if [[ ! -z $parseversion_hexvar ]]; then
local hex=""
local s=$orig
local ncnt=0
local n=
for n in ${s//./ } ; do
if [[ ! ( "$n" =~ ^[0-9][0-9]?$ ) ]]; then
mkl_check_failed "parseversion" "" "fail" \
"Could not decode '$parseversion_orig' into hex version, expecting format 'NN.NN.NN[.NN]'"
return 1
fi
hex="$hex$(printf %02x $n)"
ncnt=$(expr $ncnt + 1)
done
if [[ ! -z $hex ]]; then
# Finish all four bytess
while [[ ${#hex} -lt 8 ]]; do
hex="$hex$(printf %02x 0)"
done
mkl_allvar_set "parseversion" "$parseversion_hexvar" "0x$hex"
fi
fi
mkl_allvar_set "parseversion" "$parseversion_strvar" "$orig"
mkl_check_done "parseversion" "" "cont" "ok" "${!parseversion_strvar}"
}

View File

@ -0,0 +1,16 @@
#!/bin/bash
#
# Checks if -fPIC is supported, and if so turns it on.
#
# Sets:
# HAVE_PIC
# CPPFLAGS
#
function checks {
if mkl_compile_check PIC HAVE_PIC disable CC "-fPIC" "" ; then
mkl_mkvar_append CPPFLAGS CPPFLAGS "-fPIC"
fi
}

31
src-cpp/Makefile Normal file
View File

@ -0,0 +1,31 @@
PKGNAME= librdkafka
LIBNAME= librdkafka++
LIBVER= 1
CXXSRCS= RdKafka.cpp ConfImpl.cpp HandleImpl.cpp \
ConsumerImpl.cpp ProducerImpl.cpp \
TopicImpl.cpp MessageImpl.cpp
HDRS= rdkafkacpp.h
OBJS= $(CXXSRCS:%.cpp=%.o)
all: lib check
include ../mklove/Makefile.base
CHECK_FILES+= $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
check: file-check
install: lib-install
clean: lib-clean
$(LIBNAME).lds: $(HDRS)
@(echo "$(MKL_YELLOW)Generating linker script $@ from $(HDRS)$(MKL_CLR_RESET)" ; \
cat $(HDRS) | ../lds-gen.pl > $@)
-include $(DEPS)

View File

@ -35,7 +35,7 @@
#include "rdkafkacpp.h"
extern "C" {
#include "../rdkafka.h"
#include "../src/rdkafka.h"
};
namespace RdKafka {

38
src/Makefile Executable file
View File

@ -0,0 +1,38 @@
PKGNAME= librdkafka
LIBNAME= librdkafka
LIBVER= 1
SRCS= rdkafka.c rdkafka_broker.c rdkafka_msg.c rdkafka_topic.c \
rdkafka_defaultconf.c rdkafka_timer.c rdkafka_offset.c \
rdcrc32.c rdgz.c rdaddr.c rdrand.c rdthread.c rdqueue.c \
rdlog.c \
snappy.c
HDRS= rdkafka.h
OBJS= $(SRCS:.c=.o)
all: lib check
include ../mklove/Makefile.base
CHECK_FILES+= $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
check: file-check
@(printf "%-30s " "Symbol visibility" ; \
((nm -D librdkafka.so.1 | grep -q rd_kafka_new) && \
(nm -D librdkafka.so.1 | grep -vq rd_kafka_destroy) && \
echo "\033[32mOK\033[0m") || \
echo "\033[31mFAILED\033[0m")
install: lib-install
clean: lib-clean
$(LIBNAME).lds: $(HDRS)
@(echo "$(MKL_YELLOW)Generating linker script $@ from $(HDRS)$(MKL_CLR_RESET)" ; \
cat $(HDRS) | ../lds-gen.pl > $@)
-include $(DEPS)

View File

View File

@ -41,6 +41,8 @@
#include <assert.h>
#include <pthread.h>
#include "../config.h"
#include "rdtypes.h"
@ -83,13 +85,12 @@
((val) < (low) ? low : ((val) > (hi) ? (hi) : (val)))
#define rd_atomic_add(PTR,VAL) __sync_add_and_fetch(PTR,VAL)
#define rd_atomic_sub(PTR,VAL) __sync_sub_and_fetch(PTR,VAL)
#define rd_atomic_add(PTR,VAL) ATOMIC_OP(add,fetch,PTR,VAL)
#define rd_atomic_sub(PTR,VAL) ATOMIC_OP(sub,fetch,PTR,VAL)
#define rd_atomic_add_prev(PTR,VAL) __sync_fetch_and_add(PTR,VAL)
#define rd_atomic_sub_prev(PTR,VAL) __sync_fetch_and_sub(PTR,VAL)
#define rd_atomic_add_prev(PTR,VAL) ATOMIC_OP(fetch,add,PTR,VAL)
#define rd_atomic_sub_prev(PTR,VAL) ATOMIC_OP(fetch,sub,PTR,VAL)
#define rd_atomic_set(PTR,VAL) __sync_lock_test_and_set(PTR,VAL)
#ifndef be64toh

View File

View File

View File

@ -235,7 +235,7 @@ void rd_kafka_q_purge (rd_kafka_q_t *rkq) {
}
TAILQ_INIT(&rkq->rkq_q);
(void)rd_atomic_set(&rkq->rkq_qlen, 0);
rkq->rkq_qlen = 0;
pthread_mutex_unlock(&rkq->rkq_lock);
}
@ -259,7 +259,7 @@ size_t rd_kafka_q_move_cnt (rd_kafka_q_t *dstq, rd_kafka_q_t *srcq,
mcnt = srcq->rkq_qlen;
TAILQ_CONCAT(&dstq->rkq_q, &srcq->rkq_q, rko_link);
TAILQ_INIT(&srcq->rkq_q);
(void)rd_atomic_set(&srcq->rkq_qlen, 0);
srcq->rkq_qlen = 0;
(void)rd_atomic_add(&dstq->rkq_qlen, mcnt);
} else {
while (mcnt < cnt && (rko = TAILQ_FIRST(&srcq->rkq_q))) {
@ -365,7 +365,7 @@ int rd_kafka_q_serve (rd_kafka_t *rk,
/* Reset real queue */
TAILQ_INIT(&rkq->rkq_q);
(void)rd_atomic_set(&rkq->rkq_qlen, 0);
rkq->rkq_qlen = 0;
pthread_mutex_unlock(&rkq->rkq_lock);
rd_kafka_dbg(rk, QUEUE, "QSERVE", "Serving %i ops", localq.rkq_qlen);
@ -580,7 +580,7 @@ void rd_kafka_destroy0 (rd_kafka_t *rk) {
free(rk);
rd_atomic_sub(&rd_kafka_handle_cnt_curr, 1);
(void)rd_atomic_sub(&rd_kafka_handle_cnt_curr, 1);
}
@ -940,7 +940,7 @@ rd_kafka_t *rd_kafka_new (rd_kafka_type_t type, rd_kafka_conf_t *conf,
if (rk->rk_conf.brokerlist)
rd_kafka_brokers_add(rk, rk->rk_conf.brokerlist);
rd_atomic_add(&rd_kafka_handle_cnt_curr, 1);
(void)rd_atomic_add(&rd_kafka_handle_cnt_curr, 1);
return rk;
}

View File

@ -123,7 +123,7 @@ static void rd_kafka_broker_set_state (rd_kafka_broker_t *rkb,
rkb->rkb_rk->rk_broker_down_cnt,
rkb->rkb_rk->rk_broker_cnt);
} else if (rkb->rkb_state == RD_KAFKA_BROKER_STATE_DOWN)
rd_atomic_sub(&rkb->rkb_rk->rk_broker_down_cnt, 1);
(void)rd_atomic_sub(&rkb->rkb_rk->rk_broker_down_cnt, 1);
rkb->rkb_state = state;
}
@ -1300,7 +1300,11 @@ err:
*/
int rd_kafka_socket_cb_linux (int domain, int type, int protocol,
void *opaque) {
#ifdef SOCK_CLOEXEC
return socket(domain, type | SOCK_CLOEXEC, protocol);
#else
return rd_kafka_socket_cb_generic(domain, type, protocol, opaque);
#endif
}
/**
@ -1311,7 +1315,7 @@ int rd_kafka_socket_cb_generic (int domain, int type, int protocol,
void *opaque) {
int s;
int on = 1;
s = socket(domain, type | SOCK_CLOEXEC, protocol);
s = socket(domain, type, protocol);
if (s == -1)
return -1;
#ifdef FD_CLOEXEC
@ -3305,7 +3309,7 @@ static void *rd_kafka_broker_thread_main (void *arg) {
rd_kafka_lock(rkb->rkb_rk);
TAILQ_REMOVE(&rkb->rkb_rk->rk_brokers, rkb, rkb_link);
rd_atomic_sub(&rkb->rkb_rk->rk_broker_cnt, 1);
(void)rd_atomic_sub(&rkb->rkb_rk->rk_broker_cnt, 1);
rd_kafka_unlock(rkb->rkb_rk);
rd_kafka_broker_fail(rkb, RD_KAFKA_RESP_ERR__DESTROY, NULL);
rd_kafka_broker_destroy(rkb);
@ -3424,7 +3428,7 @@ static rd_kafka_broker_t *rd_kafka_broker_add (rd_kafka_t *rk,
}
TAILQ_INSERT_TAIL(&rkb->rkb_rk->rk_brokers, rkb, rkb_link);
rd_atomic_add(&rkb->rkb_rk->rk_broker_cnt, 1);
(void)rd_atomic_add(&rkb->rkb_rk->rk_broker_cnt, 1);
rd_rkb_dbg(rkb, BROKER, "BROKER",
"Added new broker with NodeId %"PRId32,

View File

@ -72,7 +72,11 @@ static void rd_kafka_offset_file_close (rd_kafka_toppar_t *rktp) {
*/
int rd_kafka_open_cb_linux (const char *pathname, int flags, mode_t mode,
void *opaque) {
#ifdef O_CLOEXEC
return open(pathname, flags|O_CLOEXEC, mode);
#else
return rd_kafka_open_cb_generic(pathname, flags, mode, opaque);
#endif
}
/**

View File

@ -1,33 +1,23 @@
TESTSRCS ?= $(wildcard 0*-*.c)
TESTS ?= $(TESTSRCS:%.c=%.test)
CC ?= cc
CXX ?= g++
CFLAGS += -g -Wall -Werror -Wfloat-equal -Wpointer-arith -O2 -I../
CXXFLAGS += $(CFLAGS)
LDFLAGS += -L../ -lrdkafka
LDFLAGS += -lpthread -lz
ifeq ($(shell uname -s), Linux)
LDFLAGS += -lrt
endif
# Profiling
#CFLAGS += -O0 -pg
#LDFLAGS += -pg
%.test: ../librdkafka.a test.o %.c
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.test: ../src/librdkafka.a test.o %.c
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) -lrdkafka $(LIBS)
all: $(TESTS)
for i in $^ ; do \
LD_LIBRARY_PATH=../ ./run-test.sh $$i || exit 1 ; \
LD_LIBRARY_PATH=../src ./run-test.sh $$i || exit 1 ; \
done
include ../mklove/Makefile.base
CFLAGS += -I../src
LDFLAGS += -L../src
test.o: test.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f *.test
rm -f *.test test.o