summaryrefslogtreecommitdiff
path: root/storage/innobase/include/ut0mutex.ic
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/include/ut0mutex.ic')
-rw-r--r--storage/innobase/include/ut0mutex.ic108
1 files changed, 108 insertions, 0 deletions
diff --git a/storage/innobase/include/ut0mutex.ic b/storage/innobase/include/ut0mutex.ic
new file mode 100644
index 00000000000..04f1ecd2a85
--- /dev/null
+++ b/storage/innobase/include/ut0mutex.ic
@@ -0,0 +1,108 @@
+/*****************************************************************************
+
+Copyright (c) 2013, 2015, Oracle and/or its affiliates. All Rights Reserved.
+
+Portions of this file contain modifications contributed and copyrighted by
+Google, Inc. Those modifications are gratefully acknowledged and are described
+briefly in the InnoDB documentation. The contributions by Google are
+incorporated with their permission, and subject to the conditions contained in
+the file COPYING.Google.
+
+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 Street, Suite 500, Boston, MA 02110-1335 USA
+
+*****************************************************************************/
+
+/**************************************************//**
+@file include/ut0mutex.ic
+Mutex implementation include file
+
+Created 2012/08/21 Sunny Bains
+*******************************************************/
+
+#include "sync0arr.h"
+#include "sync0debug.h"
+
+/**
+Wait in the sync array.
+@return true if the mutex acquisition was successful. */
+
+template <template <typename> class Policy>
+bool
+TTASEventMutex<Policy>::wait(
+ const char* filename,
+ uint32_t line,
+ uint32_t spin)
+ UNIV_NOTHROW
+{
+ sync_cell_t* cell;
+ sync_array_t* sync_arr;
+
+ sync_arr = sync_array_get_and_reserve_cell(
+ this,
+ (m_policy.get_id() == LATCH_ID_BUF_BLOCK_MUTEX
+ || m_policy.get_id() == LATCH_ID_BUF_POOL_ZIP)
+ ? SYNC_BUF_BLOCK
+ : SYNC_MUTEX,
+ filename, line, &cell);
+
+ /* The memory order of the array reservation and
+ the change in the waiters field is important: when
+ we suspend a thread, we first reserve the cell and
+ then set waiters field to 1. When threads are released
+ in mutex_exit, the waiters field is first set to zero
+ and then the event is set to the signaled state. */
+
+ set_waiters();
+
+ /* Try to reserve still a few times. */
+
+ for (uint32_t i = 0; i < spin; ++i) {
+
+ if (try_lock()) {
+
+ sync_array_free_cell(sync_arr, cell);
+
+ /* Note that in this case we leave
+ the waiters field set to 1. We cannot
+ reset it to zero, as we do not know if
+ there are other waiters. */
+
+ return(true);
+ }
+ }
+
+ /* Now we know that there has been some thread
+ holding the mutex after the change in the wait
+ array and the waiters field was made. Now there
+ is no risk of infinite wait on the event. */
+
+ sync_array_wait_event(sync_arr, cell);
+
+ return(false);
+}
+
+
+/** Wakeup any waiting thread(s). */
+
+template <template <typename> class Policy>
+void
+TTASEventMutex<Policy>::signal() UNIV_NOTHROW
+{
+ clear_waiters();
+
+ /* The memory order of resetting the waiters field and
+ signaling the object is important. See LEMMA 1 above. */
+ os_event_set(m_event);
+
+ sync_array_object_signalled();
+}