2
0
mirror of https://github.com/HDFGroup/hdf5.git synced 2025-04-12 17:31:09 +08:00

Remove thread-local copy of hyperslab operation generation value.

This commit is contained in:
Quincey Koziol 2019-03-19 16:40:07 -05:00
parent 93b72d60ab
commit adb0928827
3 changed files with 4 additions and 98 deletions

@ -83,24 +83,6 @@
(curr_span) = saved_next_span; \
} while(0)
#ifdef H5_HAVE_THREADSAFE
/*
* The per-thread operation generation. pthread_once() initializes a special
* key that will be used by all threads to create a stack specific to
* each thread individually. The association of operation generations to threads
* will be handled by the pthread library.
*
* In order for this macro to work, H5S_hyper_get_my_op_gen() must be preceeded
* by "uint64_t *gen =".
*/
#define H5S_hyper_get_my_op_gen() H5S__hyper_op_gen()
#else /* H5_HAVE_THREADSAFE */
/*
* The current operation generation.
*/
#define H5S_hyper_get_my_op_gen() (&H5S_hyper_op_gen_g)
#endif /* H5_HAVE_THREADSAFE */
/******************/
/* Local Typedefs */
@ -114,9 +96,6 @@ typedef hsize_t hbounds_t;
/********************/
/* Local Prototypes */
/********************/
#ifdef H5_HAVE_THREADSAFE
static uint64_t *H5S__hyper_op_gen(void);
#endif /* H5_HAVE_THREADSAFE */
static H5S_hyper_span_t *H5S__hyper_new_span(hsize_t low, hsize_t high,
H5S_hyper_span_info_t *down, H5S_hyper_span_t *next);
static H5S_hyper_span_info_t *H5S__hyper_new_span_info(unsigned rank);
@ -285,10 +264,9 @@ H5FL_BARR_DEFINE_STATIC(H5S_hyper_span_info_t, hbounds_t, H5S_MAX_RANK * 2);
/* Declare extern free list to manage the H5S_sel_iter_t struct */
H5FL_EXTERN(H5S_sel_iter_t);
#ifndef H5_HAVE_THREADSAFE
static uint64_t H5S_hyper_op_gen_g = 1; /* Current operation generation */
/* (Use '1' to avoid clashing with '0' value in newly allocated structs) */
#endif /* H5_HAVE_THREADSAFE */
/* Current operation generation */
/* (Start with '1' to avoid clashing with '0' value in newly allocated structs) */
static uint64_t H5S_hyper_op_gen_g = 1;
/* Uncomment this, to provide the debugging routines for printing selection info */
@ -518,60 +496,6 @@ H5S__hyper_print_space_dfs(FILE *f, const H5S_t *space)
} /* end H5S__hyper_print_space_dfs() */
#endif /* H5S_HYPER_DEBUG */
#ifdef H5_HAVE_THREADSAFE
/*-------------------------------------------------------------------------
* Function: H5S__hyper_op_gen
*
* Purpose: Support function for H5S_hyper_get_my_op_gen() to initialize and
* acquire per-thread hyperslab operation generation.
*
* Return: Success: Non-NULL pointer to hyperslab operation generation for thread
* Failure: NULL
*
* Programmer: Quincey Koziol
* January 19, 2019
*
*-------------------------------------------------------------------------
*/
static uint64_t *
H5S__hyper_op_gen(void)
{
uint64_t *op_gen = NULL;
FUNC_ENTER_STATIC_NOERR
op_gen = (uint64_t *)H5TS_get_thread_local_value(H5TS_hyper_op_gen_key_g);
if(!op_gen) {
/* No associated value with current thread - create one */
#ifdef H5_HAVE_WIN_THREADS
/* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
op_gen = (uint64_t *)LocalAlloc(LPTR, sizeof(uint64_t));
#else
/* Use HDmalloc here since this has to match the HDfree in the
* destructor and we want to avoid the codestack there.
*/
op_gen = (uint64_t *)HDmalloc(sizeof(uint64_t));
#endif /* H5_HAVE_WIN_THREADS */
HDassert(op_gen);
/* Reset the thread-specific info */
/* (Use '1' to avoid clashing with '0' value in newly allocated structs) */
*op_gen = 1;
/* (It's not necessary to release this in this API, it is
* released by the "key destructor" set up in the H5TS
* routines. See calls to pthread_key_create() in H5TS.c -QAK)
*/
H5TS_set_thread_local_value(H5TS_hyper_op_gen_key_g, (void *)op_gen);
} /* end if */
/* Set return value */
FUNC_LEAVE_NOAPI(op_gen)
} /* end H5S__hyper_op_gen() */
#endif /* H5_HAVE_THREADSAFE */
/*-------------------------------------------------------------------------
* Function: H5S__hyper_get_op_gen
@ -591,14 +515,9 @@ H5S__hyper_op_gen(void)
uint64_t
H5S__hyper_get_op_gen(void)
{
uint64_t *op_gen = H5S_hyper_get_my_op_gen(); /* Get the pointer to the hyperslab operation generation, for this thread */
FUNC_ENTER_PACKAGE_NOERR
/* Check args */
HDassert(op_gen);
FUNC_LEAVE_NOAPI((*op_gen)++);
FUNC_LEAVE_NOAPI(H5S_hyper_op_gen_g++);
} /* end H5S__hyper_op_gen() */

