diff options
Diffstat (limited to 'include/ap_socache.h')
-rw-r--r-- | include/ap_socache.h | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/include/ap_socache.h b/include/ap_socache.h new file mode 100644 index 0000000..e404d2d --- /dev/null +++ b/include/ap_socache.h @@ -0,0 +1,230 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file ap_socache.h + * @brief Small object cache provider interface. + * + * @defgroup AP_SOCACHE ap_socache + * @ingroup APACHE_MODS + * @{ + */ + +#ifndef AP_SOCACHE_H +#define AP_SOCACHE_H + +#include "httpd.h" +#include "ap_provider.h" +#include "apr_pools.h" +#include "apr_time.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** If this flag is set, the store/retrieve/remove/status interfaces + * of the provider are NOT safe to be called concurrently from + * multiple processes or threads, and an external global mutex must be + * used to serialize access to the provider. + */ +/* XXX: Even if store/retrieve/remove is atomic, isn't it useful to note + * independently that status and iterate may or may not be? + */ +#define AP_SOCACHE_FLAG_NOTMPSAFE (0x0001) + +/** A cache instance. */ +typedef struct ap_socache_instance_t ap_socache_instance_t; + +/** Hints which may be passed to the init function; providers may + * ignore some or all of these hints. */ +struct ap_socache_hints { + /** Approximate average length of IDs: */ + apr_size_t avg_id_len; + /** Approximate average size of objects: */ + apr_size_t avg_obj_size; + /** Suggested interval between expiry cleanup runs; */ + apr_interval_time_t expiry_interval; +}; + +/** + * Iterator callback prototype for the ap_socache_provider_t->iterate() method + * @param instance The cache instance + * @param s Associated server context (for logging) + * @param userctx User defined pointer passed from the iterator call + * @param id Unique ID for the object (binary blob) + * with a trailing null char for convenience + * @param idlen Length of id blob + * @param data Output buffer to place retrieved data (binary blob) + * with a trailing null char for convenience + * @param datalen Length of data buffer + * @param pool Pool for temporary allocations + * @return APR status value; return APR_SUCCESS or the iteration will halt; + * this value is returned to the ap_socache_provider_t->iterate() caller + */ +typedef apr_status_t (ap_socache_iterator_t)(ap_socache_instance_t *instance, + server_rec *s, + void *userctx, + const unsigned char *id, + unsigned int idlen, + const unsigned char *data, + unsigned int datalen, + apr_pool_t *pool); + +/** A socache provider structure. socache providers are registered + * with the ap_provider.h interface using the AP_SOCACHE_PROVIDER_* + * constants. */ +typedef struct ap_socache_provider_t { + /** Canonical provider name. */ + const char *name; + + /** Bitmask of AP_SOCACHE_FLAG_* flags. */ + unsigned int flags; + + /** + * Create a session cache based on the given configuration string. + * The instance pointer returned in the instance parameter will be + * passed as the first argument to subsequent invocations. + * + * @param instance Output parameter to which instance object is written. + * @param arg User-specified configuration string. May be NULL to + * force use of defaults. + * @param tmp Pool to be used for any temporary allocations + * @param p Pool to be use for any allocations lasting as long as + * the created instance + * @return NULL on success, or an error string on failure. + */ + const char *(*create)(ap_socache_instance_t **instance, const char *arg, + apr_pool_t *tmp, apr_pool_t *p); + + /** + * Initialize the cache. The cname must be of maximum length 16 + * characters, and uniquely identifies the consumer of the cache + * within the server; using the module name is recommended, e.g. + * "mod_ssl-sess". This string may be used within a filesystem + * path so use of only alphanumeric [a-z0-9_-] characters is + * recommended. If hints is non-NULL, it gives a set of hints for + * the provider. Returns APR error code. + * + * @param instance The cache instance + * @param cname A unique string identifying the consumer of this API + * @param hints Optional hints argument describing expected cache use + * @param s Server structure to which the cache is associated + * @param pool Pool for long-lived allocations + * @return APR status value indicating success. + */ + apr_status_t (*init)(ap_socache_instance_t *instance, const char *cname, + const struct ap_socache_hints *hints, + server_rec *s, apr_pool_t *pool); + + /** + * Destroy a given cache instance object. + * @param instance The cache instance to destroy. + * @param s Associated server structure (for logging purposes) + */ + void (*destroy)(ap_socache_instance_t *instance, server_rec *s); + + /** + * Store an object in a cache instance. + * @param instance The cache instance + * @param s Associated server structure (for logging purposes) + * @param id Unique ID for the object; binary blob + * @param idlen Length of id blob + * @param expiry Absolute time at which the object expires + * @param data Data to store; binary blob + * @param datalen Length of data blob + * @param pool Pool for temporary allocations. + * @return APR status value. + */ + apr_status_t (*store)(ap_socache_instance_t *instance, server_rec *s, + const unsigned char *id, unsigned int idlen, + apr_time_t expiry, + unsigned char *data, unsigned int datalen, + apr_pool_t *pool); + + /** + * Retrieve a cached object. + * + * @param instance The cache instance + * @param s Associated server structure (for logging purposes) + * @param id Unique ID for the object; binary blob + * @param idlen Length of id blob + * @param data Output buffer to place retrievd data (binary blob) + * @param datalen On entry, length of data buffer; on exit, the + * number of bytes written to the data buffer. + * @param pool Pool for temporary allocations. + * @return APR status value; APR_NOTFOUND if the object was not + * found + */ + apr_status_t (*retrieve)(ap_socache_instance_t *instance, server_rec *s, + const unsigned char *id, unsigned int idlen, + unsigned char *data, unsigned int *datalen, + apr_pool_t *pool); + + /** + * Remove an object from the cache + * + * @param instance The cache instance + * @param s Associated server structure (for logging purposes) + * @param id Unique ID for the object; binary blob + * @param idlen Length of id blob + * @param pool Pool for temporary allocations. + */ + apr_status_t (*remove)(ap_socache_instance_t *instance, server_rec *s, + const unsigned char *id, unsigned int idlen, + apr_pool_t *pool); + + /** + * Dump the status of a cache instance for mod_status. Will use + * the ap_r* interfaces to produce appropriate status output. + * XXX: ap_r* are deprecated, bad dogfood + * + * @param instance The cache instance + * @param r The request structure + * @param flags The AP_STATUS_* constants used (see mod_status.h) + */ + void (*status)(ap_socache_instance_t *instance, request_rec *r, int flags); + + /** + * Dump all cached objects through an iterator callback. + * @param instance The cache instance + * @param s Associated server context (for processing and logging) + * @param userctx User defined pointer passed through to the iterator + * @param iterator The user provided callback function which will receive + * individual calls for each unexpired id/data pair + * @param pool Pool for temporary allocations. + * @return APR status value; APR_NOTFOUND if the object was not + * found + */ + apr_status_t (*iterate)(ap_socache_instance_t *instance, server_rec *s, + void *userctx, ap_socache_iterator_t *iterator, + apr_pool_t *pool); + +} ap_socache_provider_t; + +/** The provider group used to register socache providers. */ +#define AP_SOCACHE_PROVIDER_GROUP "socache" +/** The provider version used to register socache providers. */ +#define AP_SOCACHE_PROVIDER_VERSION "0" + +/** Default provider name. */ +#define AP_SOCACHE_DEFAULT_PROVIDER "default" + +#ifdef __cplusplus +} +#endif + +#endif /* AP_SOCACHE_H */ +/** @} */ |