Author: jfrederic.clere(a)jboss.com
Date: 2008-07-11 11:00:44 -0400 (Fri, 11 Jul 2008)
New Revision: 1748
Modified:
trunk/mod_cluster/native/mod_slotmem/mod_sharedmem.c
trunk/mod_cluster/native/mod_slotmem/sharedmem_util.c
Log:
Add a lock for insert/remove.
Modified: trunk/mod_cluster/native/mod_slotmem/mod_sharedmem.c
===================================================================
--- trunk/mod_cluster/native/mod_slotmem/mod_sharedmem.c 2008-07-11 13:00:50 UTC (rev
1747)
+++ trunk/mod_cluster/native/mod_slotmem/mod_sharedmem.c 2008-07-11 15:00:44 UTC (rev
1748)
@@ -79,12 +79,22 @@
return OK;
}
+/*
+ * Create the mutex of the insert/remove logic
+ */
+static void child_init(apr_pool_t *p, server_rec *s)
+{
+ sharedmem_initialize_child(p);
+}
+
static void ap_sharedmem_register_hook(apr_pool_t *p)
{
const slotmem_storage_method *storage = mem_getstorage(NULL, "");
ap_register_provider(p, SLOTMEM_STORAGE, "shared", "0",
storage);
ap_hook_post_config(initialize_cleanup, NULL, NULL, APR_HOOK_LAST);
ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
+
+ ap_hook_child_init(child_init, NULL, NULL, APR_HOOK_MIDDLE);
}
module AP_MODULE_DECLARE_DATA sharedmem_module = {
Modified: trunk/mod_cluster/native/mod_slotmem/sharedmem_util.c
===================================================================
--- trunk/mod_cluster/native/mod_slotmem/sharedmem_util.c 2008-07-11 13:00:50 UTC (rev
1747)
+++ trunk/mod_cluster/native/mod_slotmem/sharedmem_util.c 2008-07-11 15:00:44 UTC (rev
1748)
@@ -77,6 +77,7 @@
/* global pool and list of slotmem we are handling */
static struct ap_slotmem *globallistmem = NULL;
static apr_pool_t *globalpool = NULL;
+static apr_thread_mutex_t *globalmutex_lock = NULL;
apr_status_t unixd_set_shm_perms(const char *fname)
{
@@ -436,12 +437,22 @@
*mem = ptr;
return APR_SUCCESS;
}
+
+/* Lock the file lock (between processes) and then the mutex */
static apr_status_t ap_slotmem_lock(ap_slotmem_t *s)
{
- return(apr_file_lock(s->global_lock, APR_FLOCK_EXCLUSIVE));
+ apr_status_t rv;
+ rv = apr_file_lock(s->global_lock, APR_FLOCK_EXCLUSIVE);
+ if (rv != APR_SUCCESS)
+ return rv;
+ rv = apr_thread_mutex_lock(globalmutex_lock);
+ if (rv != APR_SUCCESS)
+ apr_file_unlock(s->global_lock);
+ return rv;
}
static apr_status_t ap_slotmem_unlock(ap_slotmem_t *s)
{
+ apr_thread_mutex_unlock(globalmutex_lock);
return(apr_file_unlock(s->global_lock));
}
static apr_status_t ap_slotmem_alloc(ap_slotmem_t *score, int *item_id, void**mem)
@@ -530,3 +541,8 @@
{
apr_pool_cleanup_register(p, &globallistmem, cleanup_slotmem,
apr_pool_cleanup_null);
}
+/* Create the mutex for insert/remove logic */
+apr_status_t sharedmem_initialize_child(apr_pool_t *p)
+{
+ return (apr_thread_mutex_create(&globalmutex_lock, APR_THREAD_MUTEX_DEFAULT,
globalpool));
+}
Show replies by date