Some comments inline. Regards
RĂ¼diger On 19.07.2006 14:18, [EMAIL PROTECTED] wrote: > Author: jfclere > Date: Wed Jul 19 05:18:10 2006 > New Revision: 423444 > --- httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_plainmem.c > (added) > +++ httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_plainmem.c > Wed Jul 19 05:18:10 2006 > @@ -0,0 +1,145 @@ > +/* Copyright 1999-2006 The Apache Software Foundation or its licensors, as > + * applicable. > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. Please use the latest header approved by the board in all files. > +} > +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; > + ap_slotmem_t *res; > + ap_slotmem_t *next = globallistmem; > + char *fname; > + apr_status_t rv; > + > + 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) Shouldn't this be (!next->next)? > + break; > + next = next->next; > + } > + } > + > + /* create the memory using the globalpool */ > + res = (ap_slotmem_t *) apr_pcalloc(globalpool, sizeof(ap_slotmem_t)); > + res->base = apr_pcalloc(globalpool, item_size * item_num); > + if (!res->base) > + return APR_ENOSHMAVAIL; > + memset(res->base, 0, item_size * item_num); Is this needed? You did a calloc. > + > + /* For the chained slotmem stuff */ > + res->name = apr_pstrdup(globalpool, fname); > + res->size = item_size; > + res->num = item_num; > + res->next = NULL; > + if (globallistmem==NULL) > + globallistmem = res; > + else > + next->next = res; > + > + *new = res; > + return APR_SUCCESS; > +} > +static apr_status_t ap_slotmem_mem(ap_slotmem_t *score, int id, void**mem) > +{ > + > + void *ptr = score->base + score->size * id; > + > + if (!score) > + return APR_ENOSHMAVAIL; Shouldn't this check happen before assigning a value to ptr? > > Added: > httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_scoreboard.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_scoreboard.c?rev=423444&view=auto > ============================================================================== > --- httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_scoreboard.c > (added) > +++ httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_scoreboard.c > Wed Jul 19 05:18:10 2006 > +static apr_status_t ap_slotmem_mem(ap_slotmem_t *score, int id, void**mem) > +{ > + void *ptr; > + if (!score) > + return APR_ENOSHMAVAIL; > + > +#if PROXY_HAS_SCOREBOARD > + if (ap_scoreboard_image) > + ptr = (void *)ap_get_scoreboard_lb(id); > +#else > + return APR_ENOSHMAVAIL; > +#endif > + > + if (!ptr) > + return APR_ENOSHMAVAIL; > + *mem = ptr; > + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, > + "ap_slotmem_mem: score %d", score); Shouldn't this be APLOG_DEBUG? > > Added: httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_sharedmem.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_sharedmem.c?rev=423444&view=auto > ============================================================================== > --- httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_sharedmem.c > (added) > +++ httpd/httpd/branches/httpd-proxy-scoreboard/modules/mem/mod_sharedmem.c > Wed Jul 19 05:18:10 2006 > > +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; > + ap_slotmem_t *res; > + ap_slotmem_t *next = globallistmem; > + char *fname; > + apr_status_t rv; > + > + 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) Shouldn't this be (!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) { > + /* check size */ > + if (apr_shm_size_get(res->shm) != item_size * item_num) { > + apr_shm_detach(res->shm); > + res->shm = NULL; > + return APR_EINVAL; > + } > + } else { > + rv = apr_shm_create(&res->shm, item_size * item_num, fname, > globalpool); > + if (rv != APR_SUCCESS) > + return rv; > + memset(apr_shm_baseaddr_get(res->shm), 0, item_size * item_num); > + } > + > + /* For the chained slotmem stuff */ > + res->name = apr_pstrdup(globalpool, fname); > + res->base = apr_shm_baseaddr_get(res->shm); > + res->size = item_size; > + res->num = item_num; > + res->next = NULL; > + if (globallistmem==NULL) > + globallistmem = res; > + else > + next->next = res; > + > + *new = res; > + return APR_SUCCESS; > +} > +static apr_status_t ap_slotmem_mem(ap_slotmem_t *score, int id, void**mem) > +{ > + > + void *ptr = score->base + score->size * id; > + > + if (!score) > + return APR_ENOSHMAVAIL; Shouldn't this check happen before assigning a value to ptr? > + if (id<0 || id>score->num) > + return APR_ENOSHMAVAIL; > + if (apr_shm_size_get(score->shm) != score->size * score->num) > + return APR_ENOSHMAVAIL; Is this check needed here again? > + > + if (!ptr) > + return APR_ENOSHMAVAIL; > + *mem = ptr; > + return APR_SUCCESS; > +} > + > +/* make sure the shared memory is cleaned */ > +static int initialize_cleanup(apr_pool_t *p, apr_pool_t *plog, apr_pool_t > *ptemp, server_rec *s) > +{ > + ap_slotmem_t *next = globallistmem; > + while (next) { next = globallistmem; > + next = next->next; > + } What is the purpose of this loop? > + apr_pool_cleanup_register(p, &globallistmem, cleanup_slotmem, > apr_pool_cleanup_null); > + return OK; > +} > +
