diff options
author | Jim Jagielski <jim@apache.org> | 2011-02-07 20:25:14 +0100 |
---|---|---|
committer | Jim Jagielski <jim@apache.org> | 2011-02-07 20:25:14 +0100 |
commit | 8935856752fb0da735e74c33d9de7a6eb9b15988 (patch) | |
tree | fdedcf69c82e3a617d683a3d0a7505155480f651 /modules/slotmem | |
parent | Keep track of how many workers we've used so far... no need (diff) | |
download | apache2-8935856752fb0da735e74c33d9de7a6eb9b15988.tar.xz apache2-8935856752fb0da735e74c33d9de7a6eb9b15988.zip |
OK, use faster, shared version... makes sense to persist this
info since it is aligned with the actual data itself.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1068066 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/slotmem')
-rw-r--r-- | modules/slotmem/mod_slotmem_shm.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/modules/slotmem/mod_slotmem_shm.c b/modules/slotmem/mod_slotmem_shm.c index c09d749bdd..17b0311571 100644 --- a/modules/slotmem/mod_slotmem_shm.c +++ b/modules/slotmem/mod_slotmem_shm.c @@ -52,6 +52,7 @@ typedef struct { } sharedslotdesc_t; #define AP_SLOTMEM_OFFSET (APR_ALIGN_DEFAULT(sizeof(sharedslotdesc_t))) +#define AP_UNSIGNEDINT_OFFSET (APR_ALIGN_DEFAULT(sizeof(unsigned int))) struct ap_slotmem_instance_t { char *name; /* per segment name */ @@ -59,6 +60,8 @@ struct ap_slotmem_instance_t { void *base; /* data set start */ apr_pool_t *gpool; /* per segment global pool */ char *inuse; /* in-use flag table*/ + unsigned int *num_free; /* slot free count for this instance */ + void *persist; /* persist dataset start */ sharedslotdesc_t desc; /* per slot desc */ struct ap_slotmem_instance_t *next; /* location of next allocated segment */ }; @@ -66,7 +69,10 @@ struct ap_slotmem_instance_t { /* * Memory layout: - * sharedslotdesc_t | slots | isuse array + * sharedslotdesc_t | num_free | slots | isuse array | + * ^ ^ + * | . base + * . persist (also num_free) */ /* global pool and list of slotmem we are handling */ @@ -157,8 +163,8 @@ static void store_slotmem(ap_slotmem_instance_t *slotmem) return; } nbytes = (slotmem->desc.size * slotmem->desc.num) + - (slotmem->desc.num * sizeof(char)); - apr_file_write(fp, slotmem->base, &nbytes); + (slotmem->desc.num * sizeof(char)) + AP_UNSIGNEDINT_OFFSET; + apr_file_write(fp, slotmem->persist, &nbytes); apr_file_close(fp); } } @@ -255,7 +261,7 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, const char *fname; apr_shm_t *shm; apr_size_t basesize = (item_size * item_num); - apr_size_t size = AP_SLOTMEM_OFFSET + + apr_size_t size = AP_SLOTMEM_OFFSET + AP_UNSIGNEDINT_OFFSET + (item_num * sizeof(char)) + basesize; apr_status_t rv; @@ -307,7 +313,7 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, apr_shm_detach(shm); return APR_EINVAL; } - ptr = ptr + AP_SLOTMEM_OFFSET; + ptr += AP_SLOTMEM_OFFSET; } else { apr_size_t dsize = size - AP_SLOTMEM_OFFSET; @@ -335,7 +341,7 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, desc.num = item_num; desc.type = type; memcpy(ptr, &desc, sizeof(desc)); - ptr = ptr + AP_SLOTMEM_OFFSET; + ptr += AP_SLOTMEM_OFFSET; memset(ptr, 0, dsize); /* * TODO: Error check the below... What error makes @@ -351,6 +357,10 @@ static apr_status_t slotmem_create(ap_slotmem_instance_t **new, sizeof(ap_slotmem_instance_t)); res->name = apr_pstrdup(gpool, fname); res->shm = shm; + res->num_free = (unsigned int *)ptr; + *res->num_free = item_num; + res->persist = (void *)ptr; + ptr += AP_UNSIGNEDINT_OFFSET; res->base = (void *)ptr; res->desc = desc; res->gpool = gpool; @@ -421,13 +431,16 @@ static apr_status_t slotmem_attach(ap_slotmem_instance_t **new, /* Read the description of the slotmem */ ptr = (char *)apr_shm_baseaddr_get(shm); memcpy(&desc, ptr, sizeof(desc)); - ptr = ptr + AP_SLOTMEM_OFFSET; + ptr += AP_SLOTMEM_OFFSET; /* For the chained slotmem stuff */ res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t)); res->name = apr_pstrdup(gpool, fname); res->shm = shm; + res->num_free = (unsigned int *)ptr; + res->persist = (void *)ptr; + ptr += AP_UNSIGNEDINT_OFFSET; res->base = (void *)ptr; res->desc = desc; res->gpool = gpool; @@ -521,13 +534,17 @@ static unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot) static unsigned int slotmem_num_free_slots(ap_slotmem_instance_t *slot) { - unsigned int i, counter=0; - char *inuse = slot->inuse; - for (i=0; i<slot->desc.num; i++, inuse++) { - if (!*inuse) - counter++; + if (AP_SLOTMEM_IS_PREGRAB(slot)) + return *slot->num_free; + else { + unsigned int i, counter=0; + char *inuse = slot->inuse; + for (i=0; i<slot->desc.num; i++, inuse++) { + if (!*inuse) + counter++; + } + return counter; } - return counter; } static apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot) @@ -556,6 +573,7 @@ static apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id) } *inuse = 1; *id = i; + (*slot->num_free)--; return APR_SUCCESS; } @@ -574,6 +592,7 @@ static apr_status_t slotmem_release(ap_slotmem_instance_t *slot, return APR_NOTFOUND; } inuse[id] = 0; + (*slot->num_free)++; return APR_SUCCESS; } |