summaryrefslogtreecommitdiff
path: root/storage/ndb/src/common/transporter/buddy.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/common/transporter/buddy.hpp')
-rw-r--r--storage/ndb/src/common/transporter/buddy.hpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/storage/ndb/src/common/transporter/buddy.hpp b/storage/ndb/src/common/transporter/buddy.hpp
new file mode 100644
index 00000000000..f720e9e61a1
--- /dev/null
+++ b/storage/ndb/src/common/transporter/buddy.hpp
@@ -0,0 +1,172 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#ifndef BUDDY_H
+#define BUDDY_H
+
+#include <ndb_global.h>
+
+typedef unsigned int Uint32;
+typedef unsigned short Uint16;
+typedef unsigned long long Uint64;
+
+//
+const int UNDEFINED_CHUNK = -2; // XXX Set to hex
+
+//
+const int END_OF_CHUNK_LIST = -1; // XXX Set to hex
+
+// A timeout (no of seconds) for the memory segments in the TransporterRegistry
+// memory pool. If a segment has been occupied (free=false) for a longer period
+// than this timeout, it will be released.
+const int ALLOCATION_TIMEOUT = 10000;
+
+// Free segments should always be as large as possible
+// and are only allowed to be in any of these sizes
+enum FreeSegmentSize {
+ sz_256 = 0,
+ sz_512 = 1,
+ sz_1024 = 2,
+ sz_2048 = 3,
+ sz_4096 = 4,
+ sz_8192 = 5,
+ sz_16384 = 6,
+ sz_32768 = 7,
+ sz_65536 = 8,
+ sz_131072 = 9,
+ sz_GET_MAX = 5,
+ sz_MAX = 9
+};
+
+struct Segment;
+
+class BuddyMemory {
+public:
+
+ // Return true if there is at least 8 kB memory available
+ bool memoryAvailable();
+
+ //
+ bool allocate(int nChunksToAllocate);
+
+ // Remove the segment from the freeSegment list
+ void removeFromFreeSegmentList(int sz, int index);
+
+ // Release the segment of size
+ void release(int releaseId, int size);
+
+ // Add a segment to the freeSegment list
+ void addToFreeSegmentList(int sz, int index);
+
+ bool getSegment(Uint32 size, Segment * dst);
+
+ void refreshTime(Uint32 time);
+
+ //Calculate log2(arg) + 1
+ Uint32 logTwoPlus(Uint32 arg);
+
+ // The current time
+ Uint32 currentTime;
+
+ // Pointer to the first free segment of size FreeSegmentSize
+ Uint32 freeSegment[sz_MAX];
+
+ // Start address of the memory block allocated
+ Uint32* startOfMemoryBlock;
+
+ // Total number of 256 byte chunks.
+ Uint32 totalNoOfChunks;
+
+ // Array of 256-byte chunks
+ struct Chunk256* chunk;
+};
+
+struct Segment {
+ Uint32 segmentSize; // Size of the segment in no of words
+ Uint16 index; // Index in the array of SegmentListElements
+ Uint16 releaseId; // Unique no used when releasing the segment
+ // Undefined if Long_signal.deallocIndicator==0
+ union {
+ Uint32* segmentAddress; // Address to the memory segment
+ Uint64 _padding_NOT_TO_BE_USED_;
+ };
+};
+
+struct Chunk256 {
+ Uint32 allocationTimeStamp; // Bit 0 represents if the segment is free or not
+ // Bit 1-31 is the allocation time for the segment
+ // Bit 1-31 are undefined if the segment is free
+ Uint32 nextSegmentOfSameSize; // Undefined if allocated.
+ // The first chunk in a free segment has a valid
+ // next-pointer. In the rest of the chunks
+ // belonging to the segment it is UNDEFINED_CHUNK.
+ Uint32 prevSegmentOfSameSize; // Undefined if allocated
+ // The first chunk in a free segment has a valid
+ // prev-pointer. In the rest of the chunks
+ // belonging to the segment it is UNDEFINED_CHUNK.
+
+ void setFree(bool free);
+
+ bool getFree();
+
+ void setAllocationTimeStamp(Uint32 cTime);
+
+ Uint32 getAllocationTimeStamp();
+};
+
+// inline void Chunk256::setFree(bool free){
+// // Bit 0 of allocationTimeStamp represents if the segment is free or not
+// allocationTimeStamp = 0x0;
+
+// printf("\nSet free segment");
+// Uint32 offMask = 0x0; // A mask to set the 0 bit to 0
+// if(free)
+// // Set this bit to 0, if segment should be free
+// allocationTimeStamp = allocationTimeStamp & offMask;
+// }
+
+// inline bool Chunk256::getFree(){
+// // Get free segment
+
+// allocationTimeStamp = 0x0;
+// Uint32 offMask = 0x0;
+
+// printf("\nGet free segment");
+// return ((allocationTimeStamp | offMask) == offMask ? true : false);
+// }
+
+// inline void Chunk256::setAllocationTimeStamp(Uint32 cTime){
+// // Bits 1-31 of allocationTimeStamp represent the allocation time for segment
+
+// Uint32 onMask = 0x80000000; // A mask to set the 0 bit to 1
+// allocationTimeStamp = 0x0;
+
+// printf("\nSet allocation time");
+
+// allocationTimeStamp = onMask | cTime;
+// }
+
+// inline Uint32 Chunk256::getAllocationTimeStamp(){
+
+// Uint32 onMask = 0x80000000; // A mask to set the 0 bit to 1
+// allocationTimeStamp = 0x0;
+
+// printf("\nGet allocation time");
+// allocationTimeStamp = allocationTimeStamp ^ onMask;
+// return allocationTimeStamp;
+// };
+
+#endif