@ -35,7 +35,6 @@ H5TS_once_t H5TS_first_init_g = PTHREAD_ONCE_INIT;
H5TS_key_t H5TS_errstk_key_g;
H5TS_key_t H5TS_funcstk_key_g;
H5TS_key_t H5TS_apictx_key_g;
H5TS_key_t H5TS_hyper_op_gen_key_g;
H5TS_key_t H5TS_cancel_key_g;
@ -114,9 +113,6 @@ H5TS_pthread_first_thread_init(void)
/* initialize key for thread-specific API contexts */
pthread_key_create(&H5TS_apictx_key_g, H5TS_key_destructor);
/* initialize key for thread-specific hyperslab operation generation */
pthread_key_create(&H5TS_hyper_op_gen_key_g, H5TS_key_destructor);
/* initialize key for thread cancellability mechanism */
pthread_key_create(&H5TS_cancel_key_g, H5TS_key_destructor);
}
@ -366,9 +362,6 @@ H5TS_win32_process_enter(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex)
if(TLS_OUT_OF_INDEXES == (H5TS_apictx_key_g = TlsAlloc()))
ret_value = FALSE;
if(TLS_OUT_OF_INDEXES == (H5TS_hyper_op_gen_key_g = TlsAlloc()))
ret_value = FALSE;
return ret_value;
} /* H5TS_win32_process_enter() */
#endif /* H5_HAVE_WIN_THREADS */
@ -438,7 +431,6 @@ H5TS_win32_process_exit(void)
TlsFree(H5TS_funcstk_key_g);
#endif /* H5_HAVE_CODESTACK */
TlsFree(H5TS_apictx_key_g);
TlsFree(H5TS_hyper_op_gen_key_g);
return;
} /* H5TS_win32_process_exit() */
@ -487,10 +479,6 @@ H5TS_win32_thread_exit(void)
if(lpvData)
LocalFree((HLOCAL)lpvData);
lpvData = TlsGetValue(H5TS_hyper_op_gen_key_g);
if(lpvData)
LocalFree((HLOCAL)lpvData);
return ret_value;
} /* H5TS_win32_thread_exit() */
#endif /* H5_HAVE_WIN_THREADS */

@ -110,7 +110,6 @@ extern H5TS_once_t H5TS_first_init_g;
extern H5TS_key_t H5TS_errstk_key_g;
extern H5TS_key_t H5TS_funcstk_key_g;
extern H5TS_key_t H5TS_apictx_key_g;
extern H5TS_key_t H5TS_hyper_op_gen_key_g;
#if defined c_plusplus || defined __cplusplus
extern "C"