From cvs-return-31775-apmail-httpd-cvs-archive=httpd.apache.org@httpd.apache.org Mon Dec 29 16:25:30 2008 Return-Path: Delivered-To: apmail-httpd-cvs-archive@www.apache.org Received: (qmail 65503 invoked from network); 29 Dec 2008 16:25:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 29 Dec 2008 16:25:30 -0000 Received: (qmail 67042 invoked by uid 500); 29 Dec 2008 16:25:30 -0000 Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 66824 invoked by uid 500); 29 Dec 2008 16:25:29 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 66815 invoked by uid 99); 29 Dec 2008 16:25:29 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Dec 2008 08:25:29 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Dec 2008 16:25:26 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D5922238889E; Mon, 29 Dec 2008 08:25:04 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r729929 - in /httpd/httpd/trunk/modules/mem: config5.m4 mod_sharedmem.c modules.mk sharedmem_util.c sharedmem_util.h Date: Mon, 29 Dec 2008 16:25:04 -0000 To: cvs@httpd.apache.org From: jim@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081229162504.D5922238889E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jim Date: Mon Dec 29 08:25:04 2008 New Revision: 729929 URL: http://svn.apache.org/viewvc?rev=729929&view=rev Log: No need to sep out all the shared mem stuff... clean up Removed: httpd/httpd/trunk/modules/mem/sharedmem_util.c httpd/httpd/trunk/modules/mem/sharedmem_util.h Modified: httpd/httpd/trunk/modules/mem/config5.m4 httpd/httpd/trunk/modules/mem/mod_sharedmem.c httpd/httpd/trunk/modules/mem/modules.mk Modified: httpd/httpd/trunk/modules/mem/config5.m4 URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mem/config5.m4?rev=729929&r1=729928&r2=729929&view=diff ============================================================================== --- httpd/httpd/trunk/modules/mem/config5.m4 (original) +++ httpd/httpd/trunk/modules/mem/config5.m4 Mon Dec 29 08:25:04 2008 @@ -4,7 +4,7 @@ APACHE_MODPATH_INIT(mem) -sharedmem_objs="mod_sharedmem.lo sharedmem_util.lo" +sharedmem_objs="mod_sharedmem.lo" APACHE_MODULE(sharedmem, memslot provider that uses shared memory, $sharedmem_objs, , most) APACHE_MODULE(plainmem, memslot provider that uses plain memory, , , no) Modified: httpd/httpd/trunk/modules/mem/mod_sharedmem.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mem/mod_sharedmem.c?rev=729929&r1=729928&r2=729929&view=diff ============================================================================== --- httpd/httpd/trunk/modules/mem/mod_sharedmem.c (original) +++ httpd/httpd/trunk/modules/mem/mod_sharedmem.c Mon Dec 29 08:25:04 2008 @@ -19,7 +19,367 @@ */ #include "slotmem.h" -#include "sharedmem_util.h" + +/* The description of the slots to reuse the slotmem */ +struct sharedslotdesc { + apr_size_t item_size; + int item_num; +}; + +struct ap_slotmem { + char *name; + apr_shm_t *shm; + void *base; + apr_size_t size; + int num; + apr_pool_t *globalpool; + apr_global_mutex_t *sharedmem_mutex; + struct ap_slotmem *next; +}; + +/* global pool and list of slotmem we are handling */ +static struct ap_slotmem *globallistmem = NULL; +static apr_pool_t *globalpool = NULL; +static apr_global_mutex_t *sharedmem_mutex; +static const char *mutex_fname; + +/* + * Persiste the slotmem in a file + * slotmem name and file name. + * anonymous : $server_root/logs/anonymous.slotmem + * :module.c : $server_root/logs/module.c.slotmem + * abs_name : $abs_name.slotmem + * + */ +static const char *store_filename(apr_pool_t *pool, const char *slotmemname) +{ + const char *storename; + const char *fname; + if (strcmp(slotmemname, "anonymous") == 0) + fname = ap_server_root_relative(pool, "logs/anonymous"); + else if (slotmemname[0] == ':') { + const char *tmpname; + tmpname = apr_pstrcat(pool, "logs/", &slotmemname[1], NULL); + fname = ap_server_root_relative(pool, tmpname); + } + else { + fname = slotmemname; + } + storename = apr_pstrcat(pool, fname, ".slotmem", NULL); + return storename; +} +static void store_slotmem(ap_slotmem_t *slotmem) +{ + apr_file_t *fp; + apr_status_t rv; + apr_size_t nbytes; + const char *storename; + + storename = store_filename(slotmem->globalpool, slotmem->name); + + rv = apr_file_open(&fp, storename, APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, slotmem->globalpool); + if (APR_STATUS_IS_EEXIST(rv)) { + apr_file_remove(storename, slotmem->globalpool); + rv = apr_file_open(&fp, storename, APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, slotmem->globalpool); + } + if (rv != APR_SUCCESS) { + return; + } + nbytes = slotmem->size * slotmem->num; + apr_file_write(fp, slotmem->base, &nbytes); + apr_file_close(fp); +} + +static void restore_slotmem(void *ptr, const char *name, apr_size_t item_size, int item_num, apr_pool_t *pool) +{ + const char *storename; + apr_file_t *fp; + apr_size_t nbytes = item_size * item_num; + apr_status_t rv; + + storename = store_filename(pool, name); + rv = apr_file_open(&fp, storename, APR_READ | APR_WRITE, APR_OS_DEFAULT, pool); + if (rv == APR_SUCCESS) { + apr_finfo_t fi; + if (apr_file_info_get(&fi, APR_FINFO_SIZE, fp) == APR_SUCCESS) { + if (fi.size == nbytes) { + apr_file_read(fp, ptr, &nbytes); + } + else { + apr_file_close(fp); + apr_file_remove(storename, pool); + return; + } + } + apr_file_close(fp); + } +} + +static apr_status_t cleanup_slotmem(void *param) +{ + ap_slotmem_t **mem = param; + apr_status_t rv; + apr_pool_t *pool = NULL; + + if (*mem) { + ap_slotmem_t *next = *mem; + pool = next->globalpool; + while (next) { + store_slotmem(next); + rv = apr_shm_destroy(next->shm); + next = next->next; + } + apr_pool_destroy(pool); + } + return APR_SUCCESS; +} + +static apr_status_t ap_slotmem_do(ap_slotmem_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool) +{ + int i; + void *ptr; + + if (!mem) { + return APR_ENOSHMAVAIL; + } + + ptr = mem->base; + for (i = 0; i < mem->num; i++) { + ptr = ptr + mem->size; + func((void *) ptr, data, pool); + } + return APR_SUCCESS; +} +static apr_status_t ap_slotmem_create(ap_slotmem_t **new, const char *name, apr_size_t item_size, int item_num, apr_pool_t *pool) +{ +/* void *slotmem = NULL; */ + void *ptr; + struct sharedslotdesc desc; + ap_slotmem_t *res; + ap_slotmem_t *next = globallistmem; + const char *fname; + apr_status_t rv; + + if (globalpool == NULL) + return APR_ENOSHMAVAIL; + if (name) { + if (name[0] == ':') { + fname = name; + } + else { + fname = ap_server_root_relative(pool, name); + } + + /* first try to attach to existing slotmem */ + if (next) { + for (;;) { + if (strcmp(next->name, fname) == 0) { + /* we already have it */ + *new = next; + return APR_SUCCESS; + } + if (!next->next) { + break; + } + next = next->next; + } + } + } + else { + fname = "anonymous"; + } + + /* first try to attach to existing shared memory */ + res = (ap_slotmem_t *) apr_pcalloc(globalpool, sizeof(ap_slotmem_t)); + if (name && name[0] != ':') { + rv = apr_shm_attach(&res->shm, fname, globalpool); + } + else { + rv = APR_EINVAL; + } + if (rv == APR_SUCCESS) { + /* check size */ + if (apr_shm_size_get(res->shm) != item_size * item_num + sizeof(struct sharedslotdesc)) { + apr_shm_detach(res->shm); + res->shm = NULL; + return APR_EINVAL; + } + ptr = apr_shm_baseaddr_get(res->shm); + memcpy(&desc, ptr, sizeof(desc)); + if (desc.item_size != item_size || desc.item_num != item_num) { + apr_shm_detach(res->shm); + res->shm = NULL; + return APR_EINVAL; + } + ptr = ptr + sizeof(desc); + } + else { + if (name && name[0] != ':') { + apr_shm_remove(fname, globalpool); + rv = apr_shm_create(&res->shm, item_size * item_num + sizeof(struct sharedslotdesc), fname, globalpool); + } + else { + rv = apr_shm_create(&res->shm, item_size * item_num + sizeof(struct sharedslotdesc), NULL, globalpool); + } + if (rv != APR_SUCCESS) { + return rv; + } + ptr = apr_shm_baseaddr_get(res->shm); + desc.item_size = item_size; + desc.item_num = item_num; + memcpy(ptr, &desc, sizeof(desc)); + ptr = ptr + sizeof(desc); + memset(ptr, 0, item_size * item_num); + restore_slotmem(ptr, fname, item_size, item_num, pool); + } + + /* For the chained slotmem stuff */ + res->name = apr_pstrdup(globalpool, fname); + res->base = ptr; + res->size = item_size; + res->num = item_num; + res->globalpool = globalpool; + res->sharedmem_mutex = sharedmem_mutex; + res->next = NULL; + if (globallistmem == NULL) { + globallistmem = res; + } + else { + next->next = res; + } + + *new = res; + return APR_SUCCESS; +} +static apr_status_t ap_slotmem_attach(ap_slotmem_t **new, const char *name, apr_size_t *item_size, int *item_num, apr_pool_t *pool) +{ +/* void *slotmem = NULL; */ + void *ptr; + ap_slotmem_t *res; + ap_slotmem_t *next = globallistmem; + struct sharedslotdesc desc; + const char *fname; + apr_status_t rv; + + if (globalpool == NULL) { + return APR_ENOSHMAVAIL; + } + if (name) { + if (name[0] == ':') { + fname = name; + } + else { + fname = ap_server_root_relative(pool, name); + } + } + else { + return APR_ENOSHMAVAIL; + } + + /* first try to attach to existing slotmem */ + if (next) { + for (;;) { + if (strcmp(next->name, fname) == 0) { + /* we already have it */ + *new = next; + *item_size = next->size; + *item_num = next->num; + return APR_SUCCESS; + } + if (!next->next) + break; + next = next->next; + } + } + + /* first try to attach to existing shared memory */ + res = (ap_slotmem_t *) apr_pcalloc(globalpool, sizeof(ap_slotmem_t)); + rv = apr_shm_attach(&res->shm, fname, globalpool); + if (rv != APR_SUCCESS) { + return rv; + } + + /* Read the description of the slotmem */ + ptr = apr_shm_baseaddr_get(res->shm); + memcpy(&desc, ptr, sizeof(desc)); + ptr = ptr + sizeof(desc); + + /* For the chained slotmem stuff */ + res->name = apr_pstrdup(globalpool, fname); + res->base = ptr; + res->size = desc.item_size; + res->num = desc.item_num; + res->globalpool = globalpool; + res->sharedmem_mutex = sharedmem_mutex; + res->next = NULL; + if (globallistmem == NULL) { + globallistmem = res; + } + else { + next->next = res; + } + + *new = res; + *item_size = desc.item_size; + *item_num = desc.item_num; + return APR_SUCCESS; +} +static apr_status_t ap_slotmem_mem(ap_slotmem_t *slot, int id, void **mem) +{ + + void *ptr; + + if (!slot) { + return APR_ENOSHMAVAIL; + } + if (id < 0 || id > slot->num) { + return APR_ENOSHMAVAIL; + } + + ptr = slot->base + slot->size * id; + if (!ptr) { + return APR_ENOSHMAVAIL; + } + *mem = ptr; + return APR_SUCCESS; +} + +static apr_status_t ap_slotmem_lock(ap_slotmem_t *slot) +{ + return (apr_global_mutex_lock(slot->sharedmem_mutex)); +} + +static apr_status_t ap_slotmem_unlock(ap_slotmem_t *slot) +{ + return (apr_global_mutex_unlock(slot->sharedmem_mutex)); +} + +static const slotmem_storage_method storage = { + &ap_slotmem_do, + &ap_slotmem_create, + &ap_slotmem_attach, + &ap_slotmem_mem, + &ap_slotmem_lock, + &ap_slotmem_unlock +}; + +/* make the storage usuable from outside */ +static const slotmem_storage_method *sharedmem_getstorage(void) +{ + return (&storage); +} + +/* initialise the global pool */ +static void sharedmem_initglobalpool(apr_pool_t *p) +{ + globalpool = p; +} + +/* Add the pool_clean routine */ +static void sharedmem_initialize_cleanup(apr_pool_t *p) +{ + apr_pool_cleanup_register(p, &globallistmem, cleanup_slotmem, apr_pool_cleanup_null); +} /* * Create the shared mem mutex and Modified: httpd/httpd/trunk/modules/mem/modules.mk URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mem/modules.mk?rev=729929&r1=729928&r2=729929&view=diff ============================================================================== --- httpd/httpd/trunk/modules/mem/modules.mk (original) +++ httpd/httpd/trunk/modules/mem/modules.mk Mon Dec 29 08:25:04 2008 @@ -1,5 +1,5 @@ -libmod_sharedmem.la: mod_sharedmem.lo sharedmem_util.lo - $(MOD_LINK) mod_sharedmem.lo sharedmem_util.lo $(MOD_SHAREDMEM_LDADD) +libmod_sharedmem.la: mod_sharedmem.lo + $(MOD_LINK) mod_sharedmem.lo $(MOD_SHAREDMEM_LDADD) DISTCLEAN_TARGETS = modules.mk static = libmod_sharedmem.la shared =