genode/repos/os/include/dde_kit/memory.h

135 lines
3.0 KiB
C

/*
* \brief Memory subsystem
* \author Christian Helmuth
* \date 2008-08-15
*/
/*
* Copyright (C) 2008-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__DDE_KIT__MEMORY_H_
#define _INCLUDE__DDE_KIT__MEMORY_H_
#include <dde_kit/types.h>
/*******************
** Slab facility **
*******************/
struct dde_kit_slab;
/**
* Store user pointer in slab cache
*
* \param slab pointer to slab cache
* \param data user pointer
*/
void dde_kit_slab_set_data(struct dde_kit_slab * slab, void *data);
/**
* Read user pointer from slab cache
*
* \param slab pointer to slab cache
*
* \return stored user pointer or 0
*/
void *dde_kit_slab_get_data(struct dde_kit_slab * slab);
/**
* Allocate slab in slab cache
*
* \param slab pointer to slab cache
*
* \return pointer to allocated slab
*/
void *dde_kit_slab_alloc(struct dde_kit_slab * slab);
/**
* Deallocate slab in slab cache
*
* \param slab pointer to slab cache
* \param objp pointer to allocated slab
*/
void dde_kit_slab_free(struct dde_kit_slab * slab, void *objp);
/**
* Destroy slab cache
*
* \param slab pointer to slab cache structure
*/
void dde_kit_slab_destroy(struct dde_kit_slab * slab);
/**
* Initialize slab cache
*
* \param size size of cache objects
*
* \return pointer to new slab cache or 0 on error
*
* Allocated blocks have valid virt->phys mappings and are physically
* contiguous.
*/
struct dde_kit_slab * dde_kit_slab_init(unsigned size);
/**********************************
** Large-block memory allocator **
**********************************/
/**
* Allocate large memory block
*
* \param size block size
*
* \return pointer to new memory block
*
* Allocations via this allocator may be slow (because RPCs to remote services
* may be involved) and should be used only for large blocks of several pages.
* If allocations/deallocations are relatively dynamic the large memory
* allocator should be used as backend for a block caching frontend.
*
* Allocated blocks have valid virt->phys mappings and are physically
* contiguous.
*/
void *dde_kit_large_malloc(dde_kit_size_t size);
/**
* Free large memory block
*
* \param p pointer to memory block
*/
void dde_kit_large_free(void *p);
/*****************************
** Simple memory allocator **
*****************************/
/**
* Allocate memory block via simple allocator
*
* \param size block size
*
* \return pointer to new memory block
*
* The blocks allocated via this allocator CANNOT be used for DMA or other
* device operations, i.e., there exists no virt->phys mapping.
*/
void *dde_kit_simple_malloc(dde_kit_size_t size);
/**
* Free memory block via simple allocator
*
* \param p pointer to memory block
*
* As in C99, if 'p' is NULL no operation is performed.
*/
void dde_kit_simple_free(void *p);
#endif /* _INCLUDE__DDE_KIT__MEMORY_H_ */