* @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);
+ /**
+ * 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);
+ /**
+ * 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);
};
typedef struct ap_slotmem_storage_method ap_slotmem_storage_method;
* @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);
#endif /*SLOTMEM_H*/
return APR_SUCCESS;
}
+static unsigned int slotmem_num_slots(ap_slotmem_t *slot)
+{
+ return slot->num;
+}
+
+static apr_size_t slotmem_slot_size(ap_slotmem_t *slot)
+{
+ return slot->size;
+}
+
static const ap_slotmem_storage_method storage = {
"plainmem",
&slotmem_do,
&slotmem_attach,
&slotmem_mem,
&slotmem_get,
- &slotmem_put
+ &slotmem_put,
+ &slotmem_num_slots,
+ &slotmem_slot_size
};
static int pre_config(apr_pool_t *p, apr_pool_t *plog,
/* global pool and list of slotmem we are handling */
static struct ap_slotmem_t *globallistmem = NULL;
static apr_pool_t *gpool = NULL;
-static apr_global_mutex_t *smutex;
-static const char *mutex_fname;
+static apr_global_mutex_t *smutex = NULL;
+static const char *mutex_fname = NULL;
+
+#define SLOTMEM_LOCK(s) do { \
+ if (s) \
+ apr_global_mutex_lock(s); \
+} while (0)
+
+#define SLOTMEM_UNLOCK(s) do { \
+ if (s) \
+ apr_global_mutex_unlock(s); \
+} while (0)
/* apr:shmem/unix/shm.c */
static apr_status_t unixd_set_shm_perms(const char *fname)
}
ptr = mem->base;
+ SLOTMEM_LOCK(mem->smutex);
for (i = 0; i < mem->num; i++) {
ptr = ptr + mem->size;
func((void *) ptr, data, pool);
}
+ SLOTMEM_UNLOCK(mem->smutex);
return APR_SUCCESS;
}
ptr = ptr + sizeof(desc);
}
else {
+ SLOTMEM_LOCK(smutex);
if (name && name[0] != ':') {
apr_shm_remove(fname, gpool);
rv = apr_shm_create(&shm, item_size * item_num + sizeof(struct sharedslotdesc), fname, gpool);
else {
rv = apr_shm_create(&shm, item_size * item_num + sizeof(struct sharedslotdesc), NULL, gpool);
}
+ SLOTMEM_UNLOCK(smutex);
if (rv != APR_SUCCESS) {
return rv;
}
return APR_SUCCESS;
}
+static unsigned int slotmem_num_slots(ap_slotmem_t *slot)
+{
+ return slot->num;
+}
+
+static apr_size_t slotmem_slot_size(ap_slotmem_t *slot)
+{
+ return slot->size;
+}
+
static const ap_slotmem_storage_method storage = {
"sharedmem",
&slotmem_do,
&slotmem_attach,
&slotmem_mem,
&slotmem_get,
- &slotmem_put
+ &slotmem_put,
+ &slotmem_num_slots,
+ &slotmem_slot_size
};
/* make the storage usuable from outside */
return (sm->slotmem_put(s, item_id, src, src_len));
}
+AP_DECLARE(unsigned int) ap_slotmem_num_slots(ap_slotmem_storage_method *sm, ap_slotmem_t *s)
+{
+ return (sm->slotmem_num_slots(s));
+}
+
+AP_DECLARE(apr_size_t) ap_slotmem_slot_size(ap_slotmem_storage_method *sm, ap_slotmem_t *s)
+{
+ return (sm->slotmem_slot_size(s));
+}
+
module AP_MODULE_DECLARE_DATA slotmem_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-directory config structure */