aboutsummaryrefslogtreecommitdiff
path: root/mysql/mysql/service_locking.h
diff options
context:
space:
mode:
Diffstat (limited to 'mysql/mysql/service_locking.h')
-rw-r--r--mysql/mysql/service_locking.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/mysql/mysql/service_locking.h b/mysql/mysql/service_locking.h
new file mode 100644
index 0000000..06f02d2
--- /dev/null
+++ b/mysql/mysql/service_locking.h
@@ -0,0 +1,114 @@
+/*
+ Copyright (c) 2015, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef SERVICE_LOCKING_INCLUDED
+#define SERVICE_LOCKING_INCLUDED
+
+/*
+ This service provides support for taking read/write locks.
+ It is intended for use with fabric, but it is still a general
+ service. The locks are in a separate namespace from other
+ locks in the server, and there is also no interactions with
+ transactions (i.e. locks are not released on commit/abort).
+
+ These locks are implemented using the metadata lock (MDL) subsystem
+ and thus deadlocks involving locking service locks and other types
+ of metadata will be detected using the MDL deadlock detector.
+*/
+
+#ifdef __cplusplus
+class THD;
+#define MYSQL_THD THD*
+#else
+#define MYSQL_THD void*
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ Types of locking service locks.
+ LOCKING_SERVICE_READ is compatible with LOCKING_SERVICE_READ.
+ All other combinations are incompatible.
+*/
+enum enum_locking_service_lock_type
+{ LOCKING_SERVICE_READ, LOCKING_SERVICE_WRITE };
+
+extern struct mysql_locking_service_st {
+ /**
+ Acquire locking service locks.
+
+ @param opaque_thd Thread handle. If NULL, current_thd will be used.
+ @param lock_namespace Namespace of the locks to acquire.
+ @param lock_names Array of names of the locks to acquire.
+ @param lock_num Number of elements in 'lock_names'.
+ @param lock_type Lock type to acquire. LOCKING_SERVICE_READ or _WRITE.
+ @param lock_timeout Number of seconds to wait before giving up.
+
+ @retval 1 Acquisition failed, error has been reported.
+ @retval 0 Acquisition successful, all locks acquired.
+
+ @note both lock_namespace and lock_names are limited to 64 characters max.
+ Names are compared using binary comparison.
+ */
+ int (*mysql_acquire_locks)(MYSQL_THD opaque_thd, const char* lock_namespace,
+ const char**lock_names, size_t lock_num,
+ enum enum_locking_service_lock_type lock_type,
+ unsigned long lock_timeout);
+
+ /**
+ Release all lock service locks taken by the given connection
+ in the given namespace.
+
+ @param opaque_thd Thread handle. If NULL, current_thd will be used.
+ @param lock_namespace Namespace of the locks to release.
+
+ @retval 1 Release failed, error has been reported.
+ @retval 0 Release successful, all locks acquired.
+ */
+ int (*mysql_release_locks)(MYSQL_THD opaque_thd, const char* lock_namespace);
+} *mysql_locking_service;
+
+#ifdef MYSQL_DYNAMIC_PLUGIN
+
+#define mysql_acquire_locking_service_locks(_THD, _NAMESPACE, _NAMES, _NUM, \
+ _TYPE, _TIMEOUT) \
+ mysql_locking_service->mysql_acquire_locks(_THD, _NAMESPACE, _NAMES, _NUM, \
+ _TYPE, _TIMEOUT)
+#define mysql_release_locking_service_locks(_THD, _NAMESPACE) \
+ mysql_locking_service->mysql_release_locks(_THD, _NAMESPACE)
+
+#else
+
+int mysql_acquire_locking_service_locks(MYSQL_THD opaque_thd,
+ const char* lock_namespace,
+ const char**lock_names,
+ size_t lock_num,
+ enum enum_locking_service_lock_type lock_type,
+ unsigned long lock_timeout);
+
+int mysql_release_locking_service_locks(MYSQL_THD opaque_thd,
+ const char* lock_namespace);
+
+#endif /* MYSQL_DYNAMIC_PLUGIN */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SERVICE_LOCKING_INCLUDED */