From ba4e26eaa8b0dd5a874e08bc97f3f195c2b60672 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Tue, 12 May 2009 16:55:17 +0000 Subject: [PATCH] If we have a mutex, we should use it whenever we create a shared mem segment. This allows safe segment creation post child-init git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@773977 13f79535-47bb-0310-9956-ffa450edef68 --- include/ap_slotmem.h | 26 ++++++++++++++++++++++++++ modules/mem/mod_plainmem.c | 14 +++++++++++++- modules/mem/mod_sharedmem.c | 32 +++++++++++++++++++++++++++++--- server/slotmem.c | 10 ++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/include/ap_slotmem.h b/include/ap_slotmem.h index cdd2677ee5..e59ef72096 100644 --- a/include/ap_slotmem.h +++ b/include/ap_slotmem.h @@ -126,6 +126,18 @@ struct ap_slotmem_storage_method { * @return APR_SUCCESS if all went well */ apr_status_t (* slotmem_put)(ap_slotmem_t *slot, unsigned int item_id, unsigned char *src, apr_size_t src_len); + /** + * return number of slots allocated for this entry. + * @param s ap_slotmem_t to use. + * @return number of slots + */ + unsigned int (* slotmem_num_slots)(ap_slotmem_t *s); + /** + * return slot size allocated for this entry. + * @param s ap_slotmem_t to use. + * @return size of slot + */ + apr_size_t (* slotmem_slot_size)(ap_slotmem_t *s); }; typedef struct ap_slotmem_storage_method ap_slotmem_storage_method; @@ -214,5 +226,19 @@ AP_DECLARE(apr_status_t) ap_slotmem_get(ap_slotmem_storage_method *sm, ap_slotme * @return APR_SUCCESS if all went well */ AP_DECLARE(apr_status_t) ap_slotmem_put(ap_slotmem_storage_method *sm, ap_slotmem_t *s, unsigned int item_id, unsigned char *src, apr_size_t src_len); +/** + * return number of slots allocated for this entry. + * @param sm ap_slotmem_storage_method provider obtained + * @param s ap_slotmem_t to use. + * @return number of slots + */ +AP_DECLARE(unsigned int) ap_slotmem_num_slots(ap_slotmem_storage_method *sm, ap_slotmem_t *s); +/** + * return slot size allocated for this entry. + * @param sm ap_slotmem_storage_method provider obtained + * @param s ap_slotmem_t to use. + * @return size of slot + */ +AP_DECLARE(apr_size_t) ap_slotmem_slot_size(ap_slotmem_storage_method *sm, ap_slotmem_t *s); #endif /*SLOTMEM_H*/ diff --git a/modules/mem/mod_plainmem.c b/modules/mem/mod_plainmem.c index 7702b59a8d..c087908169 100644 --- a/modules/mem/mod_plainmem.c +++ b/modules/mem/mod_plainmem.c @@ -177,6 +177,16 @@ static apr_status_t slotmem_put(ap_slotmem_t *slot, unsigned int id, unsigned ch return APR_SUCCESS; } +static unsigned int slotmem_num_slots(ap_slotmem_t *slot) +{ + return slot->num; +} + +static apr_size_t slotmem_slot_size(ap_slotmem_t *slot) +{ + return slot->size; +} + static const ap_slotmem_storage_method storage = { "plainmem", &slotmem_do, @@ -184,7 +194,9 @@ static const ap_slotmem_storage_method storage = { &slotmem_attach, &slotmem_mem, &slotmem_get, - &slotmem_put + &slotmem_put, + &slotmem_num_slots, + &slotmem_slot_size }; static int pre_config(apr_pool_t *p, apr_pool_t *plog, diff --git a/modules/mem/mod_sharedmem.c b/modules/mem/mod_sharedmem.c index f0d7bae88e..fe27b54b81 100644 --- a/modules/mem/mod_sharedmem.c +++ b/modules/mem/mod_sharedmem.c @@ -60,8 +60,18 @@ struct sharedslotdesc { /* global pool and list of slotmem we are handling */ static struct ap_slotmem_t *globallistmem = NULL; static apr_pool_t *gpool = NULL; -static apr_global_mutex_t *smutex; -static const char *mutex_fname; +static apr_global_mutex_t *smutex = NULL; +static const char *mutex_fname = NULL; + +#define SLOTMEM_LOCK(s) do { \ + if (s) \ + apr_global_mutex_lock(s); \ +} while (0) + +#define SLOTMEM_UNLOCK(s) do { \ + if (s) \ + apr_global_mutex_unlock(s); \ +} while (0) /* apr:shmem/unix/shm.c */ static apr_status_t unixd_set_shm_perms(const char *fname) @@ -201,10 +211,12 @@ static apr_status_t slotmem_do(ap_slotmem_t *mem, ap_slotmem_callback_fn_t *func } ptr = mem->base; + SLOTMEM_LOCK(mem->smutex); for (i = 0; i < mem->num; i++) { ptr = ptr + mem->size; func((void *) ptr, data, pool); } + SLOTMEM_UNLOCK(mem->smutex); return APR_SUCCESS; } @@ -270,6 +282,7 @@ static apr_status_t slotmem_create(ap_slotmem_t **new, const char *name, apr_siz ptr = ptr + sizeof(desc); } else { + SLOTMEM_LOCK(smutex); if (name && name[0] != ':') { apr_shm_remove(fname, gpool); rv = apr_shm_create(&shm, item_size * item_num + sizeof(struct sharedslotdesc), fname, gpool); @@ -277,6 +290,7 @@ static apr_status_t slotmem_create(ap_slotmem_t **new, const char *name, apr_siz else { rv = apr_shm_create(&shm, item_size * item_num + sizeof(struct sharedslotdesc), NULL, gpool); } + SLOTMEM_UNLOCK(smutex); if (rv != APR_SUCCESS) { return rv; } @@ -444,6 +458,16 @@ static apr_status_t slotmem_put(ap_slotmem_t *slot, unsigned int id, unsigned ch return APR_SUCCESS; } +static unsigned int slotmem_num_slots(ap_slotmem_t *slot) +{ + return slot->num; +} + +static apr_size_t slotmem_slot_size(ap_slotmem_t *slot) +{ + return slot->size; +} + static const ap_slotmem_storage_method storage = { "sharedmem", &slotmem_do, @@ -451,7 +475,9 @@ static const ap_slotmem_storage_method storage = { &slotmem_attach, &slotmem_mem, &slotmem_get, - &slotmem_put + &slotmem_put, + &slotmem_num_slots, + &slotmem_slot_size }; /* make the storage usuable from outside */ diff --git a/server/slotmem.c b/server/slotmem.c index f3fc561d42..2517e2f934 100644 --- a/server/slotmem.c +++ b/server/slotmem.c @@ -76,6 +76,16 @@ AP_DECLARE(apr_status_t) ap_slotmem_put(ap_slotmem_storage_method *sm, ap_slotme return (sm->slotmem_put(s, item_id, src, src_len)); } +AP_DECLARE(unsigned int) ap_slotmem_num_slots(ap_slotmem_storage_method *sm, ap_slotmem_t *s) +{ + return (sm->slotmem_num_slots(s)); +} + +AP_DECLARE(apr_size_t) ap_slotmem_slot_size(ap_slotmem_storage_method *sm, ap_slotmem_t *s) +{ + return (sm->slotmem_slot_size(s)); +} + module AP_MODULE_DECLARE_DATA slotmem_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-directory config structure */ -- 2.40.0