#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
#include "constants.h"
struct magazine_storage {
void *allocations[SLITTER__MAGAZINE_SIZE];
struct magazine_storage *volatile link;
uint32_t num_allocated_slow;
};
struct magazine {
ssize_t top_of_stack;
struct magazine_storage *storage;
};
inline bool
slitter__magazine_is_exhausted(const struct magazine *restrict mag)
{
return mag->top_of_stack == 0;
}
inline void *
slitter__magazine_get_non_empty(struct magazine *restrict mag)
{
void *ret;
ret = mag->storage->allocations[--mag->top_of_stack];
if (ret == NULL)
__builtin_unreachable();
return ret;
}
inline void
slitter__magazine_put_non_full(struct magazine *restrict mag, void *alloc)
{
mag->storage->allocations
[SLITTER__MAGAZINE_SIZE + mag->top_of_stack++] = alloc;
return;
}
void *slitter__magazine_get(struct magazine *restrict mag);
void *slitter__magazine_put(struct magazine *restrict mag, void *alloc);
size_t slitter__magazine_storage_sizeof(void);
size_t slitter__magazine_sizeof(void);