summaryrefslogtreecommitdiff
path: root/storage/ndb/include/kernel/NodeBitmask.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/include/kernel/NodeBitmask.hpp')
-rw-r--r--storage/ndb/include/kernel/NodeBitmask.hpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/storage/ndb/include/kernel/NodeBitmask.hpp b/storage/ndb/include/kernel/NodeBitmask.hpp
new file mode 100644
index 00000000000..423c01cd841
--- /dev/null
+++ b/storage/ndb/include/kernel/NodeBitmask.hpp
@@ -0,0 +1,89 @@
+/* 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 NODE_BITMASK_HPP
+#define NODE_BITMASK_HPP
+
+#include <ndb_limits.h>
+#include <kernel_types.h>
+#include <Bitmask.hpp>
+
+/**
+ * No of 32 bits words needed to store a node bitmask
+ * containing all the nodes in the system
+ * Both NDB nodes and API, MGM... nodes
+ *
+ * Note that this is used in a lot of signals
+ */
+#define _NODE_BITMASK_SIZE 2
+
+/**
+ * No of 32 bits words needed to store a node bitmask
+ * containing all the ndb nodes in the system
+ *
+ * Note that this is used in a lot of signals
+ */
+#define _NDB_NODE_BITMASK_SIZE 2
+
+/**
+ * No of 32 bits word needed to store B bits for N nodes
+ */
+#define NODE_ARRAY_SIZE(N, B) (((N)*(B)+31) >> 5)
+
+typedef Bitmask<(unsigned int)_NODE_BITMASK_SIZE> NodeBitmask;
+
+typedef Bitmask<(unsigned int)_NDB_NODE_BITMASK_SIZE> NdbNodeBitmask;
+
+#define __NBM_SZ ((MAX_NODES >> 5) + ((MAX_NODES & 31) != 0))
+#define __NNBM_SZ ((MAX_NDB_NODES >> 5) + ((MAX_NDB_NODES & 31) != 0))
+
+#if ( __NBM_SZ > _NODE_BITMASK_SIZE)
+#error "MAX_NODES can not fit into NODE_BITMASK_SIZE"
+#endif
+
+#if ( __NNBM_SZ > _NDB_NODE_BITMASK_SIZE)
+#error "MAX_NDB_NODES can not fit into NDB_NODE_BITMASK_SIZE"
+#endif
+
+/**
+ * General B Bits operations
+ *
+ * Get(x, A[], B)
+ * w = x >> S1
+ * s = (x & S2) << S3
+ * return (A[w] >> s) & S4
+ *
+ * Set(x, A[], v, B)
+ * w = x >> S1
+ * s = (x & S2) << S3
+ * m = ~(S4 << s)
+ * t = A[w] & m;
+ * A[w] = t | ((v & S4) << s)
+ *
+ * B(Bits) S1 S2 S3 S4
+ * 1 5 31 0 1
+ * 2 4 15 1 3
+ * 4 3 7 2 15
+ * 8 2 3 3 255
+ * 16 1 1 4 65535
+ *
+ * S1 = 5 - 2log(B)
+ * S2 = 2^S1 - 1
+ * S3 = 2log(B)
+ * S4 = 2^B - 1
+ */
+
+#endif