From 9f0009faeaa0960f57fcacea91b45997258016e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 1 Sep 2015 14:32:27 +0000 Subject: synch more with git svn path=/trunk/externals/iem/iemnet/; revision=17546 --- build/autotests/Makefile.am | 23 +++ build/autotests/README.txt | 8 + build/autotests/configure.ac | 23 +++ build/autotests/m4/ax_pthread.m4 | 288 ++++++++++++++++++++++++++++++++++ build/autotests/tests/Makefile.am | 30 ++++ build/autotests/tests/common.h | 54 +++++++ build/autotests/tests/fail.c | 5 + build/autotests/tests/pass.c | 7 + build/autotests/tests/runtest.sh | 43 +++++ build/autotests/tests/serialqueue.c | 58 +++++++ build/autotests/tests/skip.c | 5 + build/autotests/tests/threadedqueue.c | 77 +++++++++ build/coverity/coverity_model.c | 21 +++ 13 files changed, 642 insertions(+) create mode 100644 build/autotests/Makefile.am create mode 100644 build/autotests/README.txt create mode 100644 build/autotests/configure.ac create mode 100644 build/autotests/m4/ax_pthread.m4 create mode 100644 build/autotests/tests/Makefile.am create mode 100644 build/autotests/tests/common.h create mode 100644 build/autotests/tests/fail.c create mode 100644 build/autotests/tests/pass.c create mode 100755 build/autotests/tests/runtest.sh create mode 100644 build/autotests/tests/serialqueue.c create mode 100644 build/autotests/tests/skip.c create mode 100644 build/autotests/tests/threadedqueue.c create mode 100644 build/coverity/coverity_model.c (limited to 'build') diff --git a/build/autotests/Makefile.am b/build/autotests/Makefile.am new file mode 100644 index 0000000..d5ca046 --- /dev/null +++ b/build/autotests/Makefile.am @@ -0,0 +1,23 @@ +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS=tests + +AM_CPPFLAGS = -I$(top_srcdir) + +lib_LTLIBRARIES = libiemnet.la + +libiemnet_la_LDFLAGS = -version-info 1 -no-undefined +libiemnet_la_CFLAGS = +#libiemnet_la_CFLAGS += -fvisibility=hidden +libiemnet_la_LIBADD = $(LIBM) + +libiemnet_la_SOURCES = \ + $(top_srcdir)/../../iemnet.c \ + $(top_srcdir)/../../iemnet_data.c \ + $(top_srcdir)/../../iemnet_receiver.c \ + $(top_srcdir)/../../iemnet_sender.c \ + $(top_srcdir)/../../iemnet_notify.c \ + $(top_srcdir)/../../iemnet_data.h \ + $(top_srcdir)/../../iemnet.h + diff --git a/build/autotests/README.txt b/build/autotests/README.txt new file mode 100644 index 0000000..de17fb1 --- /dev/null +++ b/build/autotests/README.txt @@ -0,0 +1,8 @@ +autotools for iemnet +==================== + +currently, iemnet does NOT require autotools to build. + +what you find in here is mainly to run some automated tests, so the only useful +build-target is: +$ make check diff --git a/build/autotests/configure.ac b/build/autotests/configure.ac new file mode 100644 index 0000000..fdf381f --- /dev/null +++ b/build/autotests/configure.ac @@ -0,0 +1,23 @@ +AC_INIT([iemnet],[0.0.1],[zmoelnig@iem.at], + [iemnet],[http://ambisonics.iem.at/xchange/format]) +AM_INIT_AUTOMAKE + +AM_PROG_LIBTOOL + +AC_CONFIG_SRCDIR([../../iemnet.h]) + +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_FILES([Makefile tests/Makefile]) + +AC_PROG_INSTALL + +AC_LANG_C +AC_PROG_CC +AC_PROG_MAKE_SET +AC_HEADER_STDC + +/* check for math */ +AC_CHECK_LIB([m],[sqrt]) +AX_PTHREAD + +AC_OUTPUT diff --git a/build/autotests/m4/ax_pthread.m4 b/build/autotests/m4/ax_pthread.m4 new file mode 100644 index 0000000..eafd76a --- /dev/null +++ b/build/autotests/m4/ax_pthread.m4 @@ -0,0 +1,288 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREADS. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with +CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads +-mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + *-darwin*) + acx_pthread_flags="-pthread $acx_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config +--libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include + static void routine(void* a) {a=0;} + static void* start_routine(void* a) {return a;}], + [pthread_t th; pthread_attr_t attr; + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_create(&th,0,start_routine,0); + pthread_cleanup_pop(0); ], + [ax_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREADS,1,[Define if you have POSIX threads +libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl AX_PTHREAD + diff --git a/build/autotests/tests/Makefile.am b/build/autotests/tests/Makefile.am new file mode 100644 index 0000000..1a5f7f7 --- /dev/null +++ b/build/autotests/tests/Makefile.am @@ -0,0 +1,30 @@ +AUTOMAKE_OPTIONS = foreign +AM_LDFLAGS= -module -avoid-version -shared -shrext .pd_linux + +TEST_EXTENSIONS = .la +LA_LOG_COMPILER = $(srcdir)/runtest.sh + +AM_CPPFLAGS=-I$(top_srcdir)/../.. +AM_LDFLAGS+=$(top_builddir)/libiemnet.la -rpath /tmp + +SOURCES=common.h +noinst_HEADERS=common.h +EXTRA_DIST=runtest.sh + +TESTS = \ + pass.la skip.la fail.la \ + serialqueue.la threadedqueue.la + +XFAIL_TESTS = fail.la + +check_LTLIBRARIES= \ + pass.la skip.la fail.la \ + serialqueue.la threadedqueue.la + +pass_la_SOURCES=pass.c +skip_la_SOURCES=skip.c +fail_la_SOURCES=fail.c + +threadedqueue_la_SOURCES=threadedqueue.c +serialqueue_la_SOURCES=serialqueue.c + diff --git a/build/autotests/tests/common.h b/build/autotests/tests/common.h new file mode 100644 index 0000000..abef2c8 --- /dev/null +++ b/build/autotests/tests/common.h @@ -0,0 +1,54 @@ +#ifndef TESTS_COMMON_H +#define TESTS_COMMON_H + +#include "iemnet.h" + +#include +static inline void pass(void) {exit(0); } +static inline void fail(void) {exit(1); } +static inline void skip(void) {exit(77); } + +#include +#include +static inline void pass_if (int test, int line, const char *format, ...) +{ + if (test) { + va_list argptr ; + printf("@%d: ", line); + va_start (argptr, format) ; + vprintf (format, argptr) ; + va_end (argptr) ; + printf("\n"); + pass(); + } ; +} /* pass_if */ +static inline void skip_if (int test, int line, const char *format, ...) +{ + if (test) { + va_list argptr ; + printf("@%d: ", line); + va_start (argptr, format) ; + vprintf (format, argptr) ; + va_end (argptr) ; + printf("\n"); + skip(); + } ; +} /* skip_if */ +static inline void fail_if (int test, int line, const char *format, ...) +{ + if (test) { + va_list argptr ; + printf("@%d: ", line); + va_start (argptr, format) ; + vprintf (format, argptr) ; + va_end (argptr) ; + printf("\n"); + fail(); + } ; +} /* fail_if */ + +#define STRINGIFY(x) #x +#define STARTTEST(x) printf("============ %s[%04d]:\t%s '%s'\n", __FILE__, __LINE__, __FUNCTION__, x) + +#endif /* TESTS_COMMON_H */ + diff --git a/build/autotests/tests/fail.c b/build/autotests/tests/fail.c new file mode 100644 index 0000000..a2cb791 --- /dev/null +++ b/build/autotests/tests/fail.c @@ -0,0 +1,5 @@ +#include "common.h" + +void fail_setup() { + fail(); +} diff --git a/build/autotests/tests/pass.c b/build/autotests/tests/pass.c new file mode 100644 index 0000000..153e735 --- /dev/null +++ b/build/autotests/tests/pass.c @@ -0,0 +1,7 @@ +#include "common.h" + + +void pass_setup(void) { + pass(); +} + diff --git a/build/autotests/tests/runtest.sh b/build/autotests/tests/runtest.sh new file mode 100755 index 0000000..396d793 --- /dev/null +++ b/build/autotests/tests/runtest.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +EXTERNAL=$1 +EXTERNAL=${EXTERNAL%.la} +EXTERNAL=${EXTERNAL#./} + +TESTTYPE=$2 + + +################################## + +PD=pd +PDARGS="-nrt -nogui -path .libs" +PDARGS="-noprefs -nostdpath -nosound -nrt -nogui -path .libs" +#PDARGS="-nostdpath -nosound -nrt -nogui -path .libs" +#VALGRIND=valgrind +VALGRIND="valgrind --error-exitcode=1" + +do_runtest() { +case "$1" in + mem*|MEM*) + ${VALGRIND} ${PD} ${PDARGS} -lib ${EXTERNAL} + ;; + DRD|drd) + ${VALGRIND} --tool=drd ${PD} ${PDARGS} -lib ${EXTERNAL} + ;; + HEL*|hel*) + ${VALGRIND} --tool=helgrind ${PD} ${PDARGS} -lib ${EXTERNAL} + ;; + *) + ${PD} ${PDARGS} -lib ${EXTERNAL} + ;; +esac +} + + +#do_runtest +#do_runtest MEM +#do_runtest DRD +#do_runtest HEL +#do_runtest && do_runtest MEM && do_runtest DRD + +do_runtest $TESTTYPE diff --git a/build/autotests/tests/serialqueue.c b/build/autotests/tests/serialqueue.c new file mode 100644 index 0000000..238be41 --- /dev/null +++ b/build/autotests/tests/serialqueue.c @@ -0,0 +1,58 @@ +#include + +#include + +#define NUMCHUNKS 1000 + + +typedef union { + unsigned char cp; + int count; +} data_t; +static int producer(t_iemnet_queue*q, unsigned int count, unsigned int msec) { + unsigned int i; + data_t data; + for(i=0; isize) { + error("size mismatch %d!=%d", sizeof(data_t), chunk->size); + fail(); + } + data=chunk->data; + // post("consumed %d", data->count); + iemnet__chunk_destroy(chunk); + } + printf("\n"); + return 0; +} + +void serialqueue_setup(void) { + t_iemnet_queue*q=queue_create(); + producer(q, 1000, 1); + consumer(q); + + queue_destroy(q); + pass(); +} diff --git a/build/autotests/tests/skip.c b/build/autotests/tests/skip.c new file mode 100644 index 0000000..63775ec --- /dev/null +++ b/build/autotests/tests/skip.c @@ -0,0 +1,5 @@ +#include "common.h" + +void skip_setup(void) { + skip(); +} diff --git a/build/autotests/tests/threadedqueue.c b/build/autotests/tests/threadedqueue.c new file mode 100644 index 0000000..b68f11d --- /dev/null +++ b/build/autotests/tests/threadedqueue.c @@ -0,0 +1,77 @@ +#include + +#include + +#define NUMCHUNKS 1000 + + +typedef union { + unsigned char cp; + int count; +} data_t; +static int producer(t_iemnet_queue*q, unsigned int count, unsigned int msec) { + unsigned int i; + data_t data; + for(i=0; isize) { + error("size mismatch %d!=%d", sizeof(data_t), chunk->size); + fail(); + } + data=chunk->data; + //printf("%d ", data->count); + iemnet__chunk_destroy(chunk); + } + printf("\n"); + return 0; +} +static void* consumer_thread(void*qq) { + t_iemnet_queue*q=(t_iemnet_queue*)qq; + consumer(q); + return NULL; +} + +void threadedqueue_setup(void) { + pthread_t thread; + pthread_attr_t threadattr; + + t_iemnet_queue*q=queue_create(); + + /* prepare child thread */ + if(pthread_attr_init(&threadattr) < 0) { + error("warning: could not prepare child thread"); + fail(); + } + if(pthread_attr_setdetachstate(&threadattr, PTHREAD_CREATE_DETACHED) < 0) { + error("warning: could not prepare child thread..."); + fail(); + } + + if(pthread_create(&thread, &threadattr, consumer_thread, q) < 0) { + error("warning: could not create child thread"); + fail(); + } + + + producer(q, 1000, 1); + + + queue_destroy(q); + pass(); +} diff --git a/build/coverity/coverity_model.c b/build/coverity/coverity_model.c new file mode 100644 index 0000000..389fba5 --- /dev/null +++ b/build/coverity/coverity_model.c @@ -0,0 +1,21 @@ +/* Coverity Scan model + * + * This is a modeling file for Coverity Scan. Modeling helps to avoid false + * positives. + * + * - A model file can't import any header files. + * - Therefore only some built-in primitives like int, char and void are + * available but not wchar_t, NULL etc. + * - Modeling doesn't need full structs and typedefs. Rudimentary structs + * and similar types are sufficient. + * - An uninitialized local pointer is not an error. It signifies that the + * variable could be either NULL or have some data. + * + * Coverity Scan doesn't pick up modifications automatically. The model file + * must be uploaded by an admin in the analysis settings of + * http://scan.coverity.com/projects/1830 + */ + +void sys_closesocket(int fd) { + __coverity_close__(fd); +} -- cgit v1.2.1