Commit of new class abstraction APIs for all device demos other than the MIDI demo...
[pub/lufa.git] / LUFA / MemoryAllocator / DynAlloc.c
diff --git a/LUFA/MemoryAllocator/DynAlloc.c b/LUFA/MemoryAllocator/DynAlloc.c
deleted file mode 100644 (file)
index 4f1c822..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-#define  INCLUDE_FROM_DYNALLOC_C\r
-#include "DynAlloc.h"\r
-\r
-struct\r
-{\r
-       char    Mem_Heap[NUM_BLOCKS * BLOCK_SIZE];\r
-       void*   Mem_Handles[NUM_HANDLES];\r
-       uint8_t Mem_Block_Flags[(NUM_BLOCKS / 4) + ((NUM_BLOCKS % 4) ? 1 : 0)];\r
-       uint8_t FlagMaskLookupMask[4];\r
-       uint8_t FlagMaskLookupNum[4];\r
-} Mem_MemData = {.FlagMaskLookupMask = {(3 << 0), (3 << 2), (3 << 4), (3 << 6)},\r
-                 .FlagMaskLookupNum  = {      0,        2,        4,        6}};\r
-\r
-static uint8_t Mem_GetBlockFlags(const Block_Number_t BlockNum)\r
-{\r
-       const Block_Number_t BlockIndex    = (BlockNum >> 2);\r
-       const uint8_t        FlagMask      = Mem_MemData.FlagMaskLookupMask[BlockNum & 0x03];\r
-       const uint8_t        FlagMaskShift = Mem_MemData.FlagMaskLookupNum[BlockNum & 0x03];\r
-\r
-       return ((Mem_MemData.Mem_Block_Flags[BlockIndex] & FlagMask) >> FlagMaskShift);\r
-}\r
-\r
-static void Mem_SetBlockFlags(const Block_Number_t BlockNum, const uint8_t Flags)\r
-{\r
-       const Block_Number_t BlockIndex    = (BlockNum >> 2);\r
-       const uint8_t        FlagMask      = Mem_MemData.FlagMaskLookupMask[BlockNum & 0x03];\r
-       const uint8_t        FlagMaskShift = Mem_MemData.FlagMaskLookupNum[BlockNum & 0x03];\r
-\r
-       Mem_MemData.Mem_Block_Flags[BlockIndex] &= ~FlagMask;\r
-       Mem_MemData.Mem_Block_Flags[BlockIndex] |= (Flags << FlagMaskShift);\r
-}\r
-\r
-static inline void Mem_Defrag(void)\r
-{\r
-       Block_Number_t FreeStartBlock = 0;\r
-       char*          FreeStartPtr   = NULL;\r
-       char*          UsedStartPtr   = NULL;\r
-       Block_Number_t CurrBlock;\r
-       \r
-       for (CurrBlock = 0; CurrBlock < NUM_BLOCKS; CurrBlock++)\r
-       {\r
-               if (!(Mem_GetBlockFlags(CurrBlock) & BLOCK_USED_MASK))\r
-               {\r
-                       FreeStartPtr   = &Mem_MemData.Mem_Heap[CurrBlock * BLOCK_SIZE];\r
-                       FreeStartBlock = CurrBlock;\r
-                       break;\r
-               }\r
-       }\r
-       \r
-       if (FreeStartPtr == NULL)\r
-         return;\r
-\r
-       while (++CurrBlock < NUM_BLOCKS)\r
-       {\r
-               uint8_t CurrBlockFlags = Mem_GetBlockFlags(CurrBlock);\r
-       \r
-               if (CurrBlockFlags & BLOCK_USED_MASK)\r
-               {\r
-                       UsedStartPtr = &Mem_MemData.Mem_Heap[CurrBlock * BLOCK_SIZE];\r
-               \r
-                       for (Handle_Number_t HandleNum = 0; HandleNum < NUM_HANDLES; HandleNum++)\r
-                       {\r
-                               if (Mem_MemData.Mem_Handles[HandleNum] == UsedStartPtr)\r
-                               {\r
-                                       Mem_MemData.Mem_Handles[HandleNum] = FreeStartPtr;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       memcpy(FreeStartPtr, UsedStartPtr, BLOCK_SIZE);\r
-                       FreeStartPtr += BLOCK_SIZE;\r
-                         \r
-                       Mem_SetBlockFlags(FreeStartBlock++, CurrBlockFlags);\r
-                       Mem_SetBlockFlags(CurrBlock, 0);\r
-               }\r
-       }\r
-}\r
-\r
-static inline bool Mem_FindFreeBlocks(Block_Number_t* const RetStartPtr, const Block_Number_t Blocks)\r
-{\r
-       Block_Number_t FreeInCurrSec = 0;\r
-\r
-       for (Block_Number_t CurrBlock = 0; CurrBlock < NUM_BLOCKS; CurrBlock++)\r
-       {\r
-               if (Mem_GetBlockFlags(CurrBlock) & BLOCK_USED_MASK)\r
-                 FreeInCurrSec = 0;\r
-               else\r
-                 FreeInCurrSec++;\r
-\r
-               if (FreeInCurrSec >= Blocks)\r
-               {\r
-                       *RetStartPtr = CurrBlock;\r
-                       return true;\r
-               }\r
-       }\r
-\r
-       return false;\r
-}\r
-\r
-Mem_Handle_t Mem_Alloc(const Alloc_Size_t Bytes)\r
-{\r
-       Block_Number_t ReqBlocks = (Bytes / BLOCK_SIZE);\r
-       Block_Number_t StartBlock;\r
-       \r
-       if (Bytes % BLOCK_SIZE)\r
-         ReqBlocks++;\r
-       \r
-       if (!(Mem_FindFreeBlocks(&StartBlock, ReqBlocks)))\r
-       {\r
-               Mem_Defrag();\r
-               \r
-               if (!(Mem_FindFreeBlocks(&StartBlock, ReqBlocks)))\r
-                 return NULL;  \r
-       }\r
-\r
-       for (Block_Number_t UsedBlock = 0; UsedBlock < (ReqBlocks - 1); UsedBlock++)\r
-         Mem_SetBlockFlags((StartBlock + UsedBlock), (BLOCK_USED_MASK | BLOCK_LINKED_MASK));\r
-\r
-       Mem_SetBlockFlags((StartBlock + (ReqBlocks - 1)), BLOCK_USED_MASK);\r
-       \r
-       for (Handle_Number_t AllocEntry = 0; AllocEntry < NUM_HANDLES; AllocEntry++)\r
-       {\r
-               Mem_Handle_t CurrHdl = (Mem_Handle_t)&Mem_MemData.Mem_Handles[AllocEntry];\r
-       \r
-               if (DEREF(CurrHdl, void*) == NULL)\r
-               {\r
-                       DEREF(CurrHdl, void*) = &Mem_MemData.Mem_Heap[StartBlock * BLOCK_SIZE];\r
-                       return CurrHdl;\r
-               }\r
-       }\r
-\r
-       return NULL;\r
-}\r
-\r
-Mem_Handle_t Mem_Realloc(Mem_Handle_t CurrAllocHdl, const Alloc_Size_t Bytes)\r
-{\r
-       Mem_Free(CurrAllocHdl);\r
-       return Mem_Alloc(Bytes);\r
-}\r
-\r
-Mem_Handle_t Mem_Calloc(const Alloc_Size_t Bytes)\r
-{\r
-       Mem_Handle_t AllocHdl = Mem_Alloc(Bytes);\r
-       \r
-       if (AllocHdl != NULL)\r
-         memset(DEREF(AllocHdl, void*), 0x00, Bytes);\r
-\r
-       return AllocHdl;\r
-}\r
-\r
-void Mem_Free(Mem_Handle_t CurrAllocHdl)\r
-{\r
-       char*          MemBlockPtr = DEREF(CurrAllocHdl, char*);\r
-       Block_Number_t CurrBlock   = ((uint16_t)(MemBlockPtr - Mem_MemData.Mem_Heap) / BLOCK_SIZE);\r
-       uint8_t        CurrBlockFlags;\r
-\r
-       if ((CurrAllocHdl == NULL) || (MemBlockPtr == NULL))\r
-         return;\r
-\r
-       do\r
-       {\r
-               CurrBlockFlags = Mem_GetBlockFlags(CurrBlock);\r
-               Mem_SetBlockFlags(CurrBlock, 0);\r
-\r
-               CurrBlock++;\r
-       }\r
-       while (CurrBlockFlags & BLOCK_LINKED_MASK);\r
-       \r
-       DEREF(CurrAllocHdl, void*) = NULL;\r
-}\r
-\r
-Block_Number_t Mem_TotalFreeBlocks(void)\r
-{\r
-       Block_Number_t FreeBlocks = 0;\r
-       \r
-       for (Block_Number_t CurrBlock = 0; CurrBlock < NUM_BLOCKS; CurrBlock++)\r
-       {\r
-               if (!(Mem_GetBlockFlags(CurrBlock) & BLOCK_USED_MASK))\r
-                 FreeBlocks++;\r
-       }\r
-       \r
-       return FreeBlocks;\r
-}\r
-\r
-Handle_Number_t Mem_TotalFreeHandles(void)\r
-{\r
-       Handle_Number_t FreeHandles = 0;\r
-       \r
-       for (Handle_Number_t CurrHandle = 0; CurrHandle < NUM_HANDLES; CurrHandle++)\r
-       {\r
-               if (Mem_MemData.Mem_Handles[CurrHandle] == NULL)\r
-                 FreeHandles++;\r
-       }\r
-       \r
-       return FreeHandles;\r
-}\r