apr_pool_t *gpool; /* per segment global pool */
apr_global_mutex_t *smutex; /* mutex */
struct ap_slotmem_t *next; /* location of next allocated segment */
- char *inuse; /* is-use flag table*/
+ unsigned int *inuse; /* is-use flag table*/
};
{
void *ptr;
+ char *inuse = (slot->base + (slot->size * slot->num));
apr_status_t ret;
+ if (!inuse[id]) {
+ return APR_ENOSHMAVAIL;
+ }
ret = slotmem_mem(slot, id, &ptr);
if (ret != APR_SUCCESS) {
return ret;
{
void *ptr;
- char *inuse;
+ char *inuse = (slot->base + (slot->size * slot->num));
apr_status_t ret;
+ if (!inuse[id]) {
+ return APR_ENOSHMAVAIL;
+ }
ret = slotmem_mem(slot, id, &ptr);
if (ret != APR_SUCCESS) {
return ret;
}
memcpy(ptr, src, src_len); /* bounds check? */
- /* We know the id fit it */
- inuse = (slot->base + (slot->size * slot->num));
- inuse[id] = 1;
return APR_SUCCESS;
}
return slot->size;
}
+static apr_status_t slotmem_grab(ap_slotmem_t *slot, unsigned int *id)
+{
+
+ unsigned int i;
+ char *inuse;
+
+ if (!slot) {
+ return APR_ENOSHMAVAIL;
+ }
+ inuse = (slot->base + (slot->size * slot->num));
+
+ SLOTMEM_LOCK(slot->smutex);
+ for (i = 0; i < slot->num; i++, inuse++) {
+ if (!*inuse) {
+ break;
+ }
+ }
+ if (i >= slot->num) {
+ SLOTMEM_UNLOCK(slot->smutex);
+ return APR_ENOSHMAVAIL;
+ }
+ *inuse = 1;
+ *id = i;
+ SLOTMEM_UNLOCK(slot->smutex);
+ return APR_SUCCESS;
+}
+
+static apr_status_t slotmem_return(ap_slotmem_t *slot, unsigned int id)
+{
+
+ char *inuse;
+
+ if (!slot) {
+ return APR_ENOSHMAVAIL;
+ }
+ inuse = (slot->base + (slot->size * slot->num));
+
+ SLOTMEM_LOCK(slot->smutex);
+ if (!inuse[id]) {
+ SLOTMEM_UNLOCK(slot->smutex);
+ return APR_ENOSHMAVAIL;
+ }
+ inuse[id] = 0;
+ SLOTMEM_UNLOCK(slot->smutex);
+ return APR_SUCCESS;
+}
+
static const ap_slotmem_storage_method storage = {
"sharedmem",
&slotmem_do,