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 *
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * http://www.apache.org/licenses/LICENSE-2.0
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *
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.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz/* Memory handler for a plain memory divided in slot.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz * This one uses plain memory.
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz */
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz#include "ap_slotmem.h"
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulzstruct ap_slotmem_instance_t {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz char *name; /* per segment name */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz void *base; /* data set start */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz apr_size_t size; /* size of each memory slot */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz unsigned int num; /* number of mem slots */
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};
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz/* global pool and list of slotmem we are handling */
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulzstatic struct ap_slotmem_instance_t *globallistmem = NULL;
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulzstatic apr_pool_t *gpool = NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
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{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz unsigned int i;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz void *ptr;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (!mem)
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz return APR_ENOSHMAVAIL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ptr = mem->base;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz for (i = 0; i < mem->num; i++) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ptr = ptr + mem->size;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz func((void *) ptr, data, pool);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return APR_SUCCESS;
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz}
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz
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)
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz{
a3b8d685ae08bf3f83a6c2930e872183c487c844Ewaryst Schulz ap_slotmem_instance_t *res;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ap_slotmem_instance_t *next = globallistmem;
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz const char *fname;
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz if (name) {
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz if (name[0] == ':')
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz fname = name;
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz else
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz fname = ap_server_root_relative(pool, name);
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz /* first try to attach to existing slotmem */
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz while (next) {
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz if (strcmp(next->name, fname) == 0) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* we already have it */
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz *new = next;
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz return APR_SUCCESS;
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz }
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz next = next->next;
6091bd7fb65c7def81e5a5d0359ceeed7a88bb7fEwaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
6091bd7fb65c7def81e5a5d0359ceeed7a88bb7fEwaryst Schulz else
6091bd7fb65c7def81e5a5d0359ceeed7a88bb7fEwaryst Schulz fname = "anonymous";
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
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);
67f09e0fddea50c48620c011b6d001cffe565de6Ewaryst Schulz if (!res->base)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return APR_ENOSHMAVAIL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* For the chained slotmem stuff */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res->name = apr_pstrdup(gpool, fname);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res->size = item_size;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res->num = item_num;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz res->next = NULL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (globallistmem == NULL)
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz globallistmem = res;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz next->next = res;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *new = res;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return APR_SUCCESS;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz}
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
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{
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz ap_slotmem_instance_t *next = globallistmem;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz const char *fname;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (name) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (name[0] == ':')
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz fname = name;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz fname = ap_server_root_relative(pool, name);
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz else
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return APR_ENOSHMAVAIL;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* first try to attach to existing slotmem */
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz while (next) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz if (strcmp(next->name, fname) == 0) {
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz /* we already have it */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz *new = next;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz *item_size = next->size;
6091bd7fb65c7def81e5a5d0359ceeed7a88bb7fEwaryst Schulz *item_num = next->num;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz return APR_SUCCESS;
f474203c4cef7d85cb078f15ce5c2cea71e9a030Ewaryst Schulz }
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz next = next->next;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz }
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz return APR_ENOSHMAVAIL;
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz}
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic apr_status_t slotmem_mem(ap_slotmem_instance_t *score, unsigned int id, void **mem)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz{
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz void *ptr;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz if (!score)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_ENOSHMAVAIL;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz if (id < 0 || id >= score->num)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_ENOSHMAVAIL;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz ptr = score->base + score->size * id;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz if (!ptr)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_ENOSHMAVAIL;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz *mem = ptr;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_SUCCESS;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz}
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
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{
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz void *ptr;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz apr_status_t ret;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz ret = slotmem_mem(slot, id, &ptr);
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz if (ret != APR_SUCCESS) {
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return ret;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz }
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz memcpy(dest, ptr, dest_len); /* bounds check? */
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_SUCCESS;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz}
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulzstatic apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz{
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz void *ptr;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz apr_status_t ret;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz ret = slotmem_mem(slot, id, &ptr);
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz if (ret != APR_SUCCESS) {
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return ret;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz }
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz memcpy(ptr, src, src_len); /* bounds check? */
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return APR_SUCCESS;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz}
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulz
e9f0cd6ee7be0336cfd071df0451d6282cf55d75Ewaryst Schulzstatic unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz{
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz return slot->num;
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz}
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz{
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz return slot->size;
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz}
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulzstatic const ap_slotmem_provider_t storage = {
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz "plainmem",
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_do,
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz &slotmem_create,
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz &slotmem_attach,
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_mem,
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_get,
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_put,
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_num_slots,
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz &slotmem_slot_size
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz};
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulzstatic int pre_config(apr_pool_t *p, apr_pool_t *plog,
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz apr_pool_t *ptemp)
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz{
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz gpool = p;
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz return OK;
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz}
6c3ce177a0ad551edaae7daa17772b12f77a86daEwaryst Schulz
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulzstatic void ap_plainmem_register_hook(apr_pool_t *p)
7594b91154e299c9bcecd2bd62698705b55f99e8Ewaryst Schulz{
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 Schulz}
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulzmodule AP_MODULE_DECLARE_DATA plainmem_module = {
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz STANDARD20_MODULE_STUFF,
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 NULL, /* command apr_table_t */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz ap_plainmem_register_hook /* register hooks */
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz};
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz
f54cad0338da90c6789bb9baae1caec50d994b3aEwaryst Schulz