summaryrefslogtreecommitdiffstats
path: root/test/ttsafe.c
blob: 0e24bf36a66c0b40943acf26ff3295d5ce2de1d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
 * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 * FILE
 * ttsafe.c - HDF5 threadsafe testing framework main file.
 *
 * REMARKS
 * General test wrapper for HDF5 library thread safety test programs
 *
 * DESIGN
 * Each test function should be implemented as function having no
 * parameters and returning void (i.e. no return value).  They should be put
 * into the list of InitTest() calls in main() below.  Functions which depend
 * on other functionality should be placed below the InitTest() call for the
 * base functionality testing.
 * Each test module should include ttsafe.h and define a unique set of
 * names for test files they create.
 *
 * BUGS/LIMITATIONS
 *
 * EXPORTED ROUTINES/VARIABLES:
 * 
 */

#include "h5test.h"

/* ANY new test needs to have a prototype in ttsafe.h */
#include "ttsafe.h"

#ifndef H5_HAVE_THREADSAFE
int main(void)
{
    printf("Test skipped because THREADSAFE not enabled\n");
    return 0;
}
#else

#define MAX_NUM_NAME 1000
#define NAME_OFFSET 6         /* offset for "name<num>" */

/* pre-condition: num must be a non-negative number */
static int num_digits(int num)
{
	int i;

	if (num == 0)
		return 1;

	for (i = 0; num > 0; i++)
		num = num / 10;

	return i;
}

/* Routine to generate attribute names for numeric values */
char *gen_name(int value)
{
	char *temp;
	int i, length;

	length = num_digits(MAX_NUM_NAME - 1);
	temp = (char *)HDmalloc((NAME_OFFSET + length + 1) * sizeof(char));
	temp = HDstrcpy(temp, "attrib");
	temp[NAME_OFFSET + length] = '\0';

	for (i = length - 1; i >= 0; i--) {
		temp[NAME_OFFSET + i] = (char)((int)'0' + value % 10);
		value = value / 10;
	}

	return temp;
}

