buddy.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef BUDDY_H
  14. #define BUDDY_H
  15. #include <ndb_global.h>
  16. typedef unsigned int Uint32;
  17. typedef unsigned short Uint16;
  18. typedef unsigned long long Uint64;
  19. //
  20. const int UNDEFINED_CHUNK = -2; // XXX Set to hex
  21. //
  22. const int END_OF_CHUNK_LIST = -1; // XXX Set to hex
  23. // A timeout (no of seconds) for the memory segments in the TransporterRegistry 
  24. // memory pool. If a segment has been occupied (free=false) for a longer period 
  25. // than this timeout, it will be released.
  26. const int ALLOCATION_TIMEOUT = 10000;
  27. // Free segments should always be as large as possible
  28. // and are only allowed to be in any of these sizes
  29. enum FreeSegmentSize {
  30.   sz_256  = 0,
  31.   sz_512  = 1,
  32.   sz_1024 = 2,
  33.   sz_2048 = 3,
  34.   sz_4096 = 4,
  35.   sz_8192 = 5,
  36.   sz_16384 = 6,
  37.   sz_32768 = 7,
  38.   sz_65536 = 8,
  39.   sz_131072 = 9,
  40.   sz_GET_MAX = 5,
  41.   sz_MAX = 9
  42. };
  43. struct Segment;
  44. class BuddyMemory {
  45. public:
  46.   // Return true if there is at least 8 kB memory available
  47.   bool memoryAvailable();
  48.   // 
  49.   bool allocate(int nChunksToAllocate);
  50.   // Remove the segment from the freeSegment list
  51.   void removeFromFreeSegmentList(int sz, int index);
  52.   
  53.   // Release the segment of size
  54.   void release(int releaseId, int size);
  55.   
  56.   // Add a segment to the freeSegment list
  57.   void addToFreeSegmentList(int sz, int index);
  58.   bool getSegment(Uint32 size, Segment * dst);
  59.   void refreshTime(Uint32 time);
  60.   
  61.   //Calculate log2(arg) + 1
  62.   Uint32 logTwoPlus(Uint32 arg);
  63.   
  64.   // The current time
  65.   Uint32 currentTime;
  66.   
  67.   // Pointer to the first free segment of size FreeSegmentSize
  68.   Uint32 freeSegment[sz_MAX];
  69.   
  70.   // Start address of the memory block allocated
  71.   Uint32* startOfMemoryBlock;
  72.   
  73.   // Total number of 256 byte chunks.
  74.   Uint32 totalNoOfChunks;
  75.   
  76.   // Array of 256-byte chunks
  77.   struct Chunk256* chunk;
  78. };
  79. struct Segment {
  80.   Uint32 segmentSize;    // Size of the segment in no of words
  81.   Uint16 index;          // Index in the array of SegmentListElements
  82.   Uint16 releaseId;      // Unique no used when releasing the segment
  83.                          // Undefined if Long_signal.deallocIndicator==0
  84.   union {
  85.     Uint32* segmentAddress; // Address to the memory segment
  86.     Uint64  _padding_NOT_TO_BE_USED_;
  87.   };
  88. };
  89. struct Chunk256 {
  90.   Uint32 allocationTimeStamp;   // Bit 0 represents if the segment is free or not
  91.                                 // Bit 1-31 is the allocation time for the segment
  92.                                 // Bit 1-31 are undefined if the segment is free 
  93.   Uint32 nextSegmentOfSameSize; // Undefined if allocated. 
  94.                                 // The first chunk in a free segment has a valid 
  95.                                 // next-pointer. In the rest of the chunks 
  96.                                 // belonging to the segment it is UNDEFINED_CHUNK.
  97.   Uint32 prevSegmentOfSameSize; // Undefined if allocated
  98.                                 // The first chunk in a free segment has a valid 
  99.                                 // prev-pointer. In the rest of the chunks 
  100.                                 // belonging to the segment it is UNDEFINED_CHUNK.
  101.   void setFree(bool free);
  102.   bool getFree();
  103.   void setAllocationTimeStamp(Uint32 cTime);
  104.   Uint32 getAllocationTimeStamp();  
  105. };
  106. // inline void Chunk256::setFree(bool free){
  107. //   // Bit 0 of allocationTimeStamp represents if the segment is free or not
  108. //   allocationTimeStamp = 0x0;
  109. //   printf("nSet free segment");
  110. //   Uint32 offMask = 0x0; // A mask to set the 0 bit to 0
  111. //   if(free) 
  112. //     // Set this bit to 0, if segment should be free
  113. //     allocationTimeStamp = allocationTimeStamp & offMask;
  114. // }
  115. // inline bool Chunk256::getFree(){
  116. //   // Get free segment
  117. //   allocationTimeStamp = 0x0;
  118. //   Uint32 offMask = 0x0; 
  119. //   printf("nGet free segment"); 
  120. //   return ((allocationTimeStamp | offMask) == offMask ? true : false);
  121. // }
  122. // inline void Chunk256::setAllocationTimeStamp(Uint32 cTime){
  123. //   // Bits 1-31 of allocationTimeStamp represent the allocation time for segment
  124. //   Uint32 onMask = 0x80000000; // A mask to set the 0 bit to 1
  125. //   allocationTimeStamp = 0x0;
  126. //   printf("nSet allocation time");
  127.   
  128. //   allocationTimeStamp = onMask | cTime;
  129. // }
  130. // inline Uint32 Chunk256::getAllocationTimeStamp(){
  131. //   Uint32 onMask = 0x80000000; // A mask to set the 0 bit to 1
  132. //   allocationTimeStamp = 0x0;
  133. //   printf("nGet allocation time");
  134. //   allocationTimeStamp = allocationTimeStamp ^ onMask;
  135. //   return allocationTimeStamp;
  136. // };
  137. #endif