]> granicus.if.org Git - apache/commitdiff
If we have a mutex, we should use it whenever we create a
authorJim Jagielski <jim@apache.org>
Tue, 12 May 2009 16:55:17 +0000 (16:55 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 12 May 2009 16:55:17 +0000 (16:55 +0000)
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
modules/mem/mod_plainmem.c
modules/mem/mod_sharedmem.c
server/slotmem.c

index cdd2677ee59d7b6e00dbe835857bb787ae0b0efd..e59ef72096c8c970229cd4204a379f3bc410736e 100644 (file)
@@ -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*/
index 7702b59a8d68522cfafe44b09a0380e3899f3468..c087908169ddb5e5990271f48b2b3257836fa71c 100644 (file)
@@ -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,
index f0d7bae88e6bf5ac4c86ef5017f19ea3019090be..fe27b54b81e6a19f504c409d9ba95847b3fac674 100644 (file)
@@ -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 */
index f3fc561d42efb06e173e3013f3aa4932e0299f0a..2517e2f934851ff56664458ee37bb28cf8cf320f 100644 (file)
@@ -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 */