mod_perl
view release on metacpan or search on metacpan
src/modules/perl/modperl_global.c view on Meta::CPAN
return next;
}
/*** TLS ***/
#if MP_THREADED
static apr_status_t modperl_tls_cleanup(void *data)
{
return apr_threadkey_private_delete((apr_threadkey_t *)data);
}
#endif
apr_status_t modperl_tls_create(apr_pool_t *p, modperl_tls_t **key)
{
#if MP_THREADED
apr_status_t status = apr_threadkey_private_create(key, NULL, p);
apr_pool_cleanup_register(p, (void *)*key,
modperl_tls_cleanup,
apr_pool_cleanup_null);
return status;
#else
*key = apr_pcalloc(p, sizeof(**key));
return APR_SUCCESS;
#endif
}
apr_status_t modperl_tls_get(modperl_tls_t *key, void **data)
{
#if MP_THREADED
if (!key) {
*data = NULL;
return APR_SUCCESS;
}
return apr_threadkey_private_get(data, key);
#else
*data = modperl_global_get((modperl_global_t *)key);
return APR_SUCCESS;
#endif
}
apr_status_t modperl_tls_set(modperl_tls_t *key, void *data)
{
#if MP_THREADED
return apr_threadkey_private_set(data, key);
#else
modperl_global_set((modperl_global_t *)key, data);
return APR_SUCCESS;
#endif
}
typedef struct {
modperl_tls_t *key;
void *data;
} modperl_tls_cleanup_data_t;
static apr_status_t modperl_tls_reset(void *data)
{
modperl_tls_cleanup_data_t *cdata =
(modperl_tls_cleanup_data_t *)data;
return modperl_tls_set(cdata->key, cdata->data);
}
void modperl_tls_reset_cleanup(apr_pool_t *p, modperl_tls_t *key,
void *data)
{
modperl_tls_cleanup_data_t *cdata =
(modperl_tls_cleanup_data_t *)apr_palloc(p, sizeof(*cdata));
cdata->key = key;
cdata->data = data;
apr_pool_cleanup_register(p, (void *)cdata,
modperl_tls_reset,
apr_pool_cleanup_null);
}
/* hopefully there wont be many of these either */
#define MP_TLS_IMPL(gname, type) \
\
static modperl_tls_t *MP_tls_##gname; \
\
apr_status_t \
modperl_tls_create_##gname(apr_pool_t *p) \
{ \
return modperl_tls_create(p, &MP_tls_##gname); \
} \
\
apr_status_t modperl_tls_get_##gname(type *data) \
{ \
void *ptr; \
apr_status_t status = \
modperl_tls_get(MP_tls_##gname, &ptr); \
*data = (type )ptr; \
return status; \
} \
\
apr_status_t modperl_tls_set_##gname(void *data) \
{ \
return modperl_tls_set(MP_tls_##gname, data); \
} \
\
void modperl_tls_reset_cleanup_##gname(apr_pool_t *p, \
type data) \
{ \
modperl_tls_reset_cleanup(p, MP_tls_##gname, \
(void *)data); \
}
MP_TLS_IMPL(request_rec, request_rec *)
/*
* Local Variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
( run in 0.579 second using v1.01-cache-2.11-cpan-39bf76dae61 )