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 2009/05/12 18:55:17 UTC
svn commit: r773977 - in /httpd/httpd/trunk: include/ap_slotmem.h
modules/mem/mod_plainmem.c modules/mem/mod_sharedmem.c server/slotmem.c
Author: jim
Date: Tue May 12 16:55:17 2009
New Revision: 773977
URL: http://svn.apache.org/viewvc?rev=773977&view=rev
Log:
If we have a mutex, we should use it whenever we create a
shared mem segment. This allows safe segment creation post
child-init
Modified:
httpd/httpd/trunk/include/ap_slotmem.h
httpd/httpd/trunk/modules/mem/mod_plainmem.c
httpd/httpd/trunk/modules/mem/mod_sharedmem.c
httpd/httpd/trunk/server/slotmem.c
Modified: httpd/httpd/trunk/include/ap_slotmem.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_slotmem.h?rev=773977&r1=773976&r2=773977&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_slotmem.h (original)
+++ httpd/httpd/trunk/include/ap_slotmem.h Tue May 12 16:55:17 2009
@@ -126,6 +126,18 @@
* @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 @@
* @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*/
Modified: httpd/httpd/trunk/modules/mem/mod_plainmem.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mem/mod_plainmem.c?rev=773977&r1=773976&r2=773977&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mem/mod_plainmem.c (original)
+++ httpd/httpd/trunk/modules/mem/mod_plainmem.c Tue May 12 16:55:17 2009
@@ -177,6 +177,16 @@
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 @@
&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,
Modified: httpd/httpd/trunk/modules/mem/mod_sharedmem.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mem/mod_sharedmem.c?rev=773977&r1=773976&r2=773977&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mem/mod_sharedmem.c (original)
+++ httpd/httpd/trunk/modules/mem/mod_sharedmem.c Tue May 12 16:55:17 2009
@@ -60,8 +60,18 @@
/* 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 @@
}
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 @@
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 @@
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 @@
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 @@
&slotmem_attach,
&slotmem_mem,
&slotmem_get,
- &slotmem_put
+ &slotmem_put,
+ &slotmem_num_slots,
+ &slotmem_slot_size
};
/* make the storage usuable from outside */
Modified: httpd/httpd/trunk/server/slotmem.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/slotmem.c?rev=773977&r1=773976&r2=773977&view=diff
==============================================================================
--- httpd/httpd/trunk/server/slotmem.c (original)
+++ httpd/httpd/trunk/server/slotmem.c Tue May 12 16:55:17 2009
@@ -76,6 +76,16 @@
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 */