summaryrefslogtreecommitdiff
path: root/storage/ndb/src/ndbapi/ObjectMap.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/ndbapi/ObjectMap.hpp')
-rw-r--r--storage/ndb/src/ndbapi/ObjectMap.hpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/storage/ndb/src/ndbapi/ObjectMap.hpp b/storage/ndb/src/ndbapi/ObjectMap.hpp
new file mode 100644
index 00000000000..21407279f0b
--- /dev/null
+++ b/storage/ndb/src/ndbapi/ObjectMap.hpp
@@ -0,0 +1,151 @@
+/* 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 NDB_OBJECT_ID_MAP_HPP
+#define NDB_OBJECT_ID_MAP_HPP
+
+#include <ndb_global.h>
+//#include <NdbMutex.h>
+#include <NdbOut.hpp>
+
+//#define DEBUG_OBJECTMAP
+
+/**
+ * Global ObjectMap
+ */
+class NdbObjectIdMap //: NdbLockable
+{
+public:
+ STATIC_CONST( InvalidId = ~(Uint32)0 );
+ NdbObjectIdMap(Uint32 initalSize = 128, Uint32 expandSize = 10);
+ ~NdbObjectIdMap();
+
+ Uint32 map(void * object);
+ void * unmap(Uint32 id, void *object);
+
+ void * getObject(Uint32 id);
+private:
+ Uint32 m_size;
+ Uint32 m_expandSize;
+ Uint32 m_firstFree;
+ union MapEntry {
+ Uint32 m_next;
+ void * m_obj;
+ } * m_map;
+
+ void expand(Uint32 newSize);
+};
+
+inline
+NdbObjectIdMap::NdbObjectIdMap(Uint32 sz, Uint32 eSz) {
+ m_size = 0;
+ m_firstFree = InvalidId;
+ m_map = 0;
+ m_expandSize = eSz;
+ expand(sz);
+#ifdef DEBUG_OBJECTMAP
+ ndbout_c("NdbObjectIdMap:::NdbObjectIdMap(%u)", sz);
+#endif
+}
+
+inline
+NdbObjectIdMap::~NdbObjectIdMap(){
+ free(m_map);
+}
+
+inline
+Uint32
+NdbObjectIdMap::map(void * object){
+
+ // lock();
+
+ if(m_firstFree == InvalidId){
+ expand(m_expandSize);
+ }
+
+ Uint32 ff = m_firstFree;
+ m_firstFree = m_map[ff].m_next;
+ m_map[ff].m_obj = object;
+
+ // unlock();
+
+#ifdef DEBUG_OBJECTMAP
+ ndbout_c("NdbObjectIdMap::map(0x%x) %u", object, ff<<2);
+#endif
+
+ return ff<<2;
+}
+
+inline
+void *
+NdbObjectIdMap::unmap(Uint32 id, void *object){
+
+ Uint32 i = id>>2;
+
+ // lock();
+ if(i < m_size){
+ void * obj = m_map[i].m_obj;
+ if (object == obj) {
+ m_map[i].m_next = m_firstFree;
+ m_firstFree = i;
+ } else {
+ ndbout_c("Error: NdbObjectIdMap::::unmap(%u, 0x%x) obj=0x%x", id, object, obj);
+ return 0;
+ }
+
+ // unlock();
+
+#ifdef DEBUG_OBJECTMAP
+ ndbout_c("NdbObjectIdMap::unmap(%u) obj=0x%x", id, obj);
+#endif
+
+ return obj;
+ }
+ return 0;
+}
+
+inline void *
+NdbObjectIdMap::getObject(Uint32 id){
+#ifdef DEBUG_OBJECTMAP
+ ndbout_c("NdbObjectIdMap::getObject(%u) obj=0x%x", id, m_map[id>>2].m_obj);
+#endif
+ id >>= 2;
+ if(id < m_size){
+ return m_map[id].m_obj;
+ }
+ return 0;
+}
+
+inline void
+NdbObjectIdMap::expand(Uint32 incSize){
+ Uint32 newSize = m_size + incSize;
+ MapEntry * tmp = (MapEntry*)malloc(newSize * sizeof(MapEntry));
+
+ if (m_map) {
+ memcpy(tmp, m_map, m_size * sizeof(MapEntry));
+ free((void*)m_map);
+ }
+ m_map = tmp;
+
+ for(Uint32 i = m_size; i<newSize; i++){
+ m_map[i].m_next = i + 1;
+ }
+ m_firstFree = m_size;
+ m_map[newSize-1].m_next = InvalidId;
+ m_size = newSize;
+}
+
+#endif