diff options
Diffstat (limited to 'test/ttsafe_error.c')
-rw-r--r-- | test/ttsafe_error.c | 260 |
1 files changed, 135 insertions, 125 deletions
diff --git a/test/ttsafe_error.c b/test/ttsafe_error.c index 1dafd23..b9b8b0b 100644 --- a/test/ttsafe_error.c +++ b/test/ttsafe_error.c @@ -9,7 +9,7 @@ * entry. * * Temporary files generated: - * ttsafe.h5 + * ttsafe_error.h5 * * HDF5 APIs exercised in thread: * H5Screate_simple, H5Tcopy, H5Tset_order, H5Dcreate, H5Dclose, @@ -21,6 +21,11 @@ * Modification History * -------------------- * + * 19 May 2000, Bill Wendling + * Modified so that it creates a unique HDF5 file and removes it on + * cleanup. Also added the num_errs flag and increment it when necessary + * to report the errors. + * ********************************************************************/ #include "ttsafe.h" @@ -28,12 +33,17 @@ static int dummy; /* just to create a non-empty object file */ #else -#define NUM_THREAD 16 -#define FILE "ttsafe.h5" +#define NUM_THREAD 16 +#define FILENAME "ttsafe_error.h5" + /* Having a common dataset name is an error */ -#define DATASETNAME "commonname" -#define EXPECTED_ERROR_DEPTH 3 -#define WRITE_NUMBER 37 +#define DATASETNAME "commonname" +#define EXPECTED_ERROR_DEPTH 3 +#define WRITE_NUMBER 37 + +/* Global variables */ +extern int num_errs; +extern int Verbosity; herr_t error_callback(void *); herr_t walk_error_callback(int, H5E_error_t *, void *); @@ -41,139 +51,139 @@ void *tts_error_thread(void *); hid_t error_file; typedef struct err_num_struct { - int maj_num; - int min_num; + int maj_num; + int min_num; } err_num_t; -err_num_t expected[] = {{15, 23}, {15, 23}, {10, 32}}; +err_num_t expected[] = { + {15, 23}, + {15, 23}, + {10, 32} +}; + int error_flag = 0; int error_count = 0; - pthread_mutex_t error_mutex; -void tts_error(void) { - - int i; - - pthread_t threads[NUM_THREAD]; - pthread_attr_t attribute; - - hid_t dataset; - int value; - - H5E_auto_t old_error_cb; - void *old_error_client_data; - - /* set up mutex for global count of errors */ - pthread_mutex_init(&error_mutex, NULL); - - /* preserve previous error stack handler */ - H5Eget_auto(&old_error_cb, &old_error_client_data); - - /* set our own auto error stack handler */ - H5Eset_auto(error_callback, NULL); - - /* make thread scheduling global */ - pthread_attr_init(&attribute); - pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM); - - /* create a hdf5 file using H5F_ACC_TRUNC access, - * default file creation plist and default file - * access plist - */ - error_file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - for (i=0;i<NUM_THREAD;i++) { - pthread_create(&threads[i], &attribute, tts_error_thread, NULL); - } - - for (i=0;i<NUM_THREAD;i++) { - pthread_join(threads[i],NULL); - } - - if (error_flag) { - fprintf(stderr, "Threads reporting different error values!\n"); - } - - if (error_count != NUM_THREAD - 1) { - fprintf(stderr, "Error: %d threads failed instead of %d\n", - error_count, NUM_THREAD-1); - } - - dataset = H5Dopen(error_file, DATASETNAME); - H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value); - - if (value != WRITE_NUMBER) { - fprintf(stderr, - "Error: Successful thread wrote value %d instead of %d\n", - value, WRITE_NUMBER); - } - - H5Dclose(dataset); - H5Fclose(error_file); - - /* turn our error stack handler off */ - H5Eset_auto(old_error_cb, old_error_client_data); +void tts_error(void) +{ + pthread_t threads[NUM_THREAD]; + pthread_attr_t attribute; + H5E_auto_t old_error_cb; + void *old_error_client_data; + hid_t dataset; + int value, i; + + /* set up mutex for global count of errors */ + pthread_mutex_init(&error_mutex, NULL); + + /* preserve previous error stack handler */ + H5Eget_auto(&old_error_cb, &old_error_client_data); + + /* set our own auto error stack handler */ + H5Eset_auto(error_callback, NULL); + + /* make thread scheduling global */ + pthread_attr_init(&attribute); + pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM); + + /* + * Create a hdf5 file using H5F_ACC_TRUNC access, default file + * creation plist and default file access plist + */ + error_file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + for (i = 0; i < NUM_THREAD; i++) + pthread_create(&threads[i], &attribute, tts_error_thread, NULL); + + for (i = 0; i < NUM_THREAD; i++) + pthread_join(threads[i],NULL); + + if (error_flag) { + fprintf(stderr, "Threads reporting different error values!\n"); + num_errs++; + } + + if (error_count != NUM_THREAD - 1) { + fprintf(stderr, "Error: %d threads failed instead of %d\n", + error_count, NUM_THREAD-1); + num_errs++; + } + + dataset = H5Dopen(error_file, DATASETNAME); + H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value); + + if (value != WRITE_NUMBER) { + fprintf(stderr, + "Error: Successful thread wrote value %d instead of %d\n", + value, WRITE_NUMBER); + num_errs++; + } + + H5Dclose(dataset); + H5Fclose(error_file); + + /* turn our error stack handler off */ + H5Eset_auto(old_error_cb, old_error_client_data); } -void *tts_error_thread(void *arg) { - - hid_t dataspace, datatype, dataset; - hsize_t dimsf[1]; /* dataset dimensions */ - int value; - - /* define dataspace for dataset - */ - dimsf[0] = 1; - dataspace = H5Screate_simple(1,dimsf,NULL); - - /* define datatype for the data using native little endian integers - */ - datatype = H5Tcopy(H5T_NATIVE_INT); - H5Tset_order(datatype, H5T_ORDER_LE); - - /* create a new dataset within the file - */ - dataset = H5Dcreate(error_file, DATASETNAME, datatype, dataspace, - H5P_DEFAULT); - if (dataset >= 0) { /* not an error */ - value = WRITE_NUMBER; - H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &value); - - H5Dclose(dataset); - } - H5Tclose(datatype); - H5Sclose(dataspace); - return (NULL); +void *tts_error_thread(void *arg) +{ + hid_t dataspace, datatype, dataset; + hsize_t dimsf[1]; /* dataset dimensions */ + int value; + + /* define dataspace for dataset */ + dimsf[0] = 1; + dataspace = H5Screate_simple(1,dimsf,NULL); + + /* define datatype for the data using native little endian integers */ + datatype = H5Tcopy(H5T_NATIVE_INT); + H5Tset_order(datatype, H5T_ORDER_LE); + + /* create a new dataset within the file */ + dataset = H5Dcreate(error_file, DATASETNAME, datatype, dataspace, + H5P_DEFAULT); + if (dataset >= 0) { /* not an error */ + value = WRITE_NUMBER; + H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, &value); + H5Dclose(dataset); + } + + H5Tclose(datatype); + H5Sclose(dataspace); + return (NULL); } -void cleanup_error() { +herr_t error_callback(void *client_data) +{ + pthread_mutex_lock(&error_mutex); + error_count++; + pthread_mutex_unlock(&error_mutex); + return H5Ewalk(H5E_WALK_DOWNWARD, walk_error_callback, NULL); } -herr_t error_callback(void *client_data) { - pthread_mutex_lock(&error_mutex); - error_count++; - pthread_mutex_unlock(&error_mutex); - return (H5Ewalk(H5E_WALK_DOWNWARD, walk_error_callback, NULL)); -} +herr_t walk_error_callback(int n, H5E_error_t *err_desc, void *client_data) +{ + int maj_num, min_num; + + if (err_desc) { + maj_num = err_desc->maj_num; + min_num = err_desc->min_num; -herr_t walk_error_callback(int n, H5E_error_t *err_desc, - void *client_data) { - int maj_num, min_num; - - if (err_desc) { - maj_num = err_desc->maj_num; - min_num = err_desc->min_num; - - if (n < EXPECTED_ERROR_DEPTH) { - if (maj_num == expected[n].maj_num && - min_num == expected[n].min_num) { + if (n < EXPECTED_ERROR_DEPTH && maj_num == expected[n].maj_num && + min_num == expected[n].min_num) + return SUCCEED; + } + + error_flag = -1; return SUCCEED; - } - } - } - error_flag = -1; - return SUCCEED; +} + +void cleanup_error(void) +{ + HDunlink(FILENAME); } #endif /*H5_HAVE_THREADSAFE*/ |