mod_slotmem_plain.c revision 4736b790b4c02a55e20019eb3c733d0b5c3f86c8
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive/* Licensed to the Apache Software Foundation (ASF) under one or more
530eba85dbd41b8a0fa5255d3648d1440199a661slive * contributor license agreements. See the NOTICE file distributed with
e942c741056732f50da2074b36fe59805d370650slive * this work for additional information regarding copyright ownership.
5f5d1b4cc970b7f06ff8ef6526128e9a27303d88nd * The ASF licenses this file to You under the Apache License, Version 2.0
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * (the "License"); you may not use this file except in compliance with
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * the License. You may obtain a copy of the License at
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding *
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * http://www.apache.org/licenses/LICENSE-2.0
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding *
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * Unless required by applicable law or agreed to in writing, software
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * distributed under the License is distributed on an "AS IS" BASIS,
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * See the License for the specific language governing permissions and
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * limitations under the License.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd */
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd/* Memory handler for a plain memory divided in slot.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd * This one uses plain memory.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd */
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd#include "ap_slotmem.h"
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd
7db9f691a00ead175b03335457ca296a33ddf31bnd#define AP_SLOTMEM_IS_PREGRAB(t) (t->type & AP_SLOTMEM_TYPE_PREGRAB)
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslivestruct ap_slotmem_instance_t {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd char *name; /* per segment name */
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd void *base; /* data set start */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz apr_size_t size; /* size of each memory slot */
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive unsigned int num; /* number of mem slots */
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive apr_pool_t *gpool; /* per segment global pool */
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive char *inuse; /* in-use flag table*/
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive ap_slotmem_type_t type; /* type-specific flags */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz struct ap_slotmem_instance_t *next; /* location of next allocated segment */
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive};
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive/* global pool and list of slotmem we are handling */
812b14a17af03d7626429bc2525469bbd19e43b6ndstatic struct ap_slotmem_instance_t *globallistmem = NULL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78ndstatic apr_pool_t *gpool = NULL;
e120fcd8254500da6468e1bf76def6bb64bb7ec3slive
f45bc3cb163d979cc1472fe28052debffca056e9covenerstatic apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
f45bc3cb163d979cc1472fe28052debffca056e9covener{
f45bc3cb163d979cc1472fe28052debffca056e9covener unsigned int i;
f45bc3cb163d979cc1472fe28052debffca056e9covener void *ptr;
f45bc3cb163d979cc1472fe28052debffca056e9covener char *inuse;
ad090864e8c1d008716889f64bb2e01a2686e516covener
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd if (!mem)
dc3886e4bd492542b3633562940290f13096de02slive return APR_ENOSHMAVAIL;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
ad090864e8c1d008716889f64bb2e01a2686e516covener ptr = mem->base;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh inuse = mem->inuse;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd for (i = 0; i < mem->num; i++, inuse++) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd if (!AP_SLOTMEM_IS_PREGRAB(mem) ||
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd (AP_SLOTMEM_IS_PREGRAB(mem) && *inuse)) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd func((void *) ptr, data, pool);
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
f45bc3cb163d979cc1472fe28052debffca056e9covener ptr += mem->size;
f45bc3cb163d979cc1472fe28052debffca056e9covener }
f45bc3cb163d979cc1472fe28052debffca056e9covener return APR_SUCCESS;
f45bc3cb163d979cc1472fe28052debffca056e9covener}
f45bc3cb163d979cc1472fe28052debffca056e9covener
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78ndstatic 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)
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd{
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd ap_slotmem_instance_t *res;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd ap_slotmem_instance_t *next = globallistmem;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd apr_size_t basesize = (item_size * item_num);
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd const char *fname;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
c6165602388b5223eef4d1f09f0c53ed9916df8dcovener if (name) {
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar if (name[0] == ':')
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh fname = name;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd else
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd fname = ap_server_root_relative(pool, name);
663cbde3169bcfadb51937e7c3af75307c5af91cniq
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd /* first try to attach to existing slotmem */
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd while (next) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd if (strcmp(next->name, fname) == 0) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd /* we already have it */
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh *new = next;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh return APR_SUCCESS;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh }
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh next = next->next;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd else
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd fname = "anonymous";
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd /* create the memory using the gpool */
9e8c2603790f490398a0fabf97866b6815748a54ianh res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
b65ee0152f3a120deff1c7573faaf64fe08cdcf4mrumph res->base = apr_pcalloc(gpool, basesize + (item_num * sizeof(char)));
80dbb815a00e9c6c08257a452828d721fb3fc1c8rbowen if (!res->base)
9e8c2603790f490398a0fabf97866b6815748a54ianh return APR_ENOSHMAVAIL;
9e8c2603790f490398a0fabf97866b6815748a54ianh
9e8c2603790f490398a0fabf97866b6815748a54ianh /* For the chained slotmem stuff */
9e8c2603790f490398a0fabf97866b6815748a54ianh res->name = apr_pstrdup(gpool, fname);
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd res->size = item_size;
9e8c2603790f490398a0fabf97866b6815748a54ianh res->num = item_num;
9e8c2603790f490398a0fabf97866b6815748a54ianh res->next = NULL;
9e8c2603790f490398a0fabf97866b6815748a54ianh res->type = type;
9e8c2603790f490398a0fabf97866b6815748a54ianh res->inuse = res->base + basesize;
b65ee0152f3a120deff1c7573faaf64fe08cdcf4mrumph if (globallistmem == NULL)
9e8c2603790f490398a0fabf97866b6815748a54ianh globallistmem = res;
9e8c2603790f490398a0fabf97866b6815748a54ianh else
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd next->next = res;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar *new = res;
2fae9d127f7143fabe8f73958eb9bde31df17d41coar return APR_SUCCESS;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh}
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedoohstatic 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)
9e8c2603790f490398a0fabf97866b6815748a54ianh{
9e8c2603790f490398a0fabf97866b6815748a54ianh ap_slotmem_instance_t *next = globallistmem;
9e8c2603790f490398a0fabf97866b6815748a54ianh const char *fname;
9e8c2603790f490398a0fabf97866b6815748a54ianh
860b4efe27e7c1c9a2bf5c872b29c90f76849b51jim if (name) {
9e8c2603790f490398a0fabf97866b6815748a54ianh if (name[0] == ':')
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd fname = name;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd else
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd fname = ap_server_root_relative(pool, name);
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd else
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_ENOSHMAVAIL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd /* first try to attach to existing slotmem */
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh while (next) {
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar if (strcmp(next->name, fname) == 0) {
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh /* we already have it */
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh *new = next;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh *item_size = next->size;
860b4efe27e7c1c9a2bf5c872b29c90f76849b51jim *item_num = next->num;
dc3886e4bd492542b3633562940290f13096de02slive return APR_SUCCESS;
dc3886e4bd492542b3633562940290f13096de02slive }
dc3886e4bd492542b3633562940290f13096de02slive next = next->next;
dc3886e4bd492542b3633562940290f13096de02slive }
dc3886e4bd492542b3633562940290f13096de02slive
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_ENOSHMAVAIL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd}
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78ndstatic apr_status_t slotmem_dptr(ap_slotmem_instance_t *score, unsigned int id, void **mem)
dc3886e4bd492542b3633562940290f13096de02slive{
dc3886e4bd492542b3633562940290f13096de02slive
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd void *ptr;
dc3886e4bd492542b3633562940290f13096de02slive
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd if (!score)
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_ENOSHMAVAIL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd if (id < 0 || id >= score->num)
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_ENOSHMAVAIL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd ptr = score->base + score->size * id;
dc3886e4bd492542b3633562940290f13096de02slive if (!ptr)
dc3886e4bd492542b3633562940290f13096de02slive return APR_ENOSHMAVAIL;
dc3886e4bd492542b3633562940290f13096de02slive *mem = ptr;
dc3886e4bd492542b3633562940290f13096de02slive return APR_SUCCESS;
dc3886e4bd492542b3633562940290f13096de02slive}
dc3886e4bd492542b3633562940290f13096de02slive
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78ndstatic apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
11e10fe12dd87b4e81c43fdcef599839dcd7a6f3nd{
860b4efe27e7c1c9a2bf5c872b29c90f76849b51jim void *ptr;
dc3886e4bd492542b3633562940290f13096de02slive char *inuse;
dc3886e4bd492542b3633562940290f13096de02slive apr_status_t ret;
dc3886e4bd492542b3633562940290f13096de02slive
dc3886e4bd492542b3633562940290f13096de02slive if (!slot) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_ENOSHMAVAIL;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh inuse = slot->inuse + id;
860b4efe27e7c1c9a2bf5c872b29c90f76849b51jim if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_NOTFOUND;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd ret = slotmem_dptr(slot, id, &ptr);
dc3886e4bd492542b3633562940290f13096de02slive if (ret != APR_SUCCESS) {
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return ret;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh memcpy(dest, ptr, dest_len); /* bounds check? */
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_SUCCESS;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh}
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslivestatic apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive{
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen void *ptr;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen char *inuse;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen apr_status_t ret;
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen if (!slot) {
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen return APR_ENOSHMAVAIL;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen }
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen inuse = slot->inuse + id;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen if (id >= slot->num || (AP_SLOTMEM_IS_PREGRAB(slot) && !*inuse)) {
0bd1ddab48139fbbe68f4e257fe669dc19f58fe9rbowen return APR_NOTFOUND;
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar }
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen ret = slotmem_dptr(slot, id, &ptr);
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar if (ret != APR_SUCCESS) {
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar return ret;
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar }
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen memcpy(ptr, src, src_len); /* bounds check? */
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar return APR_SUCCESS;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen}
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coarstatic unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar{
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen return slot->num;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen}
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coarstatic apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar{
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen return slot->size;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen}
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen/*
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen * XXXX: if !AP_SLOTMEM_IS_PREGRAB, then still worry about
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen * inuse for grab and return?
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar */
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowenstatic apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id)
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen{
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen unsigned int i;
0bd1ddab48139fbbe68f4e257fe669dc19f58fe9rbowen char *inuse;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen if (!slot) {
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen return APR_ENOSHMAVAIL;
d331506ea4fb6d2a62014bf8a85b10b378b68cdbrbowen }
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive inuse = slot->inuse;
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
812b14a17af03d7626429bc2525469bbd19e43b6nd for (i = 0; i < slot->num; i++, inuse++) {
03d594abaea5dc45cbf7edc24d79706ffd787454erikabele if (!*inuse) {
03d594abaea5dc45cbf7edc24d79706ffd787454erikabele break;
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive }
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive }
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive if (i >= slot->num) {
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive return APR_ENOSHMAVAIL;
03d594abaea5dc45cbf7edc24d79706ffd787454erikabele }
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd *inuse = 1;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd *id = i;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd return APR_SUCCESS;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd}
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedoohstatic apr_status_t slotmem_release(ap_slotmem_instance_t *slot, unsigned int id)
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh{
5d01f40ffd657dd2ac567aacd93cabd162ddfa79coar char *inuse;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
aaed4ebc116f5862aff2610a809a9a9e9a28f50ecoar if (!slot) {
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh return APR_ENOSHMAVAIL;
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd }
812b14a17af03d7626429bc2525469bbd19e43b6nd
812b14a17af03d7626429bc2525469bbd19e43b6nd inuse = slot->inuse;
812b14a17af03d7626429bc2525469bbd19e43b6nd
b65ee0152f3a120deff1c7573faaf64fe08cdcf4mrumph if (id >= slot->num || !inuse[id] ) {
812b14a17af03d7626429bc2525469bbd19e43b6nd return APR_NOTFOUND;
812b14a17af03d7626429bc2525469bbd19e43b6nd }
812b14a17af03d7626429bc2525469bbd19e43b6nd inuse[id] = 0;
812b14a17af03d7626429bc2525469bbd19e43b6nd return APR_SUCCESS;
812b14a17af03d7626429bc2525469bbd19e43b6nd}
812b14a17af03d7626429bc2525469bbd19e43b6nd
812b14a17af03d7626429bc2525469bbd19e43b6ndstatic const ap_slotmem_provider_t storage = {
812b14a17af03d7626429bc2525469bbd19e43b6nd "plainmem",
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_do,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_create,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_attach,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_dptr,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_get,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_put,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_num_slots,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_slot_size,
812b14a17af03d7626429bc2525469bbd19e43b6nd &slotmem_grab,
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh &slotmem_release
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh};
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedoohstatic int pre_config(apr_pool_t *p, apr_pool_t *plog,
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh apr_pool_t *ptemp)
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh{
aaed4ebc116f5862aff2610a809a9a9e9a28f50ecoar gpool = p;
7087ccb939b4146f850f4d482fd8ab13de6335dchumbedooh return OK;
812b14a17af03d7626429bc2525469bbd19e43b6nd}
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78ndstatic void ap_slotmem_plain_register_hook(apr_pool_t *p)
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive{
6c450637c2a11b8ed8d8cb169f285a66d42ab40dslive /* XXX: static const char * const prePos[] = { "mod_slotmem.c", NULL }; */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz ap_register_provider(p, AP_SLOTMEM_PROVIDER_GROUP, "plain", "0", &storage);
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz}
d0c7caa0ed5abc1674e52e533fcb4d7fccb66a78nd
bbb1a0a4af32c90ec08166ec7c2e2cdd201009b1yoshikimodule AP_MODULE_DECLARE_DATA slotmem_plain_module = {
03d594abaea5dc45cbf7edc24d79706ffd787454erikabele STANDARD20_MODULE_STUFF,
03d594abaea5dc45cbf7edc24d79706ffd787454erikabele NULL, /* create per-directory config structure */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz NULL, /* merge per-directory config structures */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz NULL, /* create per-server config structure */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz NULL, /* merge per-server config structures */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz NULL, /* command apr_table_t */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz ap_slotmem_plain_register_hook /* register hooks */
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz};
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz
9e5b899a4f4a0310a818f3e94d94f4df76f5dcb1jerenkrantz