summaryrefslogtreecommitdiffstats
path: root/test/ttsafe_dcreate.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2003-02-07 21:14:19 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2003-02-07 21:14:19 (GMT)
commit168d67dbd20923feef30fb76c6b569ef2e5add4a (patch)
tree2bcfd51c39665400804e92ac0fb13d42b2df96c3 /test/ttsafe_dcreate.c
parent4e8da9d2246a0bba1afb5c678346b2f1c4633c69 (diff)
downloadhdf5-168d67dbd20923feef30fb76c6b569ef2e5add4a.zip
hdf5-168d67dbd20923feef30fb76c6b569ef2e5add4a.tar.gz
hdf5-168d67dbd20923feef30fb76c6b569ef2e5add4a.tar.bz2
[svn-r6383] Purpose:
New feature for developers. Description: Added "function stack" tracing to library. This allows developers (there is no public API) to call H5FS_print within the library and get a listing of the functions traversed to reach that point in the library. Eventually, I may add support for reporting the parameters to each function also... Mainly for debugging parallel I/O programs, but I think it will come in handy in other cases also. The function stack tracking is controlled with a configure switch: --enable-funcstack, which defaults to enabled currently. When we branch for 1.6, we should change the default setting on the branch to be disabled. Also, added a destructor to the thread-specific keys when thread-safety is turned on in the library. Otherwise, they were leaking memory and causing difficult to debug errors in threaded programs (like the test/ttsafe test). Platforms tested: Tested h5committest {arabica (fortran), eirene (fortran, C++) modi4 (parallel, fortran)} FreeBSD 4.7 (sleipnir) w/thread-safety enabled. Misc. update: Updated MANIFEST with new files added (src/H5FS.c & src/H5FDprivate.h) Update release_docs/RELEASE with thread-safety bug fix.
Diffstat (limited to 'test/ttsafe_dcreate.c')
-rw-r--r--test/ttsafe_dcreate.c226
1 files changed, 117 insertions, 109 deletions
diff --git a/test/ttsafe_dcreate.c b/test/ttsafe_dcreate.c
index ae4fdbc..d85dbe7 100644
--- a/test/ttsafe_dcreate.c
+++ b/test/ttsafe_dcreate.c
@@ -44,140 +44,148 @@ typedef struct thread_info {
} thread_info;
/*
+ * Set individual dataset names (rather than generated the names
+ * automatically)
+ */
+const char *dsetname[NUM_THREAD]={
+ "zero",
+ "one",
+ "two",
+ "three",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine",
+ "ten",
+ "eleven",
+ "twelve",
+ "thirteen",
+ "fourteen",
+ "fifteen"
+};
+
+thread_info thread_out[NUM_THREAD];
+
+/*
**********************************************************************
* Thread safe test - multiple dataset creation
**********************************************************************
*/
void tts_dcreate(void)
{
- /* Pthread definitions */
- pthread_t threads[NUM_THREAD];
-
- /* HDF5 data definitions */
- hid_t file, dataset, datatype;
- int datavalue, i;
- thread_info *thread_out;
- const char *dsetname[NUM_THREAD];
- pthread_attr_t attribute;
-
- /* set pthread attribute to perform global scheduling */
- pthread_attr_init(&attribute);
- pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
-
- /*
- * Set individual dataset names (rather than generated the names
- * automatically)
- */
-
- for (i = 0; i < NUM_THREAD; i++)
- dsetname[i] = malloc(sizeof(char) * DATASETNAME_LENGTH);
-
- dsetname[0] = "zero";
- dsetname[1] = "one";
- dsetname[2] = "two";
- dsetname[3] = "three";
- dsetname[4] = "four";
- dsetname[5] = "five";
- dsetname[6] = "six";
- dsetname[7] = "seven";
- dsetname[8] = "eight";
- dsetname[9] = "nine";
- dsetname[10] = "ten";
- dsetname[11] = "eleven";
- dsetname[12] = "twelve";
- dsetname[13] = "thirteen";
- dsetname[14] = "fourteen";
- dsetname[15] = "fifteen";
-
- /*
- * Create a hdf5 file using H5F_ACC_TRUNC access, default file
- * creation plist and default file access plist
- */
- file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
- /* simultaneously create a large number of datasets within the file */
- for (i = 0; i < NUM_THREAD; i++) {
- thread_out = malloc(sizeof(thread_info));
- thread_out->id = i;
- thread_out->file = file;
- thread_out->dsetname = dsetname[i];
- pthread_create(&threads[i], NULL, tts_dcreate_creator, thread_out);
- }
-
- for (i = 0;i < NUM_THREAD; i++)
- pthread_join(threads[i], NULL);
-
- /* compare data to see if it is written correctly */
-
- /* define datatype for the data using native little endian integers */
- datatype = H5Tcopy(H5T_NATIVE_INT);
-
- for (i = 0; i < NUM_THREAD; i++) {
- if ((dataset = H5Dopen(file,dsetname[i])) < 0) {
- fprintf(stderr, "Dataset name not found - test failed\n");
- H5Fclose(file);
- num_errs++;
- return;
- } else {
- H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, &datavalue);
-
- if (datavalue != i) {
- fprintf(stderr,
- "Wrong value read %d for dataset name %s - test failed\n",
- datavalue, dsetname[i]);
- H5Dclose(dataset);
- H5Fclose(file);
- num_errs++;
- return;
- }
-
- H5Dclose(dataset);
- }
- }
-
- /* close remaining resources */
- H5Fclose(file);
+ /* Pthread definitions */
+ pthread_t threads[NUM_THREAD];
+
+ /* HDF5 data definitions */
+ hid_t file, dataset;
+ int datavalue, i;
+ pthread_attr_t attribute;
+ int ret;
+
+ /* set pthread attribute to perform global scheduling */
+ ret=pthread_attr_init(&attribute);
+ assert(ret==0);
+ ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
+/* Don't check return value on FreeBSD, since PTHREAD_SCOPE_SYSTEM is not
+ * currently supported in v4.7
+ */
+#ifndef __FreeBSD__
+ assert(ret==0);
+#endif /* __FreeBSD__ */
+
+ /*
+ * Create a hdf5 file using H5F_ACC_TRUNC access, default file
+ * creation plist and default file access plist
+ */
+ file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ assert(file>=0);
+
+ /* simultaneously create a large number of datasets within the file */
+ for (i = 0; i < NUM_THREAD; i++) {
+ thread_out[i].id = i;
+ thread_out[i].file = file;
+ thread_out[i].dsetname = dsetname[i];
+ ret=pthread_create(&threads[i], NULL, tts_dcreate_creator, &thread_out[i]);
+ assert(ret==0);
+ }
+
+ for (i = 0;i < NUM_THREAD; i++) {
+ ret=pthread_join(threads[i], NULL);
+ assert(ret==0);
+ } /* end for */
+
+ /* compare data to see if it is written correctly */
+
+ for (i = 0; i < NUM_THREAD; i++) {
+ if ((dataset = H5Dopen(file,dsetname[i])) < 0) {
+ fprintf(stderr, "Dataset name not found - test failed\n");
+ H5Fclose(file);
+ num_errs++;
+ return;
+ } else {
+ ret=H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &datavalue);
+ assert(ret>=0);
+
+ if (datavalue != i) {
+ fprintf(stderr, "Wrong value read %d for dataset name %s - test failed\n",
+ datavalue, dsetname[i]);
+ H5Dclose(dataset);
+ H5Fclose(file);
+ num_errs++;
+ return;
+ }
+
+ ret=H5Dclose(dataset);
+ assert(ret>=0);
+ }
+ }
+
+ /* close remaining resources */
+ ret=H5Fclose(file);
+ assert(ret>=0);
+
+ /* Destroy the thread attribute */
+ ret=pthread_attr_destroy(&attribute);
+ assert(ret==0);
}
-void *tts_dcreate_creator(void *thread_data)
+void *tts_dcreate_creator(void *_thread_data)
{
- hid_t dataspace, datatype, dataset;
+ hid_t dataspace, dataset;
+ herr_t ret;
hsize_t dimsf[1]; /* dataset dimensions */
- struct thread_info {
- int id;
- hid_t file;
- char *dsetname;
- } thread_in;
+ struct thread_info thread_data;
- thread_in.dsetname = malloc(sizeof(char) * DATASETNAME_LENGTH);
- thread_in = *((struct thread_info *)thread_data);
+ memcpy(&thread_data,_thread_data,sizeof(struct thread_info));
/* 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);
+ assert(dataspace>=0);
/* create a new dataset within the file */
- dataset = H5Dcreate(thread_in.file, thread_in.dsetname,
- datatype, dataspace, H5P_DEFAULT);
+ dataset = H5Dcreate(thread_data.file, thread_data.dsetname,
+ H5T_NATIVE_INT, dataspace, H5P_DEFAULT);
+ assert(dataset>=0);
/* initialize data for dataset and write value to dataset */
- H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
- H5P_DEFAULT, &thread_in.id);
+ ret=H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
+ H5P_DEFAULT, &thread_data.id);
+ assert(ret>=0);
+
+ /* close dataset and dataspace resources */
+ ret=H5Dclose(dataset);
+ assert(ret>=0);
+ ret=H5Sclose(dataspace);
+ assert(ret>=0);
- /* close dataset, datatype and dataspace resources */
- H5Dclose(dataset);
- H5Tclose(datatype);
- H5Sclose(dataspace);
return NULL;
}
void cleanup_dcreate(void)
{
- H5close();
HDunlink(FILENAME);
}
#endif /*H5_HAVE_THREADSAFE*/