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 *
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl * http://www.apache.org/licenses/LICENSE-2.0
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl *
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.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco/* Memory handler for a plain memory divided in slot.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco * This one uses plain memory.
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco#include "ap_slotmem.h"
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco#define AP_SLOTMEM_IS_PREGRAB(t) (t->type & AP_SLOTMEM_TYPE_PREGRAB)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riescostruct ap_slotmem_instance_t {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco char *name; /* per segment name */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco void *base; /* data set start */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco apr_size_t size; /* size of each memory slot */
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco unsigned int num; /* number of mem slots */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco apr_pool_t *gpool; /* per segment global pool */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco char *inuse; /* in-use flag table*/
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};
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco
b9840e4ee6fda6e42fa4ee9f337482ccc4839a39Adrián Riesco
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco/* global pool and list of slotmem we are handling */
8ecdb62fa2cef068eb4dbce59f3219a8e3adc0baChristian Maederstatic struct ap_slotmem_instance_t *globallistmem = NULL;
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riescostatic apr_pool_t *gpool = NULL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
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)
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco{
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco unsigned int i;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder void *ptr;
0f35e410ce3d3202f6769e9d139ad26d1de69b8eAdrián Riesco char *inuse;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco apr_status_t retval = APR_SUCCESS;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco if (!mem)
6e121321775373fe11161d23c541437456df19b4Adrián Riesco return APR_ENOSHMAVAIL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco ptr = mem->base;
6e121321775373fe11161d23c541437456df19b4Adrián Riesco inuse = mem->inuse;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco for (i = 0; i < mem->num; i++, inuse++) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (!AP_SLOTMEM_IS_PREGRAB(mem) ||
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco (AP_SLOTMEM_IS_PREGRAB(mem) && *inuse)) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco retval = func((void *) ptr, data, pool);
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riesco if (retval != APR_SUCCESS)
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco break;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder }
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ptr += mem->size;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
a74f814d3b445eadad6f68737a98a7a303698affChristian Maeder return retval;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco}
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder
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)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco{
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ap_slotmem_instance_t *res;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ap_slotmem_instance_t *next = globallistmem;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder apr_size_t basesize = (item_size * item_num);
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder const char *fname;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (name) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (name[0] == ':')
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco fname = name;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco else
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco fname = ap_server_root_relative(pool, name);
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco /* first try to attach to existing slotmem */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco while (next) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (strcmp(next->name, fname) == 0) {
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco /* we already have it */
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco *new = next;
7474965b2e6323002c96c0b39a59843cde201870Adrián Riesco return APR_SUCCESS;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco next = next->next;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco else
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco fname = "anonymous";
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
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)));
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (!res->base)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco return APR_ENOSHMAVAIL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder /* For the chained slotmem stuff */
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder res->name = apr_pstrdup(gpool, fname);
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco res->size = item_size;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder res->num = item_num;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder res->next = NULL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco res->type = type;
a74f814d3b445eadad6f68737a98a7a303698affChristian Maeder res->inuse = res->base + basesize;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (globallistmem == NULL)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco globallistmem = res;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco else
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder next->next = res;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco *new = res;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco return APR_SUCCESS;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder}
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder
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)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco{
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder ap_slotmem_instance_t *next = globallistmem;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder const char *fname;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder if (name) {
6e121321775373fe11161d23c541437456df19b4Adrián Riesco if (name[0] == ':')
6e121321775373fe11161d23c541437456df19b4Adrián Riesco fname = name;
6e121321775373fe11161d23c541437456df19b4Adrián Riesco else
6e121321775373fe11161d23c541437456df19b4Adrián Riesco fname = ap_server_root_relative(pool, name);
6e121321775373fe11161d23c541437456df19b4Adrián Riesco }
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder else
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder return APR_ENOSHMAVAIL;
6e121321775373fe11161d23c541437456df19b4Adrián Riesco
6e121321775373fe11161d23c541437456df19b4Adrián Riesco /* first try to attach to existing slotmem */
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder while (next) {
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder if (strcmp(next->name, fname) == 0) {
6e121321775373fe11161d23c541437456df19b4Adrián Riesco /* we already have it */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder *new = next;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder *item_size = next->size;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco *item_num = next->num;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco return APR_SUCCESS;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco next = next->next;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco return APR_ENOSHMAVAIL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco}
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riescostatic apr_status_t slotmem_dptr(ap_slotmem_instance_t *score, unsigned int id, void **mem)
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco{
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder void *ptr;
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder if (!score)
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder return APR_ENOSHMAVAIL;
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder if (id < 0 || id >= score->num)
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder return APR_ENOSHMAVAIL;
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder ptr = score->base + score->size * id;
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder if (!ptr)
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder return APR_ENOSHMAVAIL;
9e0e436980397412aa6c10b9aebde527ca2474bfChristian Maeder *mem = ptr;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder return APR_SUCCESS;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder}
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maederstatic apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder{
0f35e410ce3d3202f6769e9d139ad26d1de69b8eAdrián Riesco void *ptr;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco char *inuse;
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riesco apr_status_t ret;
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder if (!slot) {
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder return APR_ENOSHMAVAIL;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
dece9056c18ada64bcc8f2fba285270374139ee8Christian Maeder inuse = slot->inuse + id;
dece9056c18ada64bcc8f2fba285270374139ee8Christian Maeder if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder return APR_NOTFOUND;
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco ret = slotmem_dptr(slot, id, &ptr);
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco if (ret != APR_SUCCESS) {
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco return ret;
d72e314a1952b4418fb1c98b17dbab0d16bba585Adrián Riesco }
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco memcpy(dest, ptr, dest_len); /* bounds check? */
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco return APR_SUCCESS;
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco}
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riescostatic apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco{
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco void *ptr;
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riesco char *inuse;
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco apr_status_t ret;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco
ab9c6be005cb2af851307b7968c2baa16a76d6b1Adrián Riesco if (!slot) {
357381f0a999099cd2d4c268006df56b47847d68Adrián Riesco return APR_ENOSHMAVAIL;
5eb747ed1f9cb3d902d4277badfc2a42f9f98b0cAdrián Riesco }
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco inuse = slot->inuse + id;
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
27aad79faa0eec8d0e7dda32bca710db95bd2d0aAdrián Riesco return APR_NOTFOUND;
3f8cdebaede9921402318d525b57a9af8f9279d3Adrián Riesco }
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco ret = slotmem_dptr(slot, id, &ptr);
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco if (ret != APR_SUCCESS) {
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco return ret;
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco }
5318901bb69bf247e0f341312c800ba4ea87e46bAdrián Riesco memcpy(ptr, src, src_len); /* bounds check? */
0f35e410ce3d3202f6769e9d139ad26d1de69b8eAdrián Riesco return APR_SUCCESS;
357381f0a999099cd2d4c268006df56b47847d68Adrián Riesco}
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maederstatic unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder{
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco return slot->num;
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder}
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riescostatic apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco{
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco return slot->size;
0f593bb6e3f0bc82abf3d6d3c76ef222a43d0476Adrián Riesco}
0f593bb6e3f0bc82abf3d6d3c76ef222a43d0476Adrián Riesco
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco/*
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco * XXXX: if !AP_SLOTMEM_IS_PREGRAB, then still worry about
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco * inuse for grab and return?
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco */
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riescostatic apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id)
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco{
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco unsigned int i;
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco char *inuse;
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco if (!slot) {
8b389272b3312c6d3e3c0aee2e94bca6dbdade50Adrián Riesco return APR_ENOSHMAVAIL;
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco }
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco inuse = slot->inuse;
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco for (i = 0; i < slot->num; i++, inuse++) {
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder if (!*inuse) {
51c15129e8118fed5c33c334f8df82619ce98e7dAdrián Riesco break;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco }
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco }
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if (i >= slot->num) {
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco return APR_ENOSHMAVAIL;
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder }
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder *inuse = 1;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder *id = i;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder return APR_SUCCESS;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco}
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riescostatic apr_status_t slotmem_release(ap_slotmem_instance_t *slot, unsigned int id)
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco{
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco char *inuse;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco if (!slot) {
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco return APR_ENOSHMAVAIL;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco }
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco inuse = slot->inuse;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco if (id >= slot->num || !inuse[id] ) {
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco return APR_NOTFOUND;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco }
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco inuse[id] = 0;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco return APR_SUCCESS;
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco}
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riescostatic const ap_slotmem_provider_t storage = {
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco "plainmem",
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_do,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_create,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_attach,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_dptr,
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder &slotmem_get,
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder &slotmem_put,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_num_slots,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_slot_size,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_grab,
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco &slotmem_release
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco};
6b2e3d60f2e2c230c9637bf0701d7024d289764dAdrián Riesco
223be434693e8c97e2522ac19155a284b3536035Adrián Riescostatic int pre_config(apr_pool_t *p, apr_pool_t *plog,
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco apr_pool_t *ptemp)
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco{
94e112d16f89130a688db8b03ad3224903f5e97eChristian Maeder gpool = p;
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco return OK;
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco}
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco
cffa214f1ca524a65075ab26339df7040fe36032Christian Maederstatic void ap_slotmem_plain_register_hook(apr_pool_t *p)
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco{
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);
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco}
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco
aea9000fc94442cbfc92596f4264473c0fce51e4Adrián Riescomodule AP_MODULE_DECLARE_DATA slotmem_plain_module = {
c1cf2f634a37116ff90e99ca710179a23115cbfbAdrián Riesco STANDARD20_MODULE_STUFF,
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 */
223be434693e8c97e2522ac19155a284b3536035Adrián Riesco NULL, /* command apr_table_t */
fe5611d78ea0648e8719cb004a6a26e9a033429aAdrián Riesco ap_slotmem_plain_register_hook /* register hooks */
fe5611d78ea0648e8719cb004a6a26e9a033429aAdrián Riesco};
0be63c5d4b5e66cc600a0003081ae2bf85be9615Adrián Riesco
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder