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