SFBHeap.h
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 #ifndef SFBHEAP_H
00024 #define SFBHEAP_H
00025 
00026 #include "SFBFrame.h"
00027 #include "SFBReactor.h"  
00028 
00043 class SFBHeap {
00044 
00045 public:
00046 
00047   SFBHeap() ;
00048 
00049   void * malloc(u32 bytes) ;
00050   void free(void * packet) ;
00051 
00052   u8 * remember(const u8 * packet, bool unreadOnly = false, u8 sourceOverride = MAX_FACE_INDEX) ;
00053   u8 * rememberBytes(const u8 * bytePtr, u32 byteCount) ;
00054   void forget(u8 * packet) ;
00055 
00056   u8 * makePacket(u32 size) ;
00057 
00058   enum { 
00059     HEAP_SIZE_HEADERS = 1<<8,
00060     HEAP_SIZE_BYTES = HEAP_SIZE_HEADERS<<3,
00061     FREE_CHECK_BYTES = 0x5aa5,
00062     USED_CHECK_BYTES = 0xaa55
00063   };
00064 
00065 private:
00066 
00067   union HeapHeader {
00068     double forAlignmentOnly;
00069     struct {
00070       u16 checkBytes;
00071       u16 size;                   
00072       union {
00073         PacketHeader ph;
00074         HeapHeader * nextFree;
00075       } s;
00076     } f;
00077   };
00078   static void * initUsed(HeapHeader * h, u32 words) ;
00079 
00080   static u32 dataSize(HeapHeader * h) ;
00081 
00082   static bool putPacketByte(u8 * packet, const u8 byte) ;
00083 
00084   static void terminatePacket(u8 * packet) ;
00085 
00086   static u32 headers(u32 packetBytes) ;
00087   HeapHeader * findFit(u32 size) ;
00088 
00089   HeapHeader base;
00090   HeapHeader theHeap[HEAP_SIZE_HEADERS];
00091   HeapHeader * freePtr;
00092 
00093   HeapHeader * asHeader(u32 index) {
00094     return (HeapHeader*) &theHeap[index];
00095   }
00096 
00097 #ifdef TEST_SFBHEAP
00098   friend class TestSFBHeap;
00099 #endif
00100 
00101 };
00102 
00103 #endif  
00104