From 32f87321a5a82c1f625909186767982a49c6f993 Mon Sep 17 00:00:00 2001
From: Sergey Vojtovich <svoj@mariadb.org>
Date: Tue, 23 Jul 2013 18:03:23 +0400
Subject: [PATCH] =?UTF-8?q?MDEV-4786=20-=20merge=2010.0-monty=20=E2=86=92?=
 =?UTF-8?q?=2010.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fixed test_sql_discovery compilation failure.

storage/test_sql_discovery/mysql-test/archive/discover.rdiff:
  archive.discover result has changed during merge. Adjusted discover.rdiff
  accordingly.
storage/test_sql_discovery/test_sql_discovery.cc:
  Adjusted test_sql_discovery according to:
  WL#4305 - storage-engine private data area per physical table.
---
 .../mysql-test/archive/discover.rdiff         |  4 +-
 .../test_sql_discovery/test_sql_discovery.cc  | 56 ++++++++++---------
 2 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/storage/test_sql_discovery/mysql-test/archive/discover.rdiff b/storage/test_sql_discovery/mysql-test/archive/discover.rdiff
index 3148999079f..c8be9fde63e 100644
--- a/storage/test_sql_discovery/mysql-test/archive/discover.rdiff
+++ b/storage/test_sql_discovery/mysql-test/archive/discover.rdiff
@@ -28,8 +28,8 @@
  drop table t0;
  show status like 'Handler_discover';
  Variable_name	Value
--Handler_discover	7
-+Handler_discover	8
+-Handler_discover	6
++Handler_discover	7
  #
  # Bug#45377: ARCHIVE tables aren't discoverable after OPTIMIZE
  #
diff --git a/storage/test_sql_discovery/test_sql_discovery.cc b/storage/test_sql_discovery/test_sql_discovery.cc
index 33438035b8d..5c4294dc49b 100644
--- a/storage/test_sql_discovery/test_sql_discovery.cc
+++ b/storage/test_sql_discovery/test_sql_discovery.cc
@@ -40,18 +40,25 @@ static struct st_mysql_sys_var *sysvars[] = {
   NULL
 };
 
-typedef struct st_share {
-  const char *name;
+class SHARE : public Handler_share {
+public:
   THR_LOCK lock;
-  uint use_count;
-  struct st_share *next;
-} SHARE;
+  SHARE()
+  {
+    thr_lock_init(&lock);
+  }
+  ~SHARE()
+  {
+    thr_lock_delete(&lock);
+  }
+};
 
 class ha_tsd: public handler
 {
 private:
   THR_LOCK_DATA lock;
   SHARE *share;
+  SHARE *get_share();
 
 public:
   ha_tsd(handlerton *hton, TABLE_SHARE *table_arg)
@@ -87,39 +94,34 @@ class ha_tsd: public handler
   int close(void);
 };
 
-static SHARE *find_or_create_share(const char *table_name, TABLE *table)
+SHARE *ha_tsd::get_share()
 {
-  SHARE *share;
-  for (share = (SHARE*)table->s->ha_data; share; share = share->next)
-    if (my_strcasecmp(table_alias_charset, table_name, share->name) == 0)
-      return share;
-
-  share = (SHARE*)alloc_root(&table->s->mem_root, sizeof(*share));
-  bzero(share, sizeof(*share));
-  share->name = strdup_root(&table->s->mem_root, table_name);
-  share->next = (SHARE*)table->s->ha_data;
-  table->s->ha_data = share;
-  return share;
+  SHARE *tmp_share;
+  lock_shared_ha_data();
+  if (!(tmp_share= static_cast<SHARE*>(get_ha_share_ptr())))
+  {
+    tmp_share= new SHARE;
+    if (!tmp_share)
+      goto err;
+
+    set_ha_share_ptr(static_cast<Handler_share*>(tmp_share));
+  }
+err:
+  unlock_shared_ha_data();
+  return tmp_share;
 }
 
 int ha_tsd::open(const char *name, int mode, uint test_if_locked)
 {
-  mysql_mutex_lock(&table->s->LOCK_ha_data);
-  share = find_or_create_share(name, table);
-  if (share->use_count++ == 0)
-    thr_lock_init(&share->lock);
-  mysql_mutex_unlock(&table->s->LOCK_ha_data);
-  thr_lock_data_init(&share->lock,&lock,NULL);
+  if (!(share= get_share()))
+    return HA_ERR_OUT_OF_MEM;
 
+  thr_lock_data_init(&share->lock,&lock,NULL);
   return 0;
 }
 
 int ha_tsd::close(void)
 {
-  mysql_mutex_lock(&table->s->LOCK_ha_data);
-  if (--share->use_count == 0)
-    thr_lock_delete(&share->lock);
-  mysql_mutex_unlock(&table->s->LOCK_ha_data);
   return 0;
 }
 
-- 
2.30.9