#At file:///home/jonas/src/telco-7.0/ based on revid:jonas@stripped
4384 Jonas Oreland 2011-05-17
ndb - add a seqlock implementation
to be used with mt-tc
added:
storage/ndb/src/kernel/vm/NdbSeqLock.hpp
modified:
storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp
=== modified file 'storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2011-04-21 09:21:18 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp 2011-05-17 07:06:30 +0000
@@ -28,6 +28,7 @@
#include <signaldata/CopyGCIReq.hpp>
#include <blocks/mutexes.hpp>
#include <signaldata/LCP.hpp>
+#include <NdbSeqLock.hpp>
#ifdef DBDIH_C
@@ -441,7 +442,15 @@ public:
* TO LOCATE A FRAGMENT AND TO TRANSLATE A KEY OF A TUPLE TO THE FRAGMENT IT
* BELONGS
*/
- struct TabRecord {
+ struct TabRecord
+ {
+ /**
+ * rw-lock that protects multiple parallel DIGETNODES (readers) from
+ * updates to fragmenation changes (e.g CREATE_FRAGREQ)...
+ * search for DIH_TAB_WRITE_LOCK
+ */
+ NdbSeqLock m_lock;
+
/**
* State for copying table description into pages
*/
=== added file 'storage/ndb/src/kernel/vm/NdbSeqLock.hpp'
--- a/storage/ndb/src/kernel/vm/NdbSeqLock.hpp 1970-01-01 00:00:00 +0000
+++ b/storage/ndb/src/kernel/vm/NdbSeqLock.hpp 2011-05-17 07:06:30 +0000
@@ -0,0 +1,95 @@
+/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+
+ 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; version 2 of the License.
+
+ 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_SEQLOCK_HPP
+#define NDB_SEQLOCK_HPP
+
+#include <ndb_types.h>
+#include "mt-asm.h"
+
+#if defined (NDB_HAVE_RMB) && defined(NDB_HAVE_WMB)
+struct NdbSeqLock
+{
+ NdbSeqLock() { m_seq = 0;}
+ volatile Uint32 m_seq;
+
+ void write_lock();
+ void write_unlock();
+
+ Uint32 read_lock();
+ bool read_unlock(Uint32 val) const;
+};
+
+inline
+void
+NdbSeqLock::write_lock()
+{
+ assert((m_seq & 1) == 0);
+ m_seq++;
+ wmb();
+}
+
+inline
+void
+NdbSeqLock::write_unlock()
+{
+ assert((m_seq & 1) == 1);
+ wmb();
+ m_seq++;
+}
+
+inline
+Uint32
+NdbSeqLock::read_lock()
+{
+loop:
+ Uint32 val = m_seq;
+ rmb();
+ if (unlikely(val & 1))
+ {
+#ifdef NDB_HAVE_CPU_PAUSE
+ cpu_pause();
+#endif
+ goto loop;
+ }
+ return val;
+}
+
+inline
+bool
+NdbSeqLock::read_unlock(Uint32 val) const
+{
+ rmb();
+ return val == m_seq;
+}
+#else /** ! rmb() or wmb() */
+/**
+ * Only for ndbd...
+ */
+
+struct NdbSeqLock
+{
+ NdbSeqLock() { }
+
+ void write_lock() {}
+ void write_unlock() {}
+
+ Uint32 read_lock() {}
+ bool read_unlock(Uint32 val) const { return true;}
+};
+
+#endif
+
+#endif
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20110517070630-juu4odg79157acpj.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-7.0 branch (jonas:4384) | Jonas Oreland | 17 May |