summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
Diffstat (limited to 'mysys')
-rw-r--r--mysys/my_init.c20
-rw-r--r--mysys/my_safehash.c16
-rw-r--r--mysys/my_safehash.h2
-rw-r--r--mysys/my_uuid.c10
-rw-r--r--mysys/mysys_priv.h4
-rw-r--r--mysys/waiting_threads.c26
6 files changed, 47 insertions, 31 deletions
diff --git a/mysys/my_init.c b/mysys/my_init.c
index b8398465e74..92da047a3fb 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -479,7 +479,7 @@ PSI_mutex_key key_BITMAP_mutex, key_IO_CACHE_append_buffer_lock,
key_THR_LOCK_isam, key_THR_LOCK_lock, key_THR_LOCK_malloc,
key_THR_LOCK_mutex, key_THR_LOCK_myisam, key_THR_LOCK_net,
key_THR_LOCK_open, key_THR_LOCK_threads,
- key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap;
+ key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap, key_LOCK_uuid_generator;
static PSI_mutex_info all_mysys_mutexes[]=
{
@@ -506,12 +506,13 @@ static PSI_mutex_info all_mysys_mutexes[]=
{ &key_THR_LOCK_open, "THR_LOCK_open", PSI_FLAG_GLOBAL},
{ &key_THR_LOCK_threads, "THR_LOCK_threads", PSI_FLAG_GLOBAL},
{ &key_TMPDIR_mutex, "TMPDIR_mutex", PSI_FLAG_GLOBAL},
- { &key_THR_LOCK_myisam_mmap, "THR_LOCK_myisam_mmap", PSI_FLAG_GLOBAL}
+ { &key_THR_LOCK_myisam_mmap, "THR_LOCK_myisam_mmap", PSI_FLAG_GLOBAL},
+ { &key_LOCK_uuid_generator, "LOCK_uuid_generator", PSI_FLAG_GLOBAL }
};
PSI_cond_key key_COND_alarm, key_IO_CACHE_SHARE_cond,
key_IO_CACHE_SHARE_cond_writer, key_my_thread_var_suspend,
- key_THR_COND_threads;
+ key_THR_COND_threads, key_WT_RESOURCE_cond;
static PSI_cond_info all_mysys_conds[]=
{
@@ -519,7 +520,15 @@ static PSI_cond_info all_mysys_conds[]=
{ &key_IO_CACHE_SHARE_cond, "IO_CACHE_SHARE::cond", 0},
{ &key_IO_CACHE_SHARE_cond_writer, "IO_CACHE_SHARE::cond_writer", 0},
{ &key_my_thread_var_suspend, "my_thread_var::suspend", 0},
- { &key_THR_COND_threads, "THR_COND_threads", 0}
+ { &key_THR_COND_threads, "THR_COND_threads", PSI_FLAG_GLOBAL},
+ { &key_WT_RESOURCE_cond, "WT_RESOURCE::cond", 0}
+};
+
+PSI_rwlock_key key_SAFEHASH_mutex;
+
+static PSI_rwlock_info all_mysys_rwlocks[]=
+{
+ { &key_SAFEHASH_mutex, "SAFE_HASH::mutex", 0}
};
#ifdef USE_ALARM_THREAD
@@ -559,6 +568,9 @@ void my_init_mysys_psi_keys()
count= sizeof(all_mysys_conds)/sizeof(all_mysys_conds[0]);
PSI_server->register_cond(category, all_mysys_conds, count);
+ count= sizeof(all_mysys_rwlocks)/sizeof(all_mysys_rwlocks[0]);
+ PSI_server->register_rwlock(category, all_mysys_rwlocks, count);
+
#ifdef USE_ALARM_THREAD
count= sizeof(all_mysys_threads)/sizeof(all_mysys_threads[0]);
PSI_server->register_thread(category, all_mysys_threads, count);
diff --git a/mysys/my_safehash.c b/mysys/my_safehash.c
index 08c94a1d7c8..1417b8ea94e 100644
--- a/mysys/my_safehash.c
+++ b/mysys/my_safehash.c
@@ -107,7 +107,7 @@ my_bool safe_hash_init(SAFE_HASH *hash, uint elements,
hash->default_value= 0;
DBUG_RETURN(1);
}
- my_rwlock_init(&hash->mutex, 0);
+ mysql_rwlock_init(key_SAFEHASH_mutex, &hash->mutex);
hash->default_value= default_value;
hash->root= 0;
DBUG_RETURN(0);
@@ -134,7 +134,7 @@ void safe_hash_free(SAFE_HASH *hash)
if (hash->default_value)
{
my_hash_free(&hash->hash);
- rwlock_destroy(&hash->mutex);
+ mysql_rwlock_destroy(&hash->mutex);
hash->default_value=0;
}
}
@@ -159,9 +159,9 @@ uchar *safe_hash_search(SAFE_HASH *hash, const uchar *key, uint length,
{
uchar *result;
DBUG_ENTER("safe_hash_search");
- rw_rdlock(&hash->mutex);
+ mysql_rwlock_rdlock(&hash->mutex);
result= my_hash_search(&hash->hash, key, length);
- rw_unlock(&hash->mutex);
+ mysql_rwlock_unlock(&hash->mutex);
if (!result)
result= def;
else
@@ -199,7 +199,7 @@ my_bool safe_hash_set(SAFE_HASH *hash, const uchar *key, uint length,
DBUG_ENTER("safe_hash_set");
DBUG_PRINT("enter",("key: %.*s data: 0x%lx", length, key, (long) data));
- rw_wrlock(&hash->mutex);
+ mysql_rwlock_wrlock(&hash->mutex);
entry= (SAFE_HASH_ENTRY*) my_hash_search(&hash->hash, key, length);
if (data == hash->default_value)
@@ -249,7 +249,7 @@ my_bool safe_hash_set(SAFE_HASH *hash, const uchar *key, uint length,
}
end:
- rw_unlock(&hash->mutex);
+ mysql_rwlock_unlock(&hash->mutex);
DBUG_RETURN(error);
}
@@ -274,7 +274,7 @@ void safe_hash_change(SAFE_HASH *hash, uchar *old_data, uchar *new_data)
SAFE_HASH_ENTRY *entry, *next;
DBUG_ENTER("safe_hash_change");
- rw_wrlock(&hash->mutex);
+ mysql_rwlock_wrlock(&hash->mutex);
for (entry= hash->root ; entry ; entry= next)
{
@@ -292,6 +292,6 @@ void safe_hash_change(SAFE_HASH *hash, uchar *old_data, uchar *new_data)
}
}
- rw_unlock(&hash->mutex);
+ mysql_rwlock_unlock(&hash->mutex);
DBUG_VOID_RETURN;
}
diff --git a/mysys/my_safehash.h b/mysys/my_safehash.h
index b5c0ca6634b..e52fee68b57 100644
--- a/mysys/my_safehash.h
+++ b/mysys/my_safehash.h
@@ -39,7 +39,7 @@ typedef struct st_safe_hash_entry
typedef struct st_safe_hash_with_default
{
- rw_lock_t mutex;
+ mysql_rwlock_t mutex;
HASH hash;
uchar *default_value;
SAFE_HASH_ENTRY *root;
diff --git a/mysys/my_uuid.c b/mysys/my_uuid.c
index b82ce860c63..0c4d34ace8b 100644
--- a/mysys/my_uuid.c
+++ b/mysys/my_uuid.c
@@ -49,7 +49,7 @@ static uint nanoseq;
static ulonglong uuid_time= 0;
static uchar uuid_suffix[2+6]; /* clock_seq and node */
-pthread_mutex_t LOCK_uuid_generator;
+mysql_mutex_t LOCK_uuid_generator;
/*
Number of 100-nanosecond intervals between
@@ -112,7 +112,7 @@ void my_uuid_init(ulong seed1, ulong seed2)
}
my_rnd_init(&uuid_rand, (ulong) (seed1 + now), (ulong) (now/2+ getpid()));
set_clock_seq();
- pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
+ mysql_mutex_init(key_LOCK_uuid_generator, &LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
}
@@ -131,7 +131,7 @@ void my_uuid(uchar *to)
DBUG_ASSERT(my_uuid_inited);
- pthread_mutex_lock(&LOCK_uuid_generator);
+ mysql_mutex_lock(&LOCK_uuid_generator);
tv= my_getsystime() + UUID_TIME_OFFSET + nanoseq;
if (likely(tv > uuid_time))
@@ -192,7 +192,7 @@ void my_uuid(uchar *to)
}
uuid_time=tv;
- pthread_mutex_unlock(&LOCK_uuid_generator);
+ mysql_mutex_unlock(&LOCK_uuid_generator);
time_low= (uint32) (tv & 0xFFFFFFFF);
time_mid= (uint16) ((tv >> 32) & 0xFFFF);
@@ -236,6 +236,6 @@ void my_uuid_end()
if (my_uuid_inited)
{
my_uuid_inited= 0;
- pthread_mutex_destroy(&LOCK_uuid_generator);
+ mysql_mutex_destroy(&LOCK_uuid_generator);
}
}
diff --git a/mysys/mysys_priv.h b/mysys/mysys_priv.h
index af7939376a6..2f669878f49 100644
--- a/mysys/mysys_priv.h
+++ b/mysys/mysys_priv.h
@@ -41,7 +41,7 @@ extern PSI_mutex_key key_BITMAP_mutex, key_IO_CACHE_append_buffer_lock,
key_my_thread_var_mutex, key_THR_LOCK_charset, key_THR_LOCK_heap,
key_THR_LOCK_isam, key_THR_LOCK_lock, key_THR_LOCK_malloc,
key_THR_LOCK_mutex, key_THR_LOCK_myisam, key_THR_LOCK_net,
- key_THR_LOCK_open, key_THR_LOCK_threads,
+ key_THR_LOCK_open, key_THR_LOCK_threads, key_LOCK_uuid_generator,
key_TMPDIR_mutex, key_THR_LOCK_myisam_mmap;
extern PSI_cond_key key_COND_alarm, key_IO_CACHE_SHARE_cond,
@@ -52,6 +52,8 @@ extern PSI_cond_key key_COND_alarm, key_IO_CACHE_SHARE_cond,
extern PSI_thread_key key_thread_alarm;
#endif /* USE_ALARM_THREAD */
+extern PSI_rwlock_key key_SAFEHASH_mutex;
+
#endif /* HAVE_PSI_INTERFACE */
extern mysql_mutex_t THR_LOCK_malloc, THR_LOCK_open, THR_LOCK_keycache;
diff --git a/mysys/waiting_threads.c b/mysys/waiting_threads.c
index 732929f6d99..f8980185ae0 100644
--- a/mysys/waiting_threads.c
+++ b/mysys/waiting_threads.c
@@ -193,6 +193,8 @@ uint32 wt_success_stats;
static my_atomic_rwlock_t cycle_stats_lock, wait_stats_lock, success_stats_lock;
+extern PSI_cond_key key_WT_RESOURCE_cond;
+
#ifdef SAFE_STATISTICS
#define incr(VAR, LOCK) \
do { \
@@ -253,7 +255,7 @@ struct st_wt_resource {
uint waiter_count;
enum { ACTIVE, FREE } state;
#ifndef DBUG_OFF
- pthread_mutex_t *cond_mutex; /* a mutex for the 'cond' below */
+ mysql_mutex_t *cond_mutex; /* a mutex for the 'cond' below */
#endif
/*
before the 'lock' all elements are mutable, after (and including) -
@@ -301,7 +303,7 @@ struct st_wt_resource {
#else
rw_lock_t lock;
#endif
- pthread_cond_t cond; /* the corresponding mutex is provided by the caller */
+ mysql_cond_t cond; /* the corresponding mutex is provided by the caller */
DYNAMIC_ARRAY owners;
};
@@ -398,7 +400,7 @@ static void wt_resource_init(uchar *arg)
bzero(rc, sizeof(*rc));
rc_rwlock_init(rc);
- pthread_cond_init(&rc->cond, 0);
+ mysql_cond_init(key_WT_RESOURCE_cond, &rc->cond, 0);
my_init_dynamic_array(&rc->owners, sizeof(WT_THD *), 0, 5);
DBUG_VOID_RETURN;
}
@@ -416,7 +418,7 @@ static void wt_resource_destroy(uchar *arg)
DBUG_ASSERT(rc->owners.elements == 0);
rc_rwlock_destroy(rc);
- pthread_cond_destroy(&rc->cond);
+ mysql_cond_destroy(&rc->cond);
delete_dynamic(&rc->owners);
DBUG_VOID_RETURN;
}
@@ -795,7 +797,7 @@ static int deadlock(WT_THD *thd, WT_THD *blocker, uint depth,
{
DBUG_PRINT("wt", ("killing %s", arg.victim->name));
arg.victim->killed= 1;
- pthread_cond_broadcast(&arg.victim->waiting_for->cond);
+ mysql_cond_broadcast(&arg.victim->waiting_for->cond);
rc_unlock(arg.victim->waiting_for);
ret= WT_OK;
}
@@ -1029,11 +1031,11 @@ retry:
called by a *waiter* (thd) to start waiting
It's supposed to be a drop-in replacement for
- pthread_cond_timedwait(), and it takes mutex as an argument.
+ mysql_cond_timedwait(), and it takes mutex as an argument.
@return one of WT_TIMEOUT, WT_DEADLOCK, WT_OK
*/
-int wt_thd_cond_timedwait(WT_THD *thd, pthread_mutex_t *mutex)
+int wt_thd_cond_timedwait(WT_THD *thd, mysql_mutex_t *mutex)
{
int ret= WT_TIMEOUT;
struct timespec timeout;
@@ -1047,7 +1049,7 @@ int wt_thd_cond_timedwait(WT_THD *thd, pthread_mutex_t *mutex)
DBUG_ASSERT(rc->cond_mutex == mutex);
else
rc->cond_mutex= mutex;
- safe_mutex_assert_owner(mutex);
+ mysql_mutex_assert_owner(mutex);
#endif
before= starttime= my_getsystime();
@@ -1074,7 +1076,7 @@ int wt_thd_cond_timedwait(WT_THD *thd, pthread_mutex_t *mutex)
set_timespec_time_nsec(timeout, starttime, (*thd->timeout_short)*ULL(1000));
if (ret == WT_TIMEOUT && !thd->killed)
- ret= pthread_cond_timedwait(&rc->cond, mutex, &timeout);
+ ret= mysql_cond_timedwait(&rc->cond, mutex, &timeout);
if (ret == WT_TIMEOUT && !thd->killed)
{
int r= deadlock(thd, thd, 0, *thd->deadlock_search_depth_long);
@@ -1086,7 +1088,7 @@ int wt_thd_cond_timedwait(WT_THD *thd, pthread_mutex_t *mutex)
{
set_timespec_time_nsec(timeout, starttime, (*thd->timeout_long)*ULL(1000));
if (!thd->killed)
- ret= pthread_cond_timedwait(&rc->cond, mutex, &timeout);
+ ret= mysql_cond_timedwait(&rc->cond, mutex, &timeout);
}
}
after= my_getsystime();
@@ -1132,10 +1134,10 @@ void wt_thd_release(WT_THD *thd, const WT_RESOURCE_ID *resid)
delete_dynamic_element(&rc->owners, j);
if (rc->owners.elements == 0)
{
- pthread_cond_broadcast(&rc->cond);
+ mysql_cond_broadcast(&rc->cond);
#ifndef DBUG_OFF
if (rc->cond_mutex)
- safe_mutex_assert_owner(rc->cond_mutex);
+ mysql_mutex_assert_owner(rc->cond_mutex);
#endif
}
unlock_lock_and_free_resource(thd, rc);