mod_slotmem_plain.c revision 34b424ed94f4f0d9b8d6b844d8d1115227530b03
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl/* Licensed to the Apache Software Foundation (ASF) under one or more
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner * contributor license agreements. See the NOTICE file distributed with
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * this work for additional information regarding copyright ownership.
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * The ASF licenses this file to You under the Apache License, Version 2.0
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu * (the "License"); you may not use this file except in compliance with
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * the License. You may obtain a copy of the License at
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * Unless required by applicable law or agreed to in writing, software
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * distributed under the License is distributed on an "AS IS" BASIS,
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco * See the License for the specific language governing permissions and
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco * limitations under the License.
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco/* Memory handler for a plain memory divided in slot.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco * This one uses plain memory.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco#define AP_SLOTMEM_IS_PREGRAB(t) (t->type & AP_SLOTMEM_TYPE_PREGRAB)
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco apr_size_t size; /* size of each memory slot */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco apr_pool_t *gpool; /* per segment global pool */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco ap_slotmem_type_t type; /* type-specific flags */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco struct ap_slotmem_instance_t *next; /* location of next allocated segment */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco/* global pool and list of slotmem we are handling */
8ecdb62fa2cef068eb4dbce59f3219a8e3adc0baChristian Maederstatic struct ap_slotmem_instance_t *globallistmem = NULL;
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riescostatic apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco unsigned int i;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maederstatic 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)
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ap_slotmem_instance_t *next = globallistmem;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder apr_size_t basesize = (item_size * item_num);
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco /* first try to attach to existing slotmem */
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco /* we already have it */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco /* create the memory using the gpool */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco res->base = apr_pcalloc(gpool, basesize + (item_num * sizeof(char)));
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder /* For the chained slotmem stuff */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riescostatic apr_status_t slotmem_attach(ap_slotmem_instance_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool)
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ap_slotmem_instance_t *next = globallistmem;
6e121321775373fe11161d23c541437456df19b4Adrián Riesco /* first try to attach to existing slotmem */
6e121321775373fe11161d23c541437456df19b4Adrián Riesco /* we already have it */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riescostatic apr_status_t slotmem_dptr(ap_slotmem_instance_t *score, unsigned int id, void **mem)
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maederstatic apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
dece9056c18ada64bcc8f2fba285270374139ee8Christian Maeder if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco memcpy(dest, ptr, dest_len); /* bounds check? */
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riescostatic apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco memcpy(ptr, src, src_len); /* bounds check? */
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maederstatic unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riescostatic apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco * XXXX: if !AP_SLOTMEM_IS_PREGRAB, then still worry about
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco * inuse for grab and return?
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riescostatic apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id)
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco unsigned int i;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riescostatic apr_status_t slotmem_release(ap_slotmem_instance_t *slot, unsigned int id)
223be434693e8c97e2522ac19155a284b3536035Adrián Riescostatic int pre_config(apr_pool_t *p, apr_pool_t *plog,
cffa214f1ca524a65075ab26339df7040fe36032Christian Maederstatic void ap_slotmem_plain_register_hook(apr_pool_t *p)
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco /* XXX: static const char * const prePos[] = { "mod_slotmem.c", NULL }; */
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco ap_register_provider(p, AP_SLOTMEM_PROVIDER_GROUP, "plain", "0", &storage);
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riescomodule AP_MODULE_DECLARE_DATA slotmem_plain_module = {
b9840e4ee6fda6e42fa4ee9f337482ccc4839a39Adrián Riesco NULL, /* create per-directory config structure */
b9840e4ee6fda6e42fa4ee9f337482ccc4839a39Adrián Riesco NULL, /* merge per-directory config structures */
b9840e4ee6fda6e42fa4ee9f337482ccc4839a39Adrián Riesco NULL, /* create per-server config structure */
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco NULL, /* merge per-server config structures */
fe5611d78ea0648e8719cb004a6a26e9a033429aAdrián Riesco ap_slotmem_plain_register_hook /* register hooks */