int main(int argc, char *argv[])
{
        /* Initialize testing framework */
        TestInit(argv[0], NULL, NULL);

	/* Tests are generally arranged from least to most complexity... */
	AddTest("dcreate", tts_dcreate, cleanup_dcreate, "multi-dataset creation", NULL);
	AddTest("error", tts_error, cleanup_error, "per-thread error stacks", NULL);
	AddTest("cancel", tts_cancel, cleanup_cancel, "thread cancellation safety test", NULL);
	AddTest("acreate", tts_acreate, cleanup_acreate, "multi-attribute creation", NULL);

        /* Display testing information */
        TestInfo(argv[0]);

        /* Parse command line arguments */
        TestParseCmdLine(argc,argv);

        /* Perform requested testing */
        PerformTests();

        /* Display test summary, if requested */
	if (GetTestSummary())
            TestSummary();

        /* Clean up test files, if allowed */
	if (GetTestCleanup() && !getenv("HDF5_NOCLEANUP"))
            TestCleanup();

	return GetTestNumErrs();
} /* end main() */
#endif  /*H5_HAVE_THREADSAFE*/
l str">" -h Print this help message." echo echo " -p Used by THG to use hard-codes autotools" echo " paths on THG machines. Not for non-HDF-Group" echo " users!" echo echo " -v Show more verbose output." echo echo " NOTE: Each tool can be set via an environment variable." echo " These are documented inside this autogen.sh script." echo exit 0 ;; p) echo "Setting THG production mode..." echo production=true ;; v) echo "Setting verbosity: high" echo verbose=true ;; *) if [ "$OPTERR" != 1 ] || case $optspec in :*) ;; *) false; esac; then echo "ERROR: non-option argument: '-${OPTARG}'" >&2 echo "Quitting" exit 1 fi ;; esac done if [ "$production" = true ] ; then # Production mode # # Hard-code canonical HDF Group tool locations. # If paths to tools are not specified, assume they are # located in /usr/hdf/bin/AUTOTOOLS and set paths accordingly. if test -z ${HDF5_AUTOCONF}; then HDF5_AUTOCONF=/usr/hdf/bin/AUTOTOOLS/autoconf fi if test -z ${HDF5_AUTOMAKE}; then HDF5_AUTOMAKE=/usr/hdf/bin/AUTOTOOLS/automake fi if test -z ${HDF5_AUTOHEADER}; then HDF5_AUTOHEADER=/usr/hdf/bin/AUTOTOOLS/autoheader fi if test -z ${HDF5_ACLOCAL}; then HDF5_ACLOCAL=/usr/hdf/bin/AUTOTOOLS/aclocal fi if test -z ${HDF5_LIBTOOL}; then HDF5_LIBTOOL=/usr/hdf/bin/AUTOTOOLS/libtool fi if test -z ${HDF5_M4}; then HDF5_M4=/usr/hdf/bin/AUTOTOOLS/m4 fi else # Not in production mode # # If paths to autotools are not specified, use whatever the system # has installed as the default. We use 'which <tool>' to # show exactly what's being used. if test -z ${HDF5_AUTOCONF}; then HDF5_AUTOCONF=$(which autoconf) fi if test -z ${HDF5_AUTOMAKE}; then HDF5_AUTOMAKE=$(which automake) fi if test -z ${HDF5_AUTOHEADER}; then HDF5_AUTOHEADER=$(which autoheader) fi if test -z ${HDF5_ACLOCAL}; then HDF5_ACLOCAL=$(which aclocal) fi if test -z ${HDF5_LIBTOOL}; then case "`uname`" in Darwin*) # libtool on OS-X is non-gnu HDF5_LIBTOOL=$(which glibtool) ;; *) HDF5_LIBTOOL=$(which libtool) ;; esac fi if test -z ${HDF5_M4}; then HDF5_M4=$(which m4) fi fi # production # Make sure that these versions of the autotools are in the path AUTOCONF_DIR=`dirname ${HDF5_AUTOCONF}` LIBTOOL_DIR=`dirname ${HDF5_LIBTOOL}` M4_DIR=`dirname ${HDF5_M4}` PATH=${AUTOCONF_DIR}:${LIBTOOL_DIR}:${M4_DIR}:$PATH # Make libtoolize match the specified libtool case "`uname`" in Darwin*) # On OS X, libtoolize could be named glibtoolize or # libtoolize. Try the former first, then fall back # to the latter if it's not found. HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/glibtoolize" if [ ! -f $HDF5_LIBTOOLIZE ] ; then HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/libtoolize" fi ;; *) HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/libtoolize" ;; esac # Run scripts that process source. # # These should be run before the autotools so that failures here block # compilation. # Run trace script # The trace script adds H5TRACE macros to library source files. It should # have no effect on files that don't have HDF5 API macros in them. echo "Running trace script:" bin/trace src/H5*.c || exit 1 echo # Run make_err # make_err automatically generates the H5E headers that create error message # types for HDF5. echo "Running error generation script:" bin/make_err src/H5err.txt || exit 1 echo # Run make_vers # make_vers automatically generates the public headers that define the API version # macros for HDF5. echo "Running API version generation script:" bin/make_vers src/H5vers.txt || exit 1 echo # Run make_overflow # make_overflow automatically generates macros for detecting overflows for type # conversion. echo "Running overflow macro generation script:" bin/make_overflow src/H5overflow.txt || exit 1 echo # Run autotools in order # # When available, we use the --force option to ensure all files are # updated. This prevents the autotools from re-running to fix dependencies # during the 'make' step, which can be a problem if environment variables # were set on the command line during autogen invocation. # Some versions of libtoolize will suggest that we add ACLOCAL_AMFLAGS # = '-I m4'. This is already done in commence.am, which is included # in Makefile.am. You can ignore this suggestion. # LIBTOOLIZE libtoolize_cmd="${HDF5_LIBTOOLIZE} --copy --force" echo ${libtoolize_cmd} if [ "$verbose" = true ] ; then ${HDF5_LIBTOOLIZE} --version fi ${libtoolize_cmd} || exit 1 echo echo "NOTE: You can ignore the warning about adding -I m4." echo " We already do this in an included file." echo # ACLOCAL if test -e "${LIBTOOL_DIR}/../share/aclocal" ; then aclocal_include="-I ${LIBTOOL_DIR}/../share/aclocal" fi aclocal_cmd="${HDF5_ACLOCAL} --force -I m4 ${aclocal_include}" echo ${aclocal_cmd} if [ "$verbose" = true ] ; then ${HDF5_ACLOCAL} --version fi ${aclocal_cmd} || exit 1 echo # AUTOHEADER autoheader_cmd="${HDF5_AUTOHEADER} --force" echo ${autoheader_cmd} if [ "$verbose" = true ] ; then ${HDF5_AUTOHEADER} --version fi ${autoheader_cmd} || exit 1 echo # AUTOMAKE automake_cmd="${HDF5_AUTOMAKE} --copy --add-missing --force-missing" echo ${automake_cmd} if [ "$verbose" = true ] ; then ${HDF5_AUTOMAKE} --version fi ${automake_cmd} || exit 1 echo # AUTOCONF autoconf_cmd="${HDF5_AUTOCONF} --force" echo ${autoconf_cmd} if [ "$verbose" = true ] ; then ${HDF5_AUTOCONF} --version fi ${autoconf_cmd} || exit 1 echo echo "*** SUCCESS ***" echo exit 0