slitter 0.1.0

A C- and Rust-callable slab allocator with a focus on safety
Documentation
#include "map.h"

#include <assert.h>
#include <errno.h>
#include <sys/mman.h>
#include <unistd.h>

static_assert(sizeof(size_t) == sizeof(uintptr_t),
    "Our rust code assumes usize == size_t, but rust-the-language "
    "only guarantees usize == uintptr_t.");

int64_t
slitter__page_size(void)
{
	long ret;

	ret = sysconf(_SC_PAGESIZE);
	if (ret < 0)
		return -errno;

	return ret;
}

void *
slitter__reserve_region(size_t desired_size, int32_t *OUT_errno)
{
	void *ret;

	*OUT_errno = 0;
	ret = mmap(NULL, desired_size, PROT_NONE,
	    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (ret != MAP_FAILED) {
		assert(ret != NULL && "We assume NULL is not a valid address");
		return ret;
	}

	*OUT_errno = errno;
	return NULL;
}

int32_t
slitter__release_region(void *base, size_t size)
{

	if (size == 0 || munmap(base, size) == 0)
		return 0;

	return -errno;
}

int32_t
slitter__allocate_region(void *base, size_t size)
{
	void *ret;

	ret = mmap(base, size, PROT_READ | PROT_WRITE,
	    MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (ret != MAP_FAILED)
		return 0;

	return -errno;
}

int32_t
slitter__allocate_fd_region(int fd, size_t offset, void *base, size_t size)
{
	void *ret;

	ret = mmap(base, size, PROT_READ | PROT_WRITE,
            MAP_FIXED | MAP_SHARED, fd, (off_t)offset);
	if (ret != MAP_FAILED)
		return 0;

	return -errno;
}