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

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 NDB_OBJECT_ID_MAP_HPP
  14. #define NDB_OBJECT_ID_MAP_HPP
  15. #include <ndb_global.h>
  16. //#include <NdbMutex.h>
  17. #include <NdbOut.hpp>
  18. //#define DEBUG_OBJECTMAP
  19. /**
  20.   * Global ObjectMap
  21.   */
  22. class NdbObjectIdMap //: NdbLockable
  23. {
  24. public:
  25.   STATIC_CONST( InvalidId = ~(Uint32)0 );
  26.   NdbObjectIdMap(NdbMutex*, Uint32 initalSize = 128, Uint32 expandSize = 10);
  27.   ~NdbObjectIdMap();
  28.   Uint32 map(void * object);
  29.   void * unmap(Uint32 id, void *object);
  30.   
  31.   void * getObject(Uint32 id);
  32. private:
  33.   Uint32 m_size;
  34.   Uint32 m_expandSize;
  35.   Uint32 m_firstFree;
  36.   union MapEntry {
  37.      Uint32 m_next;
  38.      void * m_obj;
  39.   } * m_map;
  40.   NdbMutex * m_mutex;
  41.   void expand(Uint32 newSize);
  42. };
  43. inline
  44. NdbObjectIdMap::NdbObjectIdMap(NdbMutex* mutex, Uint32 sz, Uint32 eSz) {
  45.   m_size = 0;
  46.   m_firstFree = InvalidId;
  47.   m_map = 0;
  48.   m_mutex = mutex;
  49.   m_expandSize = eSz;
  50.   expand(sz);
  51. #ifdef DEBUG_OBJECTMAP
  52.   ndbout_c("NdbObjectIdMap:::NdbObjectIdMap(%u)", sz);
  53. #endif
  54. }
  55. inline
  56. NdbObjectIdMap::~NdbObjectIdMap(){
  57.   free(m_map);
  58. }
  59. inline
  60. Uint32
  61. NdbObjectIdMap::map(void * object){
  62.   
  63.   //  lock();
  64.   
  65.   if(m_firstFree == InvalidId){
  66.     expand(m_expandSize);
  67.   }
  68.   
  69.   Uint32 ff = m_firstFree;
  70.   m_firstFree = m_map[ff].m_next;
  71.   m_map[ff].m_obj = object;
  72.   
  73.   //  unlock();
  74.   
  75. #ifdef DEBUG_OBJECTMAP
  76.   ndbout_c("NdbObjectIdMap::map(0x%x) %u", object, ff<<2);
  77. #endif
  78.   return ff<<2;
  79. }
  80. inline
  81. void *
  82. NdbObjectIdMap::unmap(Uint32 id, void *object){
  83.   Uint32 i = id>>2;
  84.   //  lock();
  85.   if(i < m_size){
  86.     void * obj = m_map[i].m_obj;
  87.     if (object == obj) {
  88.       m_map[i].m_next = m_firstFree;
  89.       m_firstFree = i;
  90.     } else {
  91.       ndbout_c("Error: NdbObjectIdMap::::unmap(%u, 0x%x) obj=0x%x", id, object, obj);
  92.       return 0;
  93.     }
  94.     
  95.     //  unlock();
  96.     
  97. #ifdef DEBUG_OBJECTMAP
  98.     ndbout_c("NdbObjectIdMap::unmap(%u) obj=0x%x", id, obj);
  99. #endif
  100.     
  101.     return obj;
  102.   }
  103.   return 0;
  104. }
  105. inline void *
  106. NdbObjectIdMap::getObject(Uint32 id){
  107. #ifdef DEBUG_OBJECTMAP
  108.   ndbout_c("NdbObjectIdMap::getObject(%u) obj=0x%x", id,  m_map[id>>2].m_obj);
  109. #endif
  110.   id >>= 2;
  111.   if(id < m_size){
  112.     return m_map[id].m_obj;
  113.   }
  114.   return 0;
  115. }
  116. inline void
  117. NdbObjectIdMap::expand(Uint32 incSize){
  118.   NdbMutex_Lock(m_mutex);
  119.   Uint32 newSize = m_size + incSize;
  120.   MapEntry * tmp = (MapEntry*)realloc(m_map, newSize * sizeof(MapEntry));
  121.   if (likely(tmp != 0))
  122.   {
  123.     m_map = tmp;
  124.     
  125.     for(Uint32 i = m_size; i<newSize; i++){
  126.       m_map[i].m_next = i + 1;
  127.     }
  128.     m_firstFree = m_size;
  129.     m_map[newSize-1].m_next = InvalidId;
  130.     m_size = newSize;
  131.   }
  132.   else
  133.   {
  134.     ndbout_c("NdbObjectIdMap::expand unable to expand!!");
  135.   }
  136.   NdbMutex_Unlock(m_mutex);
  137. }
  138. #endif