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

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 PC_H
  14. #define PC_H
  15. #include "Emulator.hpp"
  16. #include <NdbOut.hpp>
  17. #include <ndb_limits.h>
  18. #ifdef NO_EMULATED_JAM
  19. #define jam()
  20. #define jamLine(line)
  21. #define jamEntry()
  22. #define jamEntryLine(line)
  23. #else
  24. #ifdef NDB_WIN32
  25. #define jam() { 
  26.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  27.   *(Uint32*)(theEmulatedJam + tEmulatedJamIndex) = __LINE__; 
  28.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  29. #define jamLine(line) { 
  30.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  31.   *(Uint32*)(theEmulatedJam + tEmulatedJamIndex) = line; 
  32.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  33. #define jamEntry() { 
  34.   theEmulatedJamBlockNumber = number(); 
  35.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  36.   *(Uint32*)(theEmulatedJam + tEmulatedJamIndex) = 
  37.     ((theEmulatedJamBlockNumber << 20) | __LINE__); 
  38.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  39. #define jamEntryLine(line) { 
  40.   theEmulatedJamBlockNumber = number(); 
  41.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  42.   *(Uint32*)(theEmulatedJam + tEmulatedJamIndex) = 
  43.     ((theEmulatedJamBlockNumber << 20) | line); 
  44.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  45. #else
  46. #define jam() { 
  47.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  48.   *(Uint32*)((UintPtr)theEmulatedJam + (Uint32)tEmulatedJamIndex) = __LINE__; 
  49.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  50. #define jamLine(line) { 
  51.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  52.   *(Uint32*)((UintPtr)theEmulatedJam + (Uint32)tEmulatedJamIndex) = line; 
  53.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  54. #define jamEntry() { 
  55.   theEmulatedJamBlockNumber = number(); 
  56.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  57.   *(Uint32*)((UintPtr)theEmulatedJam + (Uint32)tEmulatedJamIndex) = 
  58.     ((theEmulatedJamBlockNumber << 20) | __LINE__); 
  59.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  60. #define jamEntryLine(line) { 
  61.   theEmulatedJamBlockNumber = number(); 
  62.   Uint32 tEmulatedJamIndex = theEmulatedJamIndex; 
  63.   *(Uint32*)((UintPtr)theEmulatedJam + (Uint32)tEmulatedJamIndex) = 
  64.     ((theEmulatedJamBlockNumber << 20) | line); 
  65.   theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
  66. #endif
  67. #endif
  68. #ifndef NDB_OPT
  69. #define ptrCheck(ptr, limit, rec) if (ptr.i < (limit)) ptr.p = &rec[ptr.i]; else ptr.p = NULL
  70. /**
  71.  * Sets the p-value of a ptr-struct to be a pointer to record no i  
  72.  * (where i is the i-value of the ptr-struct)
  73.  *
  74.  * @param ptr    ptr-struct with a set i-value  (the p-value in this gets set)
  75.  * @param limit  max no of records in rec
  76.  * @param rec    pointer to first record in an array of records
  77.  */
  78. #define ptrCheckGuard(ptr, limit, rec) {
  79.   UintR TxxzLimit; 
  80.   TxxzLimit = (limit); 
  81.   UintR TxxxPtr; 
  82.   TxxxPtr = ptr.i; 
  83.   ptr.p = &rec[TxxxPtr]; 
  84.   if (TxxxPtr < (TxxzLimit)) { 
  85.     ; 
  86.   } else { 
  87.     progError(__LINE__, ERR_POINTER_NOTINRANGE, __FILE__); 
  88.   }}
  89. #define ptrAss(ptr, rec) ptr.p = &rec[ptr.i]
  90. #define ptrNull(ptr) ptr.p = NULL
  91. #define ptrGuard(ptr) if (ptr.p == NULL) 
  92.     progError(__LINE__, ERR_POINTER_NOTINRANGE, __FILE__)
  93. #define arrGuard(ind, size) if ((ind) >= (size)) 
  94.     progError(__LINE__, ERR_INDEX_NOTINRANGE, __FILE__)
  95. #else
  96. #define ptrCheck(ptr, limit, rec) ptr.p = &rec[ptr.i]
  97. #define ptrCheckGuard(ptr, limit, rec) ptr.p = &rec[ptr.i]
  98. #define ptrAss(ptr, rec) ptr.p = &rec[ptr.i]
  99. #define ptrNull(ptr) ptr.p = NULL
  100. #define ptrGuard(ptr)
  101. #define arrGuard(ind, size)
  102. #endif
  103. // -------- ERROR INSERT MACROS -------
  104. #ifdef ERROR_INSERT
  105. #define ERROR_INSERT_VARIABLE UintR cerrorInsert
  106. #define ERROR_INSERTED(x) (cerrorInsert == (x))
  107. #define SET_ERROR_INSERT_VALUE(x) cerrorInsert = x
  108. #define CLEAR_ERROR_INSERT_VALUE cerrorInsert = 0
  109. #else
  110. #define ERROR_INSERT_VARIABLE typedef void * cerrorInsert // Will generate compiler error if used
  111. #define ERROR_INSERTED(x) false
  112. #define SET_ERROR_INSERT_VALUE(x)
  113. #define CLEAR_ERROR_INSERT_VALUE
  114. #endif
  115. /* ------------------------------------------------------------------------- */
  116. /*       COMMONLY USED CONSTANTS.                                            */
  117. /* ------------------------------------------------------------------------- */
  118. #define ZFALSE 0
  119. #define ZTRUE 1
  120. #define ZSET 1
  121. #define ZOK 0
  122. #define ZNOT_OK 1
  123. #define ZCLOSE_FILE 2
  124. #define ZNIL 0xffff
  125. #define Z8NIL 255
  126. /* ------------------------------------------------------------------------- */
  127. // Number of fragments stored per node. Should be settable on a table basis
  128. // in future version since small tables want small value and large tables
  129. // need large value.
  130. /* ------------------------------------------------------------------------- */
  131. #define NO_OF_FRAG_PER_NODE 1
  132. #define MAX_FRAG_PER_NODE 8
  133. /**
  134. * DIH allocates fragments in chunk for fast find of fragment record.
  135. * These parameters define chunk size and log of chunk size.
  136. */
  137. #define NO_OF_FRAGS_PER_CHUNK 4
  138. #define LOG_NO_OF_FRAGS_PER_CHUNK 2
  139. /* ---------------------------------------------------------------- */
  140. // To avoid synching too big chunks at a time we synch after writing
  141. // a certain number of data/UNDO pages. (e.g. 2 MBytes).
  142. /* ---------------------------------------------------------------- */
  143. #define MAX_PAGES_WITHOUT_SYNCH 64
  144. #define MAX_REDO_PAGES_WITHOUT_SYNCH 32
  145. /* ------------------------------------------------------------------ */
  146. // We have these constants to ensure that we can easily change the
  147. // parallelism of node recovery and the amount of scan 
  148. // operations needed for node recoovery.
  149. /* ------------------------------------------------------------------ */
  150. #define MAX_NO_WORDS_OUTSTANDING_COPY_FRAGMENT 6000
  151. #define MAGIC_CONSTANT 56
  152. #define NODE_RECOVERY_SCAN_OP_RECORDS 
  153.          (4 + ((4*MAX_NO_WORDS_OUTSTANDING_COPY_FRAGMENT)/ 
  154.          ((MAGIC_CONSTANT + 2) * 5)))
  155. #ifdef NO_CHECKPOINT
  156. #define NO_LCP
  157. #define NO_GCP
  158. #endif
  159. /**
  160.  * Ndb kernel blocks assertion handling
  161.  *
  162.  * Two type of assertions:
  163.  * - ndbassert  - Only used when compiling VM_TRACE
  164.  * - ndbrequire - Always checked
  165.  *
  166.  * If a ndbassert/ndbrequire fails, the system will 
  167.  * shutdown and generate an error log
  168.  *
  169.  *
  170.  * NOTE these may only be used within blocks
  171.  */
  172. #if defined VM_TRACE
  173. #define ndbassert(check) 
  174.   if((check)){ 
  175.   } else {     
  176.     progError(__LINE__, ERR_NDBREQUIRE, __FILE__); 
  177.   }           
  178. #define ndbrequire(check) 
  179.   if((check)){ 
  180.   } else {     
  181.     progError(__LINE__, ERR_NDBREQUIRE, __FILE__); 
  182.   }           
  183. #else
  184. #define ndbassert(check)
  185. #define ndbrequire(check) 
  186.   if((check)){ 
  187.   } else {     
  188.     progError(__LINE__, ERR_NDBREQUIRE, __FILE__); 
  189.   }           
  190. #endif
  191. #define CRASH_INSERTION(errorType) 
  192.   if (!ERROR_INSERTED((errorType))) { 
  193.   } else { 
  194.     progError(__LINE__, ERR_ERROR_INSERT, __FILE__); 
  195.   }
  196. #define CRASH_INSERTION2(errorNum, condition) 
  197.   if (!(ERROR_INSERTED(errorNum) && condition)) { 
  198.   } else { 
  199.     progError(__LINE__, ERR_ERROR_INSERT, __FILE__); 
  200.   }
  201. #define MEMCOPY_PAGE(to, from, page_size_in_bytes) 
  202.   memcpy((void*)(to), (void*)(from), (size_t)(page_size_in_bytes));
  203. #define MEMCOPY_NO_WORDS(to, from, no_of_words) 
  204.   memcpy((to), (void*)(from), (size_t)(no_of_words << 2));
  205. template <class T>
  206. struct Ptr {
  207.   T * p;
  208.   Uint32 i;
  209.   inline bool isNull() const { return i == RNIL; }
  210.   inline void setNull() { i = RNIL; }
  211. };
  212. template <class T>
  213. struct ConstPtr {
  214.   const T * p;
  215.   Uint32 i;
  216.   inline bool isNull() const { return i == RNIL; }
  217.   inline void setNull() { i = RNIL; }
  218. };
  219. #endif