From 188539f65e5de800ab63e68093c8e453e8c451c4 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 17 Apr 2018 22:39:20 -0500 Subject: Revert "Close memory leak of last API context when shutting library down." This reverts commit 0bd3634dc5747d88582a966050896bad57acb892. --- src/H5.c | 4 ++-- src/H5CX.c | 35 ++++++++++++++++------------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/H5.c b/src/H5.c index 1467ddf..f3e56d0 100644 --- a/src/H5.c +++ b/src/H5.c @@ -415,8 +415,8 @@ 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, since it's been shut down already */ + /* H5CX_pop_special(); */ done: #ifdef H5_HAVE_THREADSAFE diff --git a/src/H5CX.c b/src/H5CX.c index 5c907bc..af2619b 100644 --- a/src/H5CX.c +++ b/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); /*********************/ @@ -2743,7 +2743,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 +2753,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 +2800,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 */ @@ -2836,7 +2833,7 @@ H5CX_pop_special(void) FUNC_ENTER_NOAPI_NOINIT_NOERR /* Perform common operations and get top context from stack */ - cnode = H5CX__pop_common(FALSE); + cnode = H5CX__pop_common(); HDassert(cnode); /* Free the context node */ -- cgit v0.12 From bcab84db9f291920ed0fe321116405f73eaddfa5 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 17 Apr 2018 22:55:45 -0500 Subject: Resolve memory leak of last API context, by freeing it in H5CX terminate routine. --- src/H5.c | 3 +-- src/H5CX.c | 42 ++++++++++-------------------------------- src/H5CXprivate.h | 1 - 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/src/H5.c b/src/H5.c index f3e56d0..552330d 100644 --- a/src/H5.c +++ b/src/H5.c @@ -415,8 +415,7 @@ H5_term_library(void) /* Mark library as closed */ H5_INIT_GLOBAL = FALSE; - /* Don't pop the API context, since it's been shut down already */ - /* 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 diff --git a/src/H5CX.c b/src/H5CX.c index af2619b..c81a0f4 100644 --- a/src/H5CX.c +++ b/src/H5CX.c @@ -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); @@ -2810,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: - * - * 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(); - HDassert(cnode); - - /* Free the context node */ - HDfree(cnode); - - FUNC_LEAVE_NOAPI_VOID -} /* end H5CX_pop_special() */ - diff --git a/src/H5CXprivate.h b/src/H5CXprivate.h index 78f4793..3566f11 100644 --- a/src/H5CXprivate.h +++ b/src/H5CXprivate.h @@ -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); -- cgit v0.12