From: Jim Jagielski Date: Thu, 1 Oct 2009 19:17:02 +0000 (+0000) Subject: Allow for pass-thru or early termination of doall() loops X-Git-Tag: 2.3.3~233 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d265a0f32f44c9fdec1bd92d40aa84c995bfd170;p=thirdparty%2Fapache%2Fhttpd.git Allow for pass-thru or early termination of doall() loops git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@820755 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/slotmem/mod_slotmem_plain.c b/modules/slotmem/mod_slotmem_plain.c index c00213a98e9..62eb17de327 100644 --- a/modules/slotmem/mod_slotmem_plain.c +++ b/modules/slotmem/mod_slotmem_plain.c @@ -43,6 +43,8 @@ static apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_f unsigned int i; void *ptr; char *inuse; + apr_status_t retval = APR_SUCCESS; + if (!mem) return APR_ENOSHMAVAIL; @@ -52,11 +54,13 @@ static apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_f for (i = 0; i < mem->num; i++, inuse++) { if (!AP_SLOTMEM_IS_PREGRAB(mem) || (AP_SLOTMEM_IS_PREGRAB(mem) && *inuse)) { - func((void *) ptr, data, pool); + retval = func((void *) ptr, data, pool); + if (retval != APR_SUCCESS) + break; } ptr += mem->size; } - return APR_SUCCESS; + return retval; } static apr_status_t slotmem_create(ap_slotmem_instance_t **new, const char *name, apr_size_t item_size, unsigned int item_num, ap_slotmem_type_t type, apr_pool_t *pool) diff --git a/modules/slotmem/mod_slotmem_shm.c b/modules/slotmem/mod_slotmem_shm.c index ff9627fe924..744ec0cb44c 100644 --- a/modules/slotmem/mod_slotmem_shm.c +++ b/modules/slotmem/mod_slotmem_shm.c @@ -207,6 +207,7 @@ static apr_status_t slotmem_doall(ap_slotmem_instance_t *mem, unsigned int i; void *ptr; char *inuse; + apr_status_t retval = APR_SUCCESS; if (!mem) { return APR_ENOSHMAVAIL; @@ -217,11 +218,13 @@ static apr_status_t slotmem_doall(ap_slotmem_instance_t *mem, for (i = 0; i < mem->desc.num; i++, inuse++) { if (!AP_SLOTMEM_IS_PREGRAB(mem) || (AP_SLOTMEM_IS_PREGRAB(mem) && *inuse)) { - func((void *) ptr, data, pool); + retval = func((void *) ptr, data, pool); + if (retval != APR_SUCCESS) + break; } ptr += mem->desc.size; } - return APR_SUCCESS; + return retval; } static apr_status_t slotmem_create(ap_slotmem_instance_t **new,