Contiki 2.6

mmem.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2005, Swedish Institute of Computer Science
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * @(#)$Id: mmem.h,v 1.2 2008/10/15 14:17:28 nvt-se Exp $
00032  */
00033 /**
00034  * \addtogroup mem
00035  * @{
00036  */
00037 
00038 /**
00039  * \defgroup mmem Managed memory allocator
00040  *
00041  * The managed memory allocator is a fragmentation-free memory
00042  * manager. It keeps the allocated memory free from fragmentation by
00043  * compacting the memory when blocks are freed. A program that uses
00044  * the managed memory module cannot be sure that allocated memory
00045  * stays in place. Therefore, a level of indirection is used: access
00046  * to allocated memory must always be done using a special macro.
00047  *
00048  * \note This module has not been heavily tested.
00049  * @{
00050  */
00051 
00052 /**
00053  * \file
00054  *         Header file for the managed memory allocator
00055  * \author
00056  *         Adam Dunkels <adam@sics.se>
00057  * 
00058  */
00059 
00060 #ifndef __MMEM_H__
00061 #define __MMEM_H__
00062 
00063 /*---------------------------------------------------------------------------*/
00064 /**
00065  * \brief      Get a pointer to the managed memory
00066  * \param m    A pointer to the struct mmem 
00067  * \return     A pointer to the memory block, or NULL if memory could
00068  *             not be allocated. 
00069  * \author     Adam Dunkels
00070  *
00071  *             This macro is used to get a pointer to a memory block
00072  *             allocated with mmem_alloc().
00073  *
00074  * \hideinitializer
00075  */
00076 #define MMEM_PTR(m) (struct mmem *)(m)->ptr
00077 
00078 struct mmem {
00079   struct mmem *next;
00080   unsigned int size;
00081   void *ptr;
00082 };
00083 
00084 /* XXX: tagga minne med "interrupt usage", vilke gör att man är
00085    speciellt varsam under free(). */
00086 
00087 int  mmem_alloc(struct mmem *m, unsigned int size);
00088 void mmem_free(struct mmem *);
00089 void mmem_init(void);
00090 
00091 #endif /* __MMEM_H__ */
00092 
00093 /** @} */
00094 /** @} */