#include <unistd.h> /* for getpid() */
#endif
-#define AP_SLOTMEM_STORAGE "slotmem"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define AP_SLOTMEM_PROVIDER_GROUP "slotmem"
+#define AP_SLOTMEM_PROVIDER_VERSION 0
-typedef enum {
- SLOTMEM_PERSIST /* create a persistent slotmem */
-} apslotmem_type;
+typedef unsigned int ap_slotmem_type_t;
-typedef struct ap_slotmem_t ap_slotmem_t;
+typedef struct ap_slotmem_instance_t ap_slotmem_instance_t;
/**
* callback function used for slotmem.
*/
typedef apr_status_t ap_slotmem_callback_fn_t(void* mem, void *data, apr_pool_t *pool);
-struct ap_slotmem_storage_method {
+struct ap_slotmem_provider_t {
/*
* Name of the provider method
*/
* @param pool is pool used
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_do)(ap_slotmem_t *s, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool);
+ apr_status_t (* doall)(ap_slotmem_instance_t *s, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool);
/**
* create a new slotmem with each item size is item_size.
* This would create shared memory, basically.
* @param pool is pool used
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_create)(ap_slotmem_t **new, const char *name, apr_size_t item_size, unsigned int item_num, apslotmem_type type, apr_pool_t *pool);
+ apr_status_t (* 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);
/**
* attach to an existing slotmem.
* This would attach to shared memory, basically.
* @param pool is pool to memory allocate.
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_attach)(ap_slotmem_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool);
+ apr_status_t (* attach)(ap_slotmem_instance_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool);
/**
* get the memory ptr associated with this worker slot.
* @param s ap_slotmem_t to use.
* @param mem address to store the pointer to the slot
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_mem)(ap_slotmem_t *s, unsigned int item_id, void**mem);
+ apr_status_t (* dptr)(ap_slotmem_instance_t *s, unsigned int item_id, void**mem);
/**
* retrieve the memory associated with this worker slot.
* @param s ap_slotmem_t to use.
* @param dest_len length of dataset to retrieve
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_get)(ap_slotmem_t *s, unsigned int item_id, unsigned char *dest, apr_size_t dest_len);
+ apr_status_t (* get)(ap_slotmem_instance_t *s, unsigned int item_id, unsigned char *dest, apr_size_t dest_len);
/**
* store the memory associated with this worker slot.
* @param s ap_slotmem_t to use.
* @param src_len length of dataset to store in the slot
* @return APR_SUCCESS if all went well
*/
- apr_status_t (* slotmem_put)(ap_slotmem_t *slot, unsigned int item_id, unsigned char *src, apr_size_t src_len);
+ apr_status_t (* put)(ap_slotmem_instance_t *slot, unsigned int item_id, unsigned char *src, apr_size_t src_len);
/**
* return number of slots allocated for this entry.
* @param s ap_slotmem_t to use.
* @return number of slots
*/
- unsigned int (* slotmem_num_slots)(ap_slotmem_t *s);
+ unsigned int (* num_slots)(ap_slotmem_instance_t *s);
/**
* return slot size allocated for this entry.
* @param s ap_slotmem_t to use.
* @return size of slot
*/
- apr_size_t (* slotmem_slot_size)(ap_slotmem_t *s);
+ apr_size_t (* slot_size)(ap_slotmem_instance_t *s);
};
-typedef struct ap_slotmem_storage_method ap_slotmem_storage_method;
-
-/*
- * mod_slotmem externals exposed to the outside world.
- * Thus the provider nature of mod_slotmem is somewhat insulated
- * from the end user but can still be used directed if need
- * be. The rationale is to make it easier for additional
- * memory providers to be provided and having a single
- * simple interface for all
- */
-/**
- * obtain the array of provider methods desired
- * @param pool is the pool to use
- * @return pointer to array of provider names available
- */
-AP_DECLARE(apr_array_header_t *) ap_slotmem_methods(apr_pool_t *pool);
-/**
- * obtain the provider method desired
- * @param provider is name of the provider to use
- * @return pointer to provider or NULL
- */
-AP_DECLARE(ap_slotmem_storage_method *) ap_slotmem_method(const char *provider);
-/**
- * call the callback on all worker slots
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @param funct callback function to call for each element.
- * @param data parameter for the callback function.
- * @param pool is pool used
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_do(ap_slotmem_storage_method *sm, ap_slotmem_t *s, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool);
-
-/**
- * create a new slotmem with each item size is item_size.
- * This would create shared memory, basically.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param name is a key used for debugging and in mod_status output or allow another process to share this space.
- * @param item_size size of each item
- * @param item_num number of item to create.
- * @param type (persistent/allocatable/etc)
- * @param pool is pool used
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_create(ap_slotmem_storage_method *sm, ap_slotmem_t **new, const char *name, apr_size_t item_size, unsigned int item_num, apslotmem_type type, apr_pool_t *pool);
-
-/**
- * attach to an existing slotmem.
- * This would attach to shared memory, basically.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param name is a key used for debugging and in mod_status output or allow another process to share this space.
- * @param item_size size of each item
- * @param item_num max number of item.
- * @param pool is pool to memory allocate.
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_attach(ap_slotmem_storage_method *sm, ap_slotmem_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool);
-/**
- * get the memory associated with this worker slot.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @param item_id item to return for 0 to item_num
- * @param mem address to store the pointer to the slot
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_mem(ap_slotmem_storage_method *sm, ap_slotmem_t *s, unsigned int item_id, void**mem);
-/**
- * retrieve the memory associated with this worker slot.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @param item_id item to return for 0 to item_num
- * @param dest address to store the data
- * @param dest_len length of dataset to retrieve
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_get(ap_slotmem_storage_method *sm, ap_slotmem_t *s, unsigned int item_id, unsigned char *dest, apr_size_t dest_len);
-/**
- * store the memory associated with this worker slot.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @param item_id item to return for 0 to item_num
- * @param src address of the data to store in the slot
- * @param src_len length of dataset to store in the slot
- * @return APR_SUCCESS if all went well
- */
-AP_DECLARE(apr_status_t) ap_slotmem_put(ap_slotmem_storage_method *sm, ap_slotmem_t *s, unsigned int item_id, unsigned char *src, apr_size_t src_len);
-/**
- * return number of slots allocated for this entry.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @return number of slots
- */
-AP_DECLARE(unsigned int) ap_slotmem_num_slots(ap_slotmem_storage_method *sm, ap_slotmem_t *s);
-/**
- * return slot size allocated for this entry.
- * @param sm ap_slotmem_storage_method provider obtained
- * @param s ap_slotmem_t to use.
- * @return size of slot
- */
-AP_DECLARE(apr_size_t) ap_slotmem_slot_size(ap_slotmem_storage_method *sm, ap_slotmem_t *s);
+#ifdef __cplusplus
+}
+#endif
-#endif /*SLOTMEM_H*/
+#endif
+/** @} */
#include "ap_slotmem.h"
-struct ap_slotmem_t {
+struct ap_slotmem_instance_t {
char *name; /* per segment name */
void *base; /* data set start */
apr_size_t size; /* size of each memory slot */
unsigned int num; /* number of mem slots */
apr_pool_t *gpool; /* per segment global pool */
- struct ap_slotmem_t *next; /* location of next allocated segment */
+ struct ap_slotmem_instance_t *next; /* location of next allocated segment */
};
/* global pool and list of slotmem we are handling */
-static struct ap_slotmem_t *globallistmem = NULL;
+static struct ap_slotmem_instance_t *globallistmem = NULL;
static apr_pool_t *gpool = NULL;
-static apr_status_t slotmem_do(ap_slotmem_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
+static apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
{
unsigned int i;
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_create(ap_slotmem_t **new, const char *name, apr_size_t item_size, unsigned int item_num, apslotmem_type type, apr_pool_t *pool)
+static 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)
{
- ap_slotmem_t *res;
- ap_slotmem_t *next = globallistmem;
+ ap_slotmem_instance_t *res;
+ ap_slotmem_instance_t *next = globallistmem;
const char *fname;
if (name) {
fname = "anonymous";
/* create the memory using the gpool */
- res = (ap_slotmem_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_t));
+ res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
res->base = apr_pcalloc(gpool, item_size * item_num);
if (!res->base)
return APR_ENOSHMAVAIL;
return APR_SUCCESS;
}
-static apr_status_t slotmem_attach(ap_slotmem_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool)
+static 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)
{
- ap_slotmem_t *next = globallistmem;
+ ap_slotmem_instance_t *next = globallistmem;
const char *fname;
if (name) {
return APR_ENOSHMAVAIL;
}
-static apr_status_t slotmem_mem(ap_slotmem_t *score, unsigned int id, void **mem)
+static apr_status_t slotmem_mem(ap_slotmem_instance_t *score, unsigned int id, void **mem)
{
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_get(ap_slotmem_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
+static apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
{
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_put(ap_slotmem_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
+static apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
{
void *ptr;
return APR_SUCCESS;
}
-static unsigned int slotmem_num_slots(ap_slotmem_t *slot)
+static unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
{
return slot->num;
}
-static apr_size_t slotmem_slot_size(ap_slotmem_t *slot)
+static apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
{
return slot->size;
}
-static const ap_slotmem_storage_method storage = {
+static const ap_slotmem_provider_t storage = {
"plainmem",
&slotmem_do,
&slotmem_create,
#endif
#endif
-struct ap_slotmem_t {
+struct ap_slotmem_instance_t {
char *name; /* per segment name */
void *shm; /* ptr to memory segment (apr_shm_t *) */
void *base; /* data set start */
unsigned int num; /* number of mem slots */
apr_pool_t *gpool; /* per segment global pool */
apr_global_mutex_t *smutex; /* mutex */
- struct ap_slotmem_t *next; /* location of next allocated segment */
+ struct ap_slotmem_instance_t *next; /* location of next allocated segment */
char *inuse; /* in-use flag table*/
};
*/
/* global pool and list of slotmem we are handling */
-static struct ap_slotmem_t *globallistmem = NULL;
+static struct ap_slotmem_instance_t *globallistmem = NULL;
static apr_pool_t *gpool = NULL;
static apr_global_mutex_t *smutex = NULL;
static const char *mutex_fname = NULL;
return storename;
}
-static void store_slotmem(ap_slotmem_t *slotmem)
+static void store_slotmem(ap_slotmem_instance_t *slotmem)
{
apr_file_t *fp;
apr_status_t rv;
static apr_status_t cleanup_slotmem(void *param)
{
- ap_slotmem_t **mem = param;
+ ap_slotmem_instance_t **mem = param;
apr_status_t rv;
apr_pool_t *pool = NULL;
if (*mem) {
- ap_slotmem_t *next = *mem;
+ ap_slotmem_instance_t *next = *mem;
pool = next->gpool;
while (next) {
store_slotmem(next);
return APR_SUCCESS;
}
-static apr_status_t slotmem_do(ap_slotmem_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
+static apr_status_t slotmem_do(ap_slotmem_instance_t *mem, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)
{
unsigned int i;
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_create(ap_slotmem_t **new, const char *name, apr_size_t item_size, unsigned int item_num, apslotmem_type type, apr_pool_t *pool)
+static 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)
{
/* void *slotmem = NULL; */
void *ptr;
struct sharedslotdesc desc;
- ap_slotmem_t *res;
- ap_slotmem_t *next = globallistmem;
+ ap_slotmem_instance_t *res;
+ ap_slotmem_instance_t *next = globallistmem;
const char *fname;
apr_shm_t *shm;
apr_size_t basesize = (item_size * item_num);
}
/* For the chained slotmem stuff */
- res = (ap_slotmem_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_t));
+ res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
res->name = apr_pstrdup(gpool, fname);
res->shm = shm;
res->base = ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_attach(ap_slotmem_t **new, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool)
+static 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)
{
/* void *slotmem = NULL; */
void *ptr;
- ap_slotmem_t *res;
- ap_slotmem_t *next = globallistmem;
+ ap_slotmem_instance_t *res;
+ ap_slotmem_instance_t *next = globallistmem;
struct sharedslotdesc desc;
const char *fname;
apr_shm_t *shm;
ptr = ptr + sizeof(desc);
/* For the chained slotmem stuff */
- res = (ap_slotmem_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_t));
+ res = (ap_slotmem_instance_t *) apr_pcalloc(gpool, sizeof(ap_slotmem_instance_t));
res->name = apr_pstrdup(gpool, fname);
res->shm = shm;
res->base = ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_mem(ap_slotmem_t *slot, unsigned int id, void **mem)
+static apr_status_t slotmem_mem(ap_slotmem_instance_t *slot, unsigned int id, void **mem)
{
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_get(ap_slotmem_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
+static apr_status_t slotmem_get(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *dest, apr_size_t dest_len)
{
void *ptr;
return APR_SUCCESS;
}
-static apr_status_t slotmem_put(ap_slotmem_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
+static apr_status_t slotmem_put(ap_slotmem_instance_t *slot, unsigned int id, unsigned char *src, apr_size_t src_len)
{
void *ptr;
return APR_SUCCESS;
}
-static unsigned int slotmem_num_slots(ap_slotmem_t *slot)
+static unsigned int slotmem_num_slots(ap_slotmem_instance_t *slot)
{
return slot->num;
}
-static apr_size_t slotmem_slot_size(ap_slotmem_t *slot)
+static apr_size_t slotmem_slot_size(ap_slotmem_instance_t *slot)
{
return slot->size;
}
-static apr_status_t slotmem_grab(ap_slotmem_t *slot, unsigned int *id)
+static apr_status_t slotmem_grab(ap_slotmem_instance_t *slot, unsigned int *id)
{
unsigned int i;
return APR_SUCCESS;
}
-static apr_status_t slotmem_return(ap_slotmem_t *slot, unsigned int id)
+static apr_status_t slotmem_return(ap_slotmem_instance_t *slot, unsigned int id)
{
char *inuse;
return APR_SUCCESS;
}
-static const ap_slotmem_storage_method storage = {
+static const ap_slotmem_provider_t storage = {
"sharedmem",
&slotmem_do,
&slotmem_create,
};
/* make the storage usuable from outside */
-static const ap_slotmem_storage_method *sharedmem_getstorage(void)
+static const ap_slotmem_provider_t *sharedmem_getstorage(void)
{
return (&storage);
}
static void ap_sharedmem_register_hook(apr_pool_t *p)
{
- const ap_slotmem_storage_method *storage = sharedmem_getstorage();
+ const ap_slotmem_provider_t *storage = sharedmem_getstorage();
ap_register_provider(p, AP_SLOTMEM_STORAGE, "shared", "0", storage);
ap_hook_post_config(post_config, NULL, NULL, APR_HOOK_LAST);
ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE);
util_charset.c util_cookies.c util_debug.c util_xml.c \
util_expr.c util_filter.c util_pcre.c exports.c \
scoreboard.c error_bucket.c protocol.c core.c request.c provider.c \
- eoc_bucket.c eor_bucket.c core_filters.c slotmem.c
+ eoc_bucket.c eor_bucket.c core_filters.c
TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp