mod_slotmem_plain.c revision 6146b245ae71e8708a5883c5e4d31e9143b6e5fa
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz/* Licensed to the Apache Software Foundation (ASF) under one or more
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * contributor license agreements. See the NOTICE file distributed with
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * this work for additional information regarding copyright ownership.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * The ASF licenses this file to You under the Apache License, Version 2.0
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * (the "License"); you may not use this file except in compliance with
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * the License. You may obtain a copy of the License at
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * Unless required by applicable law or agreed to in writing, software
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * distributed under the License is distributed on an "AS IS" BASIS,
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * See the License for the specific language governing permissions and
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * limitations under the License.
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz/* Memory handler for a plain memory divided in slot.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * This one uses plain memory.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_size_t size; /* size of each memory slot */
6091bd7fb65c7def81e5a5d0359ceeed7a88bb7fEwaryst Schulz apr_pool_t *gpool; /* per segment global pool */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz struct ap_slotmem_instance_t *next; /* location of next allocated segment */
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz/* global pool and list of slotmem we are handling */
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulzstatic struct ap_slotmem_instance_t *globallistmem = NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzstatic apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz unsigned int i;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzstatic 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)
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz /* first try to attach to existing slotmem */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* we already have it */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* create the memory using the gpool */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res->base = apr_pcalloc(gpool, item_size * item_num);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* For the chained slotmem stuff */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzstatic 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)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* first try to attach to existing slotmem */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* we already have it */
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic apr_status_t slotmem_mem(ap_slotmem_instance_t *score, unsigned int id, void **mem)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz memcpy(dest, ptr, dest_len); /* bounds check? */
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulzstatic apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz memcpy(ptr, src, src_len); /* bounds check? */
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulzstatic unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulzstatic const ap_slotmem_provider_t storage = {
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulzstatic int pre_config(apr_pool_t *p, apr_pool_t *plog,
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic void ap_plainmem_register_hook(apr_pool_t *p)
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz /* XXX: static const char * const prePos[] = { "mod_slotmem.c", NULL }; */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz ap_register_provider(p, AP_SLOTMEM_STORAGE, "plain", "0", &storage);
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulzmodule AP_MODULE_DECLARE_DATA plainmem_module = {
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz NULL, /* create per-directory config structure */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz NULL, /* merge per-directory config structures */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz NULL, /* create per-server config structure */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz NULL, /* merge per-server config structures */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz ap_plainmem_register_hook /* register hooks */