You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2011/02/07 18:14:59 UTC
svn commit: r1068018 - in /httpd/httpd/trunk: include/ap_slotmem.h
modules/slotmem/mod_slotmem_plain.c modules/slotmem/mod_slotmem_shm.c
Author: jim
Date: Mon Feb 7 17:14:59 2011
New Revision: 1068018
URL: http://svn.apache.org/viewvc?rev=1068018&view=rev
Log:
Slotmem now provides for the number of "free" slots
available.
Modified:
httpd/httpd/trunk/include/ap_slotmem.h
httpd/httpd/trunk/modules/slotmem/mod_slotmem_plain.c
httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c
Modified: httpd/httpd/trunk/include/ap_slotmem.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_slotmem.h?rev=1068018&r1=1068017&r2=1068018&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_slotmem.h (original)
+++ httpd/httpd/trunk/include/ap_slotmem.h Mon Feb 7 17:14:59 2011
@@ -146,6 +146,14 @@ struct ap_slotmem_provider_t {
*/
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.
* @return size of slot
Modified: httpd/httpd/trunk/modules/slotmem/mod_slotmem_plain.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/slotmem/mod_slotmem_plain.c?rev=1068018&r1=1068017&r2=1068018&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/slotmem/mod_slotmem_plain.c (original)
+++ httpd/httpd/trunk/modules/slotmem/mod_slotmem_plain.c Mon Feb 7 17:14:59 2011
@@ -181,6 +181,7 @@ static apr_status_t slotmem_get(ap_slotm
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_slotm
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
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; i<desc.num; i++, inuse++) {
+ if (!*inuse)
+ counter++;
+ }
+ return counter;
+}
+
static apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
{
return slot->size;
@@ -271,6 +284,7 @@ static const ap_slotmem_provider_t stora
&slotmem_get,
&slotmem_put,
&slotmem_num_slots,
+ &slotmem_num_free_slots
&slotmem_slot_size,
&slotmem_grab,
&slotmem_release
Modified: httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c?rev=1068018&r1=1068017&r2=1068018&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c (original)
+++ httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c Mon Feb 7 17:14:59 2011
@@ -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, c
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_sl
}
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_sl
* 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; i<desc.num; i++, inuse++)
+ if (!*inuse)
+ counter++;
+ desc.free = counter;
+ }
}
/* For the chained slotmem stuff */
@@ -484,6 +492,7 @@ static apr_status_t slotmem_get(ap_slotm
if (ret != APR_SUCCESS) {
return ret;
}
+ *inuse = 1;
memcpy(dest, ptr, dest_len); /* bounds check? */
return APR_SUCCESS;
}
@@ -507,6 +516,7 @@ static apr_status_t slotmem_put(ap_slotm
if (ret != APR_SUCCESS) {
return ret;
}
+ *inuse=1;
memcpy(ptr, src, src_len); /* bounds check? */
return APR_SUCCESS;
}
@@ -516,15 +526,26 @@ static unsigned int slotmem_num_slots(ap
return slot->desc.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; i<slot->desc.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_slot
}
*inuse = 1;
*id = i;
+ slot->desc.free--;
return APR_SUCCESS;
}
@@ -564,6 +586,7 @@ static apr_status_t slotmem_release(ap_s
return APR_NOTFOUND;
}
inuse[id] = 0;
+ slot->desc.free++;
return APR_SUCCESS;
}
@@ -576,6 +599,7 @@ static const ap_slotmem_provider_t stora
&slotmem_get,
&slotmem_put,
&slotmem_num_slots,
+ &slotmem_num_free_slots,
&slotmem_slot_size,
&slotmem_grab,
&slotmem_release