List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:May 17 2011 7:06am
Subject:bzr commit into mysql-5.1-telco-7.0 branch (jonas:4384)
View as plain text  
#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 Oreland17 May