diff options
author | Raymond Lu <songyulu@hdfgroup.org> | 2010-09-27 19:02:48 (GMT) |
---|---|---|
committer | Raymond Lu <songyulu@hdfgroup.org> | 2010-09-27 19:02:48 (GMT) |
commit | 1c61b6fe13f6fd9c84c0407f02865568e0a7f638 (patch) | |
tree | e294883e7a2d7de4ec264d9ea68392c3587ecea3 /src | |
parent | 82c6eab1814e1e06ef9472f6f4bbc8522064e0bc (diff) | |
download | hdf5-1c61b6fe13f6fd9c84c0407f02865568e0a7f638.zip hdf5-1c61b6fe13f6fd9c84c0407f02865568e0a7f638.tar.gz hdf5-1c61b6fe13f6fd9c84c0407f02865568e0a7f638.tar.bz2 |
[svn-r19481] I'm backing out my fix for bug 1707 because there're some unresolved issues - r19441 and 19467.
Bug 1707 is that H5Eset_auto causes a seg fault when an application uses -DH5_USE_16_API with
the 1.8 library to compile.
I created a branch off the trunk called set_auto to continue working on the problem.
Tested on jam - backing out, simple.
Diffstat (limited to 'src')
-rw-r--r-- | src/H5.c | 9 | ||||
-rw-r--r-- | src/H5E.c | 24 | ||||
-rw-r--r-- | src/H5Edeprec.c | 9 | ||||
-rw-r--r-- | src/H5Eint.c | 8 | ||||
-rw-r--r-- | src/H5Epkg.h | 19 |
5 files changed, 23 insertions, 46 deletions
@@ -214,7 +214,7 @@ H5_term_library(void) int pending, ntries = 0, n; size_t at = 0; char loop[1024]; - H5E_auto_t func; + H5E_auto2_t func; #ifdef H5_HAVE_THREADSAFE /* explicit locking of the API */ @@ -227,11 +227,8 @@ H5_term_library(void) goto done; /* Check if we should display error output */ -#ifdef H5_USE_16_API_DEFAULT - (void)H5Eget_auto(&func, NULL); -#else - (void)H5Eget_auto(H5E_DEFAULT, &func, NULL); -#endif + (void)H5Eget_auto2(H5E_DEFAULT, &func, NULL); + /* * Terminate each interface. The termination functions return a positive * value if they do something that might affect some other interface in a @@ -170,18 +170,13 @@ H5E_set_default_auto(H5E_t *stk) { FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5E_set_default_auto) -#ifdef H5_USE_16_API_DEFAULT +#ifdef H5_USE_16_API stk->auto_op.vers = 1; -#else /* H5_USE_16_API_DEFAULT */ + stk->auto_op.u.func1 = (H5E_auto1_t)H5Eprint1; +#else /* H5_USE_16_API */ stk->auto_op.vers = 2; -#endif /* H5_USE_16_API_DEFAULT */ -#ifdef H5_NO_DEPRECATED_SYMBOLS - stk->auto_op.vers = 2; -#else - stk->auto_op.func1 = (H5E_auto1_t)H5Eprint1; -#endif - stk->auto_op.func2 = (H5E_auto2_t)H5Eprint2; - stk->auto_op.user_set = FALSE; + stk->auto_op.u.func2 = (H5E_auto2_t)H5Eprint2; +#endif /* H5_USE_16_API */ stk->auto_data = NULL; FUNC_LEAVE_NOAPI(SUCCEED) @@ -1583,12 +1578,8 @@ H5Eget_auto2(hid_t estack_id, H5E_auto2_t *func, void **client_data) /* Get the automatic error reporting information */ if(H5E_get_auto(estack, &op, client_data) < 0) HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info") - - if(op.user_set && op.vers == 1) - HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "wrong API function, H5Eset_auto1 has been called") - if(func) - *func = op.func2; + *func = op.u.func2; done: FUNC_LEAVE_API(ret_value) @@ -1638,8 +1629,7 @@ H5Eset_auto2(hid_t estack_id, H5E_auto2_t func, void *client_data) /* Set the automatic error reporting information */ op.vers = 2; - op.user_set = TRUE; - op.func2 = func; + op.u.func2 = func; if(H5E_set_auto(estack, &op, client_data) < 0) HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't set automatic error info") diff --git a/src/H5Edeprec.c b/src/H5Edeprec.c index 9f6d869..30f3ae9 100644 --- a/src/H5Edeprec.c +++ b/src/H5Edeprec.c @@ -389,12 +389,8 @@ H5Eget_auto1(H5E_auto1_t *func, void **client_data) /* Get the automatic error reporting information */ if(H5E_get_auto(estack, &auto_op, client_data) < 0) HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get automatic error info") - - if(auto_op.user_set && auto_op.vers == 2) - HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "wrong API function, H5Eset_auto2 has been called") - if(func) - *func = auto_op.func1; + *func = auto_op.u.func1; done: FUNC_LEAVE_API(ret_value) @@ -440,8 +436,7 @@ H5Eset_auto1(H5E_auto1_t func, void *client_data) /* Set the automatic error reporting information */ auto_op.vers = 1; - auto_op.user_set = TRUE; - auto_op.func1 = func; + auto_op.u.func1 = func; if(H5E_set_auto(estack, &auto_op, client_data) < 0) HGOTO_ERROR(H5E_ERROR, H5E_CANTSET, FAIL, "can't set automatic error info") diff --git a/src/H5Eint.c b/src/H5Eint.c index 75aadda..584ba40 100644 --- a/src/H5Eint.c +++ b/src/H5Eint.c @@ -1013,15 +1013,15 @@ H5E_dump_api_stack(hbool_t is_api) HDassert(estack); if(estack->auto_op.vers == 1) { #ifndef H5_NO_DEPRECATED_SYMBOLS - if(estack->auto_op.func1) - (void)((estack->auto_op.func1)(estack->auto_data)); + if(estack->auto_op.u.func1) + (void)((estack->auto_op.u.func1)(estack->auto_data)); #else /* H5_NO_DEPRECATED_SYMBOLS */ HDassert(0 && "version 1 error stack dump without deprecated symbols!"); #endif /* H5_NO_DEPRECATED_SYMBOLS */ } /* end if */ else { - if(estack->auto_op.func2) - (void)((estack->auto_op.func2)(H5E_DEFAULT, estack->auto_data)); + if(estack->auto_op.u.func2) + (void)((estack->auto_op.u.func2)(H5E_DEFAULT, estack->auto_data)); } /* end else */ } /* end if */ diff --git a/src/H5Epkg.h b/src/H5Epkg.h index b9688d2..a85ddc9 100644 --- a/src/H5Epkg.h +++ b/src/H5Epkg.h @@ -68,20 +68,15 @@ /****************************/ /* Some syntactic sugar to make the compiler happy with two different kinds of callbacks */ -#ifndef H5_NO_DEPRECATED_SYMBOLS -typedef struct { - unsigned vers; /* Which version callback to use */ - hbool_t user_set; /* If the printing function has been set. */ - H5E_auto1_t func1; /* Old-style callback, NO error stack param. */ - H5E_auto2_t func2; /* New-style callback, with error stack param. */ -} H5E_auto_op_t; -#else typedef struct { - unsigned vers; /* Which version callback to use */ - hbool_t user_set; /* If the printing function has been set. */ - H5E_auto_t func2; /* Only the new style callback function is available. */ + unsigned vers; /* Which version callback to use */ + union { +#ifndef H5_NO_DEPRECATED_SYMBOLS + H5E_auto1_t func1; /* Old-style callback, NO error stack param. */ +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + H5E_auto2_t func2; /* New-style callback, with error stack param. */ + }u; } H5E_auto_op_t; -#endif /* Some syntactic sugar to make the compiler happy with two different kinds of callbacks */ typedef struct { |