mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-30 15:32:37 +08:00
Merge pull request #1034 in HDFFV/hdf5 from fix_api_context_fix to develop
* commit 'bcab84db9f291920ed0fe321116405f73eaddfa5': Resolve memory leak of last API context, by freeing it in H5CX terminate routine. Revert "Close memory leak of last API context when shutting library down."
This commit is contained in:
commit
e217bd113d
3
src/H5.c
3
src/H5.c
@ -415,8 +415,7 @@ H5_term_library(void)
|
||||
/* Mark library as closed */
|
||||
H5_INIT_GLOBAL = FALSE;
|
||||
|
||||
/* Pop the API context (without checking for errors) */
|
||||
H5CX_pop_special();
|
||||
/* Don't pop the API context (i.e. H5CX_pop), since it's been shut down already */
|
||||
|
||||
done:
|
||||
#ifdef H5_HAVE_THREADSAFE
|
||||
|
75
src/H5CX.c
75
src/H5CX.c
@ -342,7 +342,7 @@ typedef struct H5CX_lapl_cache_t {
|
||||
/********************/
|
||||
static H5CX_node_t **H5CX__get_context(void);
|
||||
static void H5CX__push_common(H5CX_node_t *cnode);
|
||||
static H5CX_node_t *H5CX__pop_common(hbool_t update_dxpl);
|
||||
static H5CX_node_t *H5CX__pop_common(void);
|
||||
|
||||
|
||||
/*********************/
|
||||
@ -535,6 +535,16 @@ H5CX_term_package(void)
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOERR
|
||||
|
||||
if(H5_PKG_INIT_VAR) {
|
||||
H5CX_node_t *cnode; /* Context node */
|
||||
|
||||
/* Pop the top context node from the stack */
|
||||
/* (Can't check for errors, as rest of library is shut down) */
|
||||
cnode = H5CX__pop_common();
|
||||
|
||||
/* Free the context node */
|
||||
/* (Allocated with HDmalloc() in H5CX_push_special() ) */
|
||||
HDfree(cnode);
|
||||
|
||||
#ifndef H5_HAVE_THREADSAFE
|
||||
/* Release pointer to head of API context stack */
|
||||
HDfree(H5CX_head_g);
|
||||
@ -2743,7 +2753,7 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static H5CX_node_t *
|
||||
H5CX__pop_common(hbool_t update_dxpl)
|
||||
H5CX__pop_common(void)
|
||||
{
|
||||
H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
|
||||
H5CX_node_t *ret_value = NULL; /* Return value */
|
||||
@ -2753,25 +2763,22 @@ H5CX__pop_common(hbool_t update_dxpl)
|
||||
/* Sanity check */
|
||||
HDassert(head && *head);
|
||||
|
||||
/* Update DXPL properties, if requested */
|
||||
if(update_dxpl) {
|
||||
/* Check for cached DXPL properties to return to application */
|
||||
H5CX_SET_PROP(H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, dcr_filters)
|
||||
/* Check for cached DXPL properties to return to application */
|
||||
H5CX_SET_PROP(H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, dcr_filters)
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
H5CX_SET_PROP(H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, mpio_actual_chunk_opt)
|
||||
H5CX_SET_PROP(H5D_MPIO_ACTUAL_IO_MODE_NAME, mpio_actual_io_mode)
|
||||
H5CX_SET_PROP(H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, mpio_local_no_coll_cause)
|
||||
H5CX_SET_PROP(H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, mpio_global_no_coll_cause)
|
||||
H5CX_SET_PROP(H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, mpio_actual_chunk_opt)
|
||||
H5CX_SET_PROP(H5D_MPIO_ACTUAL_IO_MODE_NAME, mpio_actual_io_mode)
|
||||
H5CX_SET_PROP(H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, mpio_local_no_coll_cause)
|
||||
H5CX_SET_PROP(H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, mpio_global_no_coll_cause)
|
||||
#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, mpio_coll_chunk_link_hard)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, mpio_coll_chunk_multi_hard)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, mpio_coll_chunk_link_num_true)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME, mpio_coll_chunk_link_num_false)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME, mpio_coll_chunk_multi_ratio_coll)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME, mpio_coll_chunk_multi_ratio_ind)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, mpio_coll_chunk_link_hard)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, mpio_coll_chunk_multi_hard)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, mpio_coll_chunk_link_num_true)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME, mpio_coll_chunk_link_num_false)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME, mpio_coll_chunk_multi_ratio_coll)
|
||||
H5CX_SET_PROP(H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME, mpio_coll_chunk_multi_ratio_ind)
|
||||
#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
} /* end if */
|
||||
|
||||
/* Pop the top context node from the stack */
|
||||
ret_value = (*head);
|
||||
@ -2803,7 +2810,7 @@ H5CX_pop(void)
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
/* Perform common operations and get top context from stack */
|
||||
if(NULL == (cnode = H5CX__pop_common(TRUE)))
|
||||
if(NULL == (cnode = H5CX__pop_common()))
|
||||
HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "error getting API context node")
|
||||
|
||||
/* Free the context node */
|
||||
@ -2813,35 +2820,3 @@ done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5CX_pop() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5CX_pop_special
|
||||
*
|
||||
* Purpose: Pops the context for an API call, without using library routines.
|
||||
*
|
||||
* Note: This should only be called in special circumstances, like H5close.
|
||||
*
|
||||
* Return: <none>
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Februrary 22, 2018
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
H5CX_pop_special(void)
|
||||
{
|
||||
H5CX_node_t *cnode; /* Context node */
|
||||
|
||||
FUNC_ENTER_NOAPI_NOINIT_NOERR
|
||||
|
||||
/* Perform common operations and get top context from stack */
|
||||
cnode = H5CX__pop_common(FALSE);
|
||||
HDassert(cnode);
|
||||
|
||||
/* Free the context node */
|
||||
HDfree(cnode);
|
||||
|
||||
FUNC_LEAVE_NOAPI_VOID
|
||||
} /* end H5CX_pop_special() */
|
||||
|
||||
|
@ -56,7 +56,6 @@ H5_DLL herr_t H5CX_pop(void);
|
||||
#endif /* _H5private_H */
|
||||
H5_DLL void H5CX_push_special(void);
|
||||
H5_DLL hbool_t H5CX_is_def_dxpl(void);
|
||||
H5_DLL void H5CX_pop_special(void);
|
||||
|
||||
/* "Setter" routines for API context info */
|
||||
H5_DLL void H5CX_set_dxpl(hid_t dxpl_id);
|
||||
|
Loading…
Reference in New Issue
Block a user