From 68978327b2f1817040809dee6342da2734ceafdf Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Mon, 7 Feb 2011 17:14:59 +0000 Subject: [PATCH] Slotmem now provides for the number of "free" slots available. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1068018 13f79535-47bb-0310-9956-ffa450edef68 --- include/ap_slotmem.h | 8 ++++++ modules/slotmem/mod_slotmem_plain.c | 14 +++++++++++ modules/slotmem/mod_slotmem_shm.c | 38 +++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/include/ap_slotmem.h b/include/ap_slotmem.h index 75ba8264b4..9f7db23a5c 100644 --- a/include/ap_slotmem.h +++ b/include/ap_slotmem.h @@ -145,6 +145,14 @@ struct ap_slotmem_provider_t { * @return number of slots */ unsigned int (* num_slots)(ap_slotmem_instance_t *s); + /** + * return number of free (not used) slots allocated for this entry. + * Valid for slots which are AP_SLOTMEM_TYPE_PREGRAB as well as + * any which use get/release. + * @param s ap_slotmem_instance_t to use. + * @return number of slots + */ + unsigned int (* num_free_slots)(ap_slotmem_instance_t *s); /** * return slot size allocated for this entry. * @param s ap_slotmem_instance_t to use. diff --git a/modules/slotmem/mod_slotmem_plain.c b/modules/slotmem/mod_slotmem_plain.c index ff00821444..71cdd654b9 100644 --- a/modules/slotmem/mod_slotmem_plain.c +++ b/modules/slotmem/mod_slotmem_plain.c @@ -181,6 +181,7 @@ static apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, un if (ret != APR_SUCCESS) { return ret; } + *inuse=1; memcpy(dest, ptr, dest_len); /* bounds check? */ return APR_SUCCESS; } @@ -203,6 +204,7 @@ static apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, un if (ret != APR_SUCCESS) { return ret; } + *inuse=1; memcpy(ptr, src, src_len); /* bounds check? */ return APR_SUCCESS; } @@ -212,6 +214,17 @@ static unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot) return slot->num; } +static unsigned int slotmem_num_free_slots(ap_slotmem_instance_t *slot) +{ + unsigned int i, counter=0; + char *inuse = slot->inuse; + for (i=0; isize; @@ -271,6 +284,7 @@ static const ap_slotmem_provider_t storage = { &slotmem_get, &slotmem_put, &slotmem_num_slots, + &slotmem_num_free_slots &slotmem_slot_size, &slotmem_grab, &slotmem_release diff --git a/modules/slotmem/mod_slotmem_shm.c b/modules/slotmem/mod_slotmem_shm.c index d65c414a4e..84c57bb86a 100644 --- a/modules/slotmem/mod_slotmem_shm.c +++ b/modules/slotmem/mod_slotmem_shm.c @@ -48,6 +48,7 @@ typedef struct { apr_size_t size; /* size of each memory slot */ unsigned int num; /* number of mem slots */ + unsigned int free; /* number of free mem slots */ ap_slotmem_type_t type; /* type-specific flags */ } sharedslotdesc_t; @@ -173,7 +174,7 @@ static void restore_slotmem(void *ptr, const char *name, apr_size_t size, apr_status_t rv; storename = store_filename(pool, name); - + if (storename) { rv = apr_file_open(&fp, storename, APR_READ | APR_WRITE, APR_OS_DEFAULT, pool); @@ -332,7 +333,7 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, } ptr = (char *)apr_shm_baseaddr_get(shm); desc.size = item_size; - desc.num = item_num; + desc.free = desc.num = item_num; desc.type = type; memcpy(ptr, &desc, sizeof(desc)); ptr = ptr + AP_SLOTMEM_OFFSET; @@ -341,8 +342,15 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, * TODO: Error check the below... What error makes * sense if the restore fails? Any? */ - if (type & AP_SLOTMEM_TYPE_PERSIST) + if (type & AP_SLOTMEM_TYPE_PERSIST) { + unsigned int i, counter=0; + char *inuse = ptr + basesize; restore_slotmem(ptr, fname, dsize, pool); + for (i=0; idesc.num; } +static unsigned int slotmem_num_free_slots(ap_slotmem_instance_t *slot) +{ + if (AP_SLOTMEM_IS_PREGRAB(slot)) + return slot->desc.free; + else { + unsigned int i, counter=0; + char *inuse = slot->inuse; + for (i=0; idesc.num; i++, inuse++) { + if (!*inuse) + counter++; + } + return counter; + } +} + static apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot) { return slot->desc.size; } -/* - * XXXX: if !AP_SLOTMEM_IS_PREGRAB, then still worry about - * inuse for grab and return? - */ static apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id) { unsigned int i; @@ -546,6 +567,7 @@ static apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id) } *inuse = 1; *id = i; + slot->desc.free--; return APR_SUCCESS; } @@ -564,6 +586,7 @@ static apr_status_t slotmem_release(ap_slotmem_instance_t *slot, return APR_NOTFOUND; } inuse[id] = 0; + slot->desc.free++; return APR_SUCCESS; } @@ -576,6 +599,7 @@ static const ap_slotmem_provider_t storage = { &slotmem_get, &slotmem_put, &slotmem_num_slots, + &slotmem_num_free_slots, &slotmem_slot_size, &slotmem_grab, &slotmem_release -- 2.40.0