aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/libmysql_r/mysys/thr_cond.cc
diff options
context:
space:
mode:
authorhcpp <hcpp@ydb.tech>2023-11-08 12:09:41 +0300
committerhcpp <hcpp@ydb.tech>2023-11-08 12:56:14 +0300
commita361f5b98b98b44ea510d274f6769164640dd5e1 (patch)
treec47c80962c6e2e7b06798238752fd3da0191a3f6 /contrib/libs/libmysql_r/mysys/thr_cond.cc
parent9478806fde1f4d40bd5a45e7cbe77237dab613e9 (diff)
downloadydb-a361f5b98b98b44ea510d274f6769164640dd5e1.tar.gz
metrics have been added
Diffstat (limited to 'contrib/libs/libmysql_r/mysys/thr_cond.cc')
-rw-r--r--contrib/libs/libmysql_r/mysys/thr_cond.cc140
1 files changed, 140 insertions, 0 deletions
diff --git a/contrib/libs/libmysql_r/mysys/thr_cond.cc b/contrib/libs/libmysql_r/mysys/thr_cond.cc
new file mode 100644
index 0000000000..53afd85785
--- /dev/null
+++ b/contrib/libs/libmysql_r/mysys/thr_cond.cc
@@ -0,0 +1,140 @@
+/* Copyright (c) 2014, 2017, 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, version 2.0,
+ as published by the Free Software Foundation.
+
+ This program is also distributed with certain software (including
+ but not limited to OpenSSL) that is licensed under separate terms,
+ as designated in a particular file or component or in included license
+ documentation. The authors of MySQL hereby grant you an additional
+ permission to link the program and your derivative works with the
+ separately licensed software that they have included with MySQL.
+
+ Without limiting anything contained in the foregoing, this file,
+ which is part of C Driver for MySQL (Connector/C), is also subject to the
+ Universal FOSS Exception, version 1.0, a copy of which can be found at
+ http://oss.oracle.com/licenses/universal-foss-exception.
+
+ 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, version 2.0, 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 */
+
+/**
+ @file mysys/thr_cond.cc
+*/
+
+#ifdef SAFE_MUTEX
+
+#include "thr_cond.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "my_thread_local.h"
+
+int safe_cond_wait(native_cond_t *cond, safe_mutex_t *mp, const char *file,
+ uint line) {
+ int error;
+ native_mutex_lock(&mp->global);
+ if (mp->count == 0) {
+ fprintf(
+ stderr,
+ "safe_mutex: Trying to cond_wait on a unlocked mutex at %s, line %d\n",
+ file, line);
+ fflush(stderr);
+ abort();
+ }
+ if (!my_thread_equal(my_thread_self(), mp->thread)) {
+ fprintf(stderr,
+ "safe_mutex: Trying to cond_wait on a mutex at %s, line %d that "
+ "was locked by another thread at: %s, line: %d\n",
+ file, line, mp->file, mp->line);
+ fflush(stderr);
+ abort();
+ }
+
+ if (mp->count-- != 1) {
+ fprintf(stderr,
+ "safe_mutex: Count was %d on locked mutex at %s, line %d\n",
+ mp->count + 1, file, line);
+ fflush(stderr);
+ abort();
+ }
+ native_mutex_unlock(&mp->global);
+ error = native_cond_wait(cond, &mp->mutex);
+ native_mutex_lock(&mp->global);
+ if (error) {
+ fprintf(stderr,
+ "safe_mutex: Got error: %d (%d) when doing a safe_mutex_wait at "
+ "%s, line %d\n",
+ error, errno, file, line);
+ fflush(stderr);
+ abort();
+ }
+ mp->thread = my_thread_self();
+ if (mp->count++) {
+#ifndef DBUG_OFF
+ fprintf(stderr,
+ "safe_mutex: Count was %d in thread 0x%x when locking mutex at "
+ "%s, line %d\n",
+ mp->count - 1, my_thread_var_id(), file, line);
+ fflush(stderr);
+#endif
+ abort();
+ }
+ mp->file = file;
+ mp->line = line;
+ native_mutex_unlock(&mp->global);
+ return error;
+}
+
+int safe_cond_timedwait(native_cond_t *cond, safe_mutex_t *mp,
+ const struct timespec *abstime, const char *file,
+ uint line) {
+ int error;
+ native_mutex_lock(&mp->global);
+ if (mp->count != 1 || !my_thread_equal(my_thread_self(), mp->thread)) {
+ fprintf(
+ stderr,
+ "safe_mutex: Trying to cond_wait at %s, line %d on a not hold mutex\n",
+ file, line);
+ fflush(stderr);
+ abort();
+ }
+ mp->count--; /* Mutex will be released */
+ native_mutex_unlock(&mp->global);
+ error = native_cond_timedwait(cond, &mp->mutex, abstime);
+#ifdef EXTRA_DEBUG
+ if (error != 0 && error != EINTR && !is_timeout(error)) {
+ fprintf(stderr,
+ "safe_mutex: Got error: %d (%d) when doing a safe_cond_timedwait "
+ "at %s, line %d\n",
+ error, errno, file, line);
+ }
+#endif
+ native_mutex_lock(&mp->global);
+ mp->thread = my_thread_self();
+ if (mp->count++) {
+#ifndef DBUG_OFF
+ fprintf(stderr,
+ "safe_mutex: Count was %d in thread 0x%x when locking mutex at "
+ "%s, line %d (error: %d (%d))\n",
+ mp->count - 1, my_thread_var_id(), file, line, error, error);
+ fflush(stderr);
+#endif
+ abort();
+ }
+ mp->file = file;
+ mp->line = line;
+ native_mutex_unlock(&mp->global);
+ return error;
+}
+
+#endif