1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

[MDEV-28162] Replace PFS_atomic with std::atomic<T>

PFS_atomic class contains wrappers around my_atomic_* operations, which
are macros to GNU atomic operations (__atomic_*). Due to different
implementations of compilers, clang may encounter errors when compiling
on x86_32 architecture.

The following functions are replaced with C++ std::atomic type in
performance schema code base:
  - PFS_atomic::store_*()
      -> my_atomic_store*
        -> __atomic_store_n()
    => std::atomic<T>::store()

  - PFS_atomic::load_*()
      -> my_atomic_load*
        -> __atomic_load_n()
    => std::atomic<T>::load()

  - PFS_atomic::add_*()
      -> my_atomic_add*
        -> __atomic_fetch_add()
    => std::atomic<T>::fetch_add()

  - PFS_atomic::cas_*()
    -> my_atomic_cas*
      -> __atomic_compare_exchange_n()
    => std::atomic<T>::compare_exchange_strong()

and PFS_atomic class could be dropped completely.

Note that in the wrapper memory order passed to original GNU atomic
extensions are hard-coded as `__ATOMIC_SEQ_CST`, which is equivalent to
`std::memory_order_seq_cst` in C++, and is the default parameter for
std::atomic_* functions.

All new code of the whole pull request, including one or several files
that are either new files or modified ones, are contributed under the
BSD-new license. I am contributing on behalf of my employer Amazon Web
Services.
This commit is contained in:
Meng-Hsiu Chiang
2023-12-06 19:48:53 +00:00
committed by Marko Mäkelä
parent d5bad49011
commit 55db59f16d
18 changed files with 109 additions and 248 deletions

View File

@@ -49,7 +49,6 @@ cursor_by_thread.h
cursor_by_user.h cursor_by_user.h
pfs.h pfs.h
pfs_account.h pfs_account.h
pfs_atomic.h
pfs_buffer_container.h pfs_buffer_container.h
pfs_builtin_memory.h pfs_builtin_memory.h
pfs_column_types.h pfs_column_types.h

View File

@@ -27,6 +27,7 @@
@file storage/perfschema/pfs_account.h @file storage/perfschema/pfs_account.h
Performance schema account (declarations). Performance schema account (declarations).
*/ */
#include <atomic>
#include "pfs_lock.h" #include "pfs_lock.h"
#include "lf.h" #include "lf.h"
@@ -62,22 +63,22 @@ struct PFS_ALIGNED PFS_account : PFS_connection_slice
public: public:
inline void init_refcount(void) inline void init_refcount(void)
{ {
PFS_atomic::store_32(& m_refcount, 1); m_refcount.store(1);
} }
inline int get_refcount(void) inline int get_refcount(void)
{ {
return PFS_atomic::load_32(& m_refcount); return m_refcount.load();
} }
inline void inc_refcount(void) inline void inc_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, 1); m_refcount.fetch_add(1);
} }
inline void dec_refcount(void) inline void dec_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, -1); m_refcount.fetch_sub(1);
} }
void aggregate(bool alive, PFS_user *safe_user, PFS_host *safe_host); void aggregate(bool alive, PFS_user *safe_user, PFS_host *safe_host);
@@ -109,7 +110,7 @@ public:
ulonglong m_disconnected_count; ulonglong m_disconnected_count;
private: private:
int m_refcount; std::atomic<int> m_refcount;
}; };
int init_account(const PFS_global_param *param); int init_account(const PFS_global_param *param);

View File

@@ -1,141 +0,0 @@
/* Copyright (c) 2009, 2023, Oracle and/or its affiliates.
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.
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,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#ifndef PFS_ATOMIC_H
#define PFS_ATOMIC_H
/**
@file storage/perfschema/pfs_atomic.h
Atomic operations (declarations).
*/
#include <my_atomic.h>
/** Helper for atomic operations. */
class PFS_atomic
{
public:
/** Atomic load. */
static inline int32 load_32(int32 *ptr)
{
return my_atomic_load32(ptr);
}
/** Atomic load. */
static inline int64 load_64(int64 *ptr)
{
return my_atomic_load64(ptr);
}
/** Atomic load. */
static inline uint32 load_u32(uint32 *ptr)
{
return (uint32) my_atomic_load32((int32*) ptr);
}
/** Atomic load. */
static inline uint64 load_u64(uint64 *ptr)
{
return (uint64) my_atomic_load64((int64*) ptr);
}
/** Atomic store. */
static inline void store_32(int32 *ptr, int32 value)
{
my_atomic_store32(ptr, value);
}
/** Atomic store. */
static inline void store_64(int64 *ptr, int64 value)
{
my_atomic_store64(ptr, value);
}
/** Atomic store. */
static inline void store_u32(uint32 *ptr, uint32 value)
{
my_atomic_store32((int32*) ptr, (int32) value);
}
/** Atomic store. */
static inline void store_u64(uint64 *ptr, uint64 value)
{
my_atomic_store64((int64*) ptr, (int64) value);
}
/** Atomic add. */
static inline int32 add_32(int32 *ptr, int32 value)
{
return my_atomic_add32(ptr, value);
}
/** Atomic add. */
static inline int64 add_64(int64 *ptr, int64 value)
{
return my_atomic_add64(ptr, value);
}
/** Atomic add. */
static inline uint32 add_u32(uint32 *ptr, uint32 value)
{
return (uint32) my_atomic_add32((int32*) ptr, (int32) value);
}
/** Atomic add. */
static inline uint64 add_u64(uint64 *ptr, uint64 value)
{
return (uint64) my_atomic_add64((int64*) ptr, (int64) value);
}
/** Atomic compare and swap. */
static inline bool cas_32(int32 *ptr, int32 *old_value,
int32 new_value)
{
return my_atomic_cas32(ptr, old_value, new_value);
}
/** Atomic compare and swap. */
static inline bool cas_64(int64 *ptr, int64 *old_value,
int64 new_value)
{
return my_atomic_cas64(ptr, old_value, new_value);
}
/** Atomic compare and swap. */
static inline bool cas_u32(uint32 *ptr, uint32 *old_value,
uint32 new_value)
{
return my_atomic_cas32((int32*) ptr, (int32*) old_value,
(uint32) new_value);
}
/** Atomic compare and swap. */
static inline bool cas_u64(uint64 *ptr, uint64 *old_value,
uint64 new_value)
{
return my_atomic_cas64((int64*) ptr, (int64*) old_value,
(uint64) new_value);
}
};
#endif

View File

@@ -87,7 +87,7 @@ public:
if (m_full) if (m_full)
return NULL; return NULL;
monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); monotonic= m_monotonic.m_u32.fetch_add(1);
monotonic_max= monotonic + static_cast<uint>(m_max); monotonic_max= monotonic + static_cast<uint>(m_max);
while (monotonic < monotonic_max) while (monotonic < monotonic_max)
@@ -99,7 +99,8 @@ public:
{ {
return pfs; return pfs;
} }
monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); monotonic= m_monotonic.m_u32.fetch_add(1);
} }
m_full= true; m_full= true;
@@ -517,7 +518,7 @@ public:
ulong get_row_count() ulong get_row_count()
{ {
ulong page_count= PFS_atomic::load_u32(& m_max_page_index.m_u32); ulong page_count= m_max_page_index.m_u32.load();
return page_count * PFS_PAGE_SIZE; return page_count * PFS_PAGE_SIZE;
} }
@@ -554,11 +555,11 @@ public:
/* /*
1: Try to find an available record within the existing pages 1: Try to find an available record within the existing pages
*/ */
current_page_count= PFS_atomic::load_u32(& m_max_page_index.m_u32); current_page_count= m_max_page_index.m_u32.load();
if (current_page_count != 0) if (current_page_count != 0)
{ {
monotonic= PFS_atomic::load_u32(& m_monotonic.m_u32); monotonic= m_monotonic.m_u32.load();
monotonic_max= monotonic + current_page_count; monotonic_max= monotonic + current_page_count;
while (monotonic < monotonic_max) while (monotonic < monotonic_max)
@@ -602,7 +603,7 @@ public:
counter faster and then move on to the detection of new pages, counter faster and then move on to the detection of new pages,
in part 2: below. in part 2: below.
*/ */
monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); monotonic= m_monotonic.m_u32.fetch_add(1);
}; };
} }
@@ -683,7 +684,7 @@ public:
my_atomic_storeptr(typed_addr, ptr); my_atomic_storeptr(typed_addr, ptr);
/* Advertise the new page */ /* Advertise the new page */
PFS_atomic::add_u32(& m_max_page_index.m_u32, 1); m_max_page_index.m_u32.fetch_add(1);
} }
pthread_mutex_unlock(& m_critical_section); pthread_mutex_unlock(& m_critical_section);

View File

@@ -75,7 +75,7 @@ int init_digest(const PFS_global_param *param)
*/ */
digest_max= param->m_digest_sizing; digest_max= param->m_digest_sizing;
digest_lost= 0; digest_lost= 0;
PFS_atomic::store_u32(& digest_monotonic_index.m_u32, 1); digest_monotonic_index.m_u32.store(1);
digest_full= false; digest_full= false;
if (digest_max == 0) if (digest_max == 0)
@@ -274,7 +274,7 @@ search:
while (++attempts <= digest_max) while (++attempts <= digest_max)
{ {
safe_index= PFS_atomic::add_u32(& digest_monotonic_index.m_u32, 1) % digest_max; safe_index= digest_monotonic_index.m_u32.fetch_add(1) % digest_max;
if (safe_index == 0) if (safe_index == 0)
{ {
/* Record [0] is reserved. */ /* Record [0] is reserved. */
@@ -406,7 +406,7 @@ void reset_esms_by_digest()
Reset index which indicates where the next calculated digest information Reset index which indicates where the next calculated digest information
to be inserted in statements_digest_stat_array. to be inserted in statements_digest_stat_array.
*/ */
PFS_atomic::store_u32(& digest_monotonic_index.m_u32, 1); digest_monotonic_index.m_u32.store(1);
digest_full= false; digest_full= false;
} }

View File

@@ -34,7 +34,6 @@
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_user.h" #include "pfs_user.h"
#include "pfs_events_stages.h" #include "pfs_events_stages.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "pfs_builtin_memory.h" #include "pfs_builtin_memory.h"
#include "m_string.h" #include "m_string.h"
@@ -62,7 +61,7 @@ int init_events_stages_history_long(uint events_stages_history_long_sizing)
{ {
events_stages_history_long_size= events_stages_history_long_sizing; events_stages_history_long_size= events_stages_history_long_sizing;
events_stages_history_long_full= false; events_stages_history_long_full= false;
PFS_atomic::store_u32(&events_stages_history_long_index.m_u32, 0); events_stages_history_long_index.m_u32.store(0);
if (events_stages_history_long_size == 0) if (events_stages_history_long_size == 0)
return 0; return 0;
@@ -135,7 +134,7 @@ void insert_events_stages_history_long(PFS_events_stages *stage)
assert(events_stages_history_long_array != NULL); assert(events_stages_history_long_array != NULL);
uint index= PFS_atomic::add_u32(&events_stages_history_long_index.m_u32, 1); uint index= events_stages_history_long_index.m_u32.fetch_add(1);
index= index % events_stages_history_long_size; index= index % events_stages_history_long_size;
if (index == 0) if (index == 0)
@@ -176,7 +175,7 @@ void reset_events_stages_history(void)
/** Reset table EVENTS_STAGES_HISTORY_LONG data. */ /** Reset table EVENTS_STAGES_HISTORY_LONG data. */
void reset_events_stages_history_long(void) void reset_events_stages_history_long(void)
{ {
PFS_atomic::store_u32(&events_stages_history_long_index.m_u32, 0); events_stages_history_long_index.m_u32.store(0);
events_stages_history_long_full= false; events_stages_history_long_full= false;
PFS_events_stages *pfs= events_stages_history_long_array; PFS_events_stages *pfs= events_stages_history_long_array;

View File

@@ -34,7 +34,6 @@
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_user.h" #include "pfs_user.h"
#include "pfs_events_statements.h" #include "pfs_events_statements.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "pfs_builtin_memory.h" #include "pfs_builtin_memory.h"
#include "m_string.h" #include "m_string.h"
@@ -64,7 +63,7 @@ int init_events_statements_history_long(size_t events_statements_history_long_si
{ {
events_statements_history_long_size= events_statements_history_long_sizing; events_statements_history_long_size= events_statements_history_long_sizing;
events_statements_history_long_full= false; events_statements_history_long_full= false;
PFS_atomic::store_u32(&events_statements_history_long_index.m_u32, 0); events_statements_history_long_index.m_u32.store(0);
if (events_statements_history_long_size == 0) if (events_statements_history_long_size == 0)
return 0; return 0;
@@ -213,7 +212,7 @@ void insert_events_statements_history_long(PFS_events_statements *statement)
assert(events_statements_history_long_array != NULL); assert(events_statements_history_long_array != NULL);
uint index= PFS_atomic::add_u32(&events_statements_history_long_index.m_u32, 1); uint index= events_statements_history_long_index.m_u32.fetch_add(1);
index= index % events_statements_history_long_size; index= index % events_statements_history_long_size;
if (index == 0) if (index == 0)
@@ -258,7 +257,7 @@ void reset_events_statements_history(void)
/** Reset table EVENTS_STATEMENTS_HISTORY_LONG data. */ /** Reset table EVENTS_STATEMENTS_HISTORY_LONG data. */
void reset_events_statements_history_long(void) void reset_events_statements_history_long(void)
{ {
PFS_atomic::store_u32(&events_statements_history_long_index.m_u32, 0); events_statements_history_long_index.m_u32.store(0);
events_statements_history_long_full= false; events_statements_history_long_full= false;
PFS_events_statements *pfs= events_statements_history_long_array; PFS_events_statements *pfs= events_statements_history_long_array;

View File

@@ -34,7 +34,6 @@
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_user.h" #include "pfs_user.h"
#include "pfs_events_transactions.h" #include "pfs_events_transactions.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "pfs_builtin_memory.h" #include "pfs_builtin_memory.h"
#include "m_string.h" #include "m_string.h"
@@ -62,7 +61,7 @@ int init_events_transactions_history_long(uint events_transactions_history_long_
{ {
events_transactions_history_long_size= events_transactions_history_long_sizing; events_transactions_history_long_size= events_transactions_history_long_sizing;
events_transactions_history_long_full= false; events_transactions_history_long_full= false;
PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0); events_transactions_history_long_index.m_u32.store(0);
if (events_transactions_history_long_size == 0) if (events_transactions_history_long_size == 0)
return 0; return 0;
@@ -135,7 +134,7 @@ void insert_events_transactions_history_long(PFS_events_transactions *transactio
assert(events_transactions_history_long_array != NULL); assert(events_transactions_history_long_array != NULL);
uint index= PFS_atomic::add_u32(&events_transactions_history_long_index.m_u32, 1); uint index= events_transactions_history_long_index.m_u32.fetch_add(1);
index= index % events_transactions_history_long_size; index= index % events_transactions_history_long_size;
if (index == 0) if (index == 0)
@@ -176,7 +175,7 @@ void reset_events_transactions_history(void)
/** Reset table EVENTS_TRANSACTIONS_HISTORY_LONG data. */ /** Reset table EVENTS_TRANSACTIONS_HISTORY_LONG data. */
void reset_events_transactions_history_long(void) void reset_events_transactions_history_long(void)
{ {
PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0); events_transactions_history_long_index.m_u32.store(0);
events_transactions_history_long_full= false; events_transactions_history_long_full= false;
PFS_events_transactions *pfs= events_transactions_history_long_array; PFS_events_transactions *pfs= events_transactions_history_long_array;

View File

@@ -34,7 +34,6 @@
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_account.h" #include "pfs_account.h"
#include "pfs_events_waits.h" #include "pfs_events_waits.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "pfs_builtin_memory.h" #include "pfs_builtin_memory.h"
#include "m_string.h" #include "m_string.h"
@@ -66,7 +65,7 @@ int init_events_waits_history_long(uint events_waits_history_long_sizing)
{ {
events_waits_history_long_size= events_waits_history_long_sizing; events_waits_history_long_size= events_waits_history_long_sizing;
events_waits_history_long_full= false; events_waits_history_long_full= false;
PFS_atomic::store_u32(&events_waits_history_long_index.m_u32, 0); events_waits_history_long_index.m_u32.store(0);
if (events_waits_history_long_size == 0) if (events_waits_history_long_size == 0)
return 0; return 0;
@@ -135,7 +134,7 @@ void insert_events_waits_history_long(PFS_events_waits *wait)
if (unlikely(events_waits_history_long_size == 0)) if (unlikely(events_waits_history_long_size == 0))
return; return;
uint index= PFS_atomic::add_u32(&events_waits_history_long_index.m_u32, 1); uint index= events_waits_history_long_index.m_u32.fetch_add(1);
index= index % events_waits_history_long_size; index= index % events_waits_history_long_size;
if (index == 0) if (index == 0)
@@ -181,7 +180,7 @@ void reset_events_waits_history(void)
/** Reset table EVENTS_WAITS_HISTORY_LONG data. */ /** Reset table EVENTS_WAITS_HISTORY_LONG data. */
void reset_events_waits_history_long(void) void reset_events_waits_history_long(void)
{ {
PFS_atomic::store_u32(&events_waits_history_long_index.m_u32, 0); events_waits_history_long_index.m_u32.store(0);
events_waits_history_long_full= false; events_waits_history_long_full= false;
PFS_events_waits *wait= events_waits_history_long_array; PFS_events_waits *wait= events_waits_history_long_array;

View File

@@ -23,6 +23,8 @@
#ifndef PFS_GLOBAL_H #ifndef PFS_GLOBAL_H
#define PFS_GLOBAL_H #define PFS_GLOBAL_H
#include <atomic>
#include "my_compiler.h" #include "my_compiler.h"
/** /**
@@ -59,7 +61,7 @@ extern size_t pfs_allocated_memory;
*/ */
struct PFS_cacheline_uint32 struct PFS_cacheline_uint32
{ {
uint32 m_u32; std::atomic<uint32> m_u32;
char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint32)]; char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint32)];
PFS_cacheline_uint32() PFS_cacheline_uint32()
@@ -73,7 +75,7 @@ struct PFS_cacheline_uint32
*/ */
struct PFS_cacheline_uint64 struct PFS_cacheline_uint64
{ {
uint64 m_u64; std::atomic<uint64> m_u64;
char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint64)]; char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint64)];
PFS_cacheline_uint64() PFS_cacheline_uint64()

View File

@@ -28,6 +28,8 @@
Performance schema host (declarations). Performance schema host (declarations).
*/ */
#include <atomic>
#include "pfs_lock.h" #include "pfs_lock.h"
#include "lf.h" #include "lf.h"
#include "pfs_con_slice.h" #include "pfs_con_slice.h"
@@ -58,22 +60,22 @@ struct PFS_ALIGNED PFS_host : PFS_connection_slice
public: public:
inline void init_refcount(void) inline void init_refcount(void)
{ {
PFS_atomic::store_32(& m_refcount, 1); m_refcount.store(1);
} }
inline int get_refcount(void) inline int get_refcount(void)
{ {
return PFS_atomic::load_32(& m_refcount); return m_refcount.load();
} }
inline void inc_refcount(void) inline void inc_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, 1); m_refcount.fetch_add(1);
} }
inline void dec_refcount(void) inline void dec_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, -1); m_refcount.fetch_sub(1);
} }
void aggregate(bool alive); void aggregate(bool alive);
@@ -97,7 +99,7 @@ public:
ulonglong m_disconnected_count; ulonglong m_disconnected_count;
private: private:
int m_refcount; std::atomic<int> m_refcount;
}; };
int init_host(const PFS_global_param *param); int init_host(const PFS_global_param *param);

View File

@@ -526,7 +526,7 @@ PFS_thread* create_thread(PFS_thread_class *klass, const void *identity,
if (pfs != NULL) if (pfs != NULL)
{ {
pfs->m_thread_internal_id= pfs->m_thread_internal_id=
PFS_atomic::add_u64(&thread_internal_id_counter.m_u64, 1); thread_internal_id_counter.m_u64.fetch_add(1);
pfs->m_parent_thread_internal_id= 0; pfs->m_parent_thread_internal_id= 0;
pfs->m_processlist_id= static_cast<ulong>(processlist_id); pfs->m_processlist_id= static_cast<ulong>(processlist_id);
pfs->m_thread_os_id= my_thread_os_id(); pfs->m_thread_os_id= my_thread_os_id();

View File

@@ -25,6 +25,7 @@
@file storage/perfschema/pfs_instr_class.cc @file storage/perfschema/pfs_instr_class.cc
Performance schema instruments meta data (implementation). Performance schema instruments meta data (implementation).
*/ */
#include <atomic>
#include "my_global.h" #include "my_global.h"
#include "my_sys.h" #include "my_sys.h"
@@ -36,7 +37,6 @@
#include "pfs_timer.h" #include "pfs_timer.h"
#include "pfs_events_waits.h" #include "pfs_events_waits.h"
#include "pfs_setup_object.h" #include "pfs_setup_object.h"
#include "pfs_atomic.h"
#include "pfs_program.h" #include "pfs_program.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "mysql/psi/mysql_thread.h" #include "mysql/psi/mysql_thread.h"
@@ -76,12 +76,12 @@ static void init_instr_class(PFS_instr_class *klass,
- the performance schema initialization - the performance schema initialization
- a plugin initialization - a plugin initialization
*/ */
static uint32 mutex_class_dirty_count= 0; static std::atomic<uint32> mutex_class_dirty_count(0);
static uint32 mutex_class_allocated_count= 0; static std::atomic<uint32> mutex_class_allocated_count(0);
static uint32 rwlock_class_dirty_count= 0; static std::atomic<uint32> rwlock_class_dirty_count(0);
static uint32 rwlock_class_allocated_count= 0; static std::atomic<uint32> rwlock_class_allocated_count(0);
static uint32 cond_class_dirty_count= 0; static std::atomic<uint32> cond_class_dirty_count(0);
static uint32 cond_class_allocated_count= 0; static std::atomic<uint32> cond_class_allocated_count(0);
/** Size of the mutex class array. @sa mutex_class_array */ /** Size of the mutex class array. @sa mutex_class_array */
ulong mutex_class_max= 0; ulong mutex_class_max= 0;
@@ -137,8 +137,8 @@ PFS_cond_class *cond_class_array= NULL;
- the performance schema initialization - the performance schema initialization
- a plugin initialization - a plugin initialization
*/ */
static uint32 thread_class_dirty_count= 0; static std::atomic<uint32> thread_class_dirty_count(0);
static uint32 thread_class_allocated_count= 0; static std::atomic<uint32> thread_class_allocated_count(0);
static PFS_thread_class *thread_class_array= NULL; static PFS_thread_class *thread_class_array= NULL;
@@ -185,28 +185,28 @@ LF_HASH table_share_hash;
/** True if table_share_hash is initialized. */ /** True if table_share_hash is initialized. */
static bool table_share_hash_inited= false; static bool table_share_hash_inited= false;
static uint32 file_class_dirty_count= 0; static std::atomic<uint32> file_class_dirty_count(0);
static uint32 file_class_allocated_count= 0; static std::atomic<uint32> file_class_allocated_count(0);
PFS_file_class *file_class_array= NULL; PFS_file_class *file_class_array= NULL;
static uint32 stage_class_dirty_count= 0; static std::atomic<uint32> stage_class_dirty_count(0);
static uint32 stage_class_allocated_count= 0; static std::atomic<uint32> stage_class_allocated_count(0);
static PFS_stage_class *stage_class_array= NULL; static PFS_stage_class *stage_class_array= NULL;
static uint32 statement_class_dirty_count= 0; static std::atomic<uint32> statement_class_dirty_count(0);
static uint32 statement_class_allocated_count= 0; static std::atomic<uint32> statement_class_allocated_count(0);
static PFS_statement_class *statement_class_array= NULL; static PFS_statement_class *statement_class_array= NULL;
static uint32 socket_class_dirty_count= 0; static std::atomic<uint32> socket_class_dirty_count(0);
static uint32 socket_class_allocated_count= 0; static std::atomic<uint32> socket_class_allocated_count(0);
static PFS_socket_class *socket_class_array= NULL; static PFS_socket_class *socket_class_array= NULL;
static uint32 memory_class_dirty_count= 0; static std::atomic<uint32> memory_class_dirty_count(0);
static uint32 memory_class_allocated_count= 0; static std::atomic<uint32> memory_class_allocated_count(0);
static PFS_memory_class *memory_class_array= NULL; static PFS_memory_class *memory_class_array= NULL;
@@ -1092,7 +1092,7 @@ PFS_sync_key register_mutex_class(const char *name, uint name_length,
mutex_class_dirty_count is incremented *before* an entry is added mutex_class_dirty_count is incremented *before* an entry is added
mutex_class_allocated_count is incremented *after* an entry is added mutex_class_allocated_count is incremented *after* an entry is added
*/ */
index= PFS_atomic::add_u32(&mutex_class_dirty_count, 1); index= mutex_class_dirty_count.fetch_add(1);
if (index < mutex_class_max) if (index < mutex_class_max)
{ {
@@ -1148,7 +1148,7 @@ PFS_sync_key register_mutex_class(const char *name, uint name_length,
empty/NULL/zero, but this won't cause a crash empty/NULL/zero, but this won't cause a crash
(mutex_class_array is initialized with MY_ZEROFILL). (mutex_class_array is initialized with MY_ZEROFILL).
*/ */
PFS_atomic::add_u32(&mutex_class_allocated_count, 1); mutex_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1178,7 +1178,7 @@ PFS_sync_key register_rwlock_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, rwlock_class_array, rwlock_class_max, REGISTER_CLASS_BODY_PART(index, rwlock_class_array, rwlock_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&rwlock_class_dirty_count, 1); index= rwlock_class_dirty_count.fetch_add(1);
if (index < rwlock_class_max) if (index < rwlock_class_max)
{ {
@@ -1191,7 +1191,7 @@ PFS_sync_key register_rwlock_class(const char *name, uint name_length,
entry->m_timed= false; entry->m_timed= false;
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&rwlock_class_allocated_count, 1); rwlock_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1217,7 +1217,7 @@ PFS_sync_key register_cond_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, cond_class_array, cond_class_max, REGISTER_CLASS_BODY_PART(index, cond_class_array, cond_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&cond_class_dirty_count, 1); index= cond_class_dirty_count.fetch_add(1);
if (index < cond_class_max) if (index < cond_class_max)
{ {
@@ -1229,7 +1229,7 @@ PFS_sync_key register_cond_class(const char *name, uint name_length,
entry->m_timed= false; entry->m_timed= false;
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&cond_class_allocated_count, 1); cond_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1311,7 +1311,7 @@ PFS_thread_key register_thread_class(const char *name, uint name_length,
return (index + 1); return (index + 1);
} }
index= PFS_atomic::add_u32(&thread_class_dirty_count, 1); index= thread_class_dirty_count.fetch_add(1);
if (index < thread_class_max) if (index < thread_class_max)
{ {
@@ -1320,7 +1320,7 @@ PFS_thread_key register_thread_class(const char *name, uint name_length,
strncpy(entry->m_name, name, name_length); strncpy(entry->m_name, name, name_length);
entry->m_name_length= name_length; entry->m_name_length= name_length;
entry->m_enabled= true; entry->m_enabled= true;
PFS_atomic::add_u32(&thread_class_allocated_count, 1); thread_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1361,7 +1361,7 @@ PFS_file_key register_file_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, file_class_array, file_class_max, REGISTER_CLASS_BODY_PART(index, file_class_array, file_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&file_class_dirty_count, 1); index= file_class_dirty_count.fetch_add(1);
if (index < file_class_max) if (index < file_class_max)
{ {
@@ -1373,7 +1373,7 @@ PFS_file_key register_file_class(const char *name, uint name_length,
entry->m_timed= true; entry->m_timed= true;
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&file_class_allocated_count, 1); file_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1403,7 +1403,7 @@ PFS_stage_key register_stage_class(const char *name,
REGISTER_CLASS_BODY_PART(index, stage_class_array, stage_class_max, REGISTER_CLASS_BODY_PART(index, stage_class_array, stage_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&stage_class_dirty_count, 1); index= stage_class_dirty_count.fetch_add(1);
if (index < stage_class_max) if (index < stage_class_max)
{ {
@@ -1427,7 +1427,7 @@ PFS_stage_key register_stage_class(const char *name,
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&stage_class_allocated_count, 1); stage_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1454,7 +1454,7 @@ PFS_statement_key register_statement_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, statement_class_array, statement_class_max, REGISTER_CLASS_BODY_PART(index, statement_class_array, statement_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&statement_class_dirty_count, 1); index= statement_class_dirty_count.fetch_add(1);
if (index < statement_class_max) if (index < statement_class_max)
{ {
@@ -1465,7 +1465,7 @@ PFS_statement_key register_statement_class(const char *name, uint name_length,
entry->m_timed= true; entry->m_timed= true;
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&statement_class_allocated_count, 1); statement_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1537,7 +1537,7 @@ PFS_socket_key register_socket_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, socket_class_array, socket_class_max, REGISTER_CLASS_BODY_PART(index, socket_class_array, socket_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&socket_class_dirty_count, 1); index= socket_class_dirty_count.fetch_add(1);
if (index < socket_class_max) if (index < socket_class_max)
{ {
@@ -1549,7 +1549,7 @@ PFS_socket_key register_socket_class(const char *name, uint name_length,
entry->m_timed= false; entry->m_timed= false;
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
PFS_atomic::add_u32(&socket_class_allocated_count, 1); socket_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }
@@ -1590,7 +1590,7 @@ PFS_memory_key register_memory_class(const char *name, uint name_length,
REGISTER_CLASS_BODY_PART(index, memory_class_array, memory_class_max, REGISTER_CLASS_BODY_PART(index, memory_class_array, memory_class_max,
name, name_length) name, name_length)
index= PFS_atomic::add_u32(&memory_class_dirty_count, 1); index= memory_class_dirty_count.fetch_add(1);
if (index < memory_class_max) if (index < memory_class_max)
{ {
@@ -1601,7 +1601,7 @@ PFS_memory_key register_memory_class(const char *name, uint name_length,
/* Set user-defined configuration options for this instrument */ /* Set user-defined configuration options for this instrument */
configure_instr_class(entry); configure_instr_class(entry);
entry->m_timed= false; /* Immutable */ entry->m_timed= false; /* Immutable */
PFS_atomic::add_u32(&memory_class_allocated_count, 1); memory_class_allocated_count.fetch_add(1);
return (index + 1); return (index + 1);
} }

View File

@@ -23,11 +23,12 @@
#ifndef PFS_INSTR_CLASS_H #ifndef PFS_INSTR_CLASS_H
#define PFS_INSTR_CLASS_H #define PFS_INSTR_CLASS_H
#include <atomic>
#include "my_global.h" #include "my_global.h"
#include "mysql_com.h" /* NAME_LEN */ #include "mysql_com.h" /* NAME_LEN */
#include "lf.h" #include "lf.h"
#include "pfs_global.h" #include "pfs_global.h"
#include "pfs_atomic.h"
#include "sql_array.h" #include "sql_array.h"
/** /**
@@ -329,22 +330,22 @@ public:
inline void init_refcount(void) inline void init_refcount(void)
{ {
PFS_atomic::store_32(& m_refcount, 1); m_refcount.store(1);
} }
inline int get_refcount(void) inline int get_refcount(void)
{ {
return PFS_atomic::load_32(& m_refcount); return m_refcount.load();
} }
inline void inc_refcount(void) inline void inc_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, 1); m_refcount.fetch_add(1);
} }
inline void dec_refcount(void) inline void dec_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, -1); m_refcount.fetch_sub(1);
} }
void refresh_setup_object_flags(PFS_thread *thread); void refresh_setup_object_flags(PFS_thread *thread);
@@ -387,7 +388,7 @@ public:
private: private:
/** Number of opened table handles. */ /** Number of opened table handles. */
int m_refcount; std::atomic<int> m_refcount;
/** Table locks statistics. */ /** Table locks statistics. */
PFS_table_share_lock *m_race_lock_stat; PFS_table_share_lock *m_race_lock_stat;
/** Table indexes' stats. */ /** Table indexes' stats. */

View File

@@ -28,9 +28,9 @@
Performance schema internal locks (declarations). Performance schema internal locks (declarations).
*/ */
#include "my_global.h" #include <atomic>
#include "pfs_atomic.h" #include "my_global.h"
/* to cause bugs, testing */ /* to cause bugs, testing */
// #define MEM(X) std::memory_order_relaxed // #define MEM(X) std::memory_order_relaxed
@@ -103,7 +103,7 @@ struct pfs_lock
The version number is stored in the high 30 bits. The version number is stored in the high 30 bits.
The state is stored in the low 2 bits. The state is stored in the low 2 bits.
*/ */
uint32 m_version_state; std::atomic<uint32> m_version_state;
uint32 copy_version_state() uint32 copy_version_state()
{ {
@@ -119,7 +119,7 @@ struct pfs_lock
{ {
uint32 copy; uint32 copy;
copy= PFS_atomic::load_u32(&m_version_state); copy= m_version_state.load();
return ((copy & STATE_MASK) == PFS_LOCK_FREE); return ((copy & STATE_MASK) == PFS_LOCK_FREE);
} }
@@ -129,7 +129,7 @@ struct pfs_lock
{ {
uint32 copy; uint32 copy;
copy= PFS_atomic::load_u32(&m_version_state); copy= m_version_state.load();
return ((copy & STATE_MASK) == PFS_LOCK_ALLOCATED); return ((copy & STATE_MASK) == PFS_LOCK_ALLOCATED);
} }
@@ -144,7 +144,7 @@ struct pfs_lock
{ {
uint32 old_val; uint32 old_val;
old_val= PFS_atomic::load_u32(&m_version_state); old_val= m_version_state.load();
if ((old_val & STATE_MASK) != PFS_LOCK_FREE) if ((old_val & STATE_MASK) != PFS_LOCK_FREE)
{ {
@@ -154,7 +154,7 @@ struct pfs_lock
uint32 new_val= (old_val & VERSION_MASK) + PFS_LOCK_DIRTY; uint32 new_val= (old_val & VERSION_MASK) + PFS_LOCK_DIRTY;
bool pass; bool pass;
pass= PFS_atomic::cas_u32(&m_version_state, &old_val, new_val); pass= m_version_state.compare_exchange_strong(old_val, new_val);
if (pass) if (pass)
{ {
@@ -178,7 +178,7 @@ struct pfs_lock
uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_DIRTY; uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_DIRTY;
/* We own the record, no need to use compare and swap. */ /* We own the record, no need to use compare and swap. */
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
copy_ptr->m_version_state= new_val; copy_ptr->m_version_state= new_val;
} }
@@ -195,7 +195,7 @@ struct pfs_lock
/* Increment the version, set the ALLOCATED state */ /* Increment the version, set the ALLOCATED state */
uint32 new_val= (copy->m_version_state & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED; uint32 new_val= (copy->m_version_state & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED;
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
} }
/** /**
@@ -210,7 +210,7 @@ struct pfs_lock
/* Increment the version, set the ALLOCATED state */ /* Increment the version, set the ALLOCATED state */
uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED; uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED;
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
} }
/** /**
@@ -219,10 +219,10 @@ struct pfs_lock
void set_dirty(pfs_dirty_state *copy_ptr) void set_dirty(pfs_dirty_state *copy_ptr)
{ {
/* Do not set the version to 0, read the previous value. */ /* Do not set the version to 0, read the previous value. */
uint32 copy= PFS_atomic::load_u32(&m_version_state); uint32 copy= m_version_state.load();
/* Increment the version, set the DIRTY state */ /* Increment the version, set the DIRTY state */
uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_DIRTY; uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_DIRTY;
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
copy_ptr->m_version_state= new_val; copy_ptr->m_version_state= new_val;
} }
@@ -238,7 +238,7 @@ struct pfs_lock
/* Keep the same version, set the FREE state */ /* Keep the same version, set the FREE state */
uint32 new_val= (copy->m_version_state & VERSION_MASK) + PFS_LOCK_FREE; uint32 new_val= (copy->m_version_state & VERSION_MASK) + PFS_LOCK_FREE;
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
} }
/** /**
@@ -258,7 +258,7 @@ struct pfs_lock
/* Keep the same version, set the FREE state */ /* Keep the same version, set the FREE state */
uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_FREE; uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_FREE;
PFS_atomic::store_u32(&m_version_state, new_val); m_version_state.store(new_val);
} }
/** /**
@@ -268,7 +268,7 @@ struct pfs_lock
*/ */
void begin_optimistic_lock(struct pfs_optimistic_state *copy) void begin_optimistic_lock(struct pfs_optimistic_state *copy)
{ {
copy->m_version_state= PFS_atomic::load_u32(&m_version_state); copy->m_version_state= m_version_state.load();
} }
/** /**
@@ -285,7 +285,7 @@ struct pfs_lock
if ((copy->m_version_state & STATE_MASK) != PFS_LOCK_ALLOCATED) if ((copy->m_version_state & STATE_MASK) != PFS_LOCK_ALLOCATED)
return false; return false;
version_state= PFS_atomic::load_u32(&m_version_state); version_state= m_version_state.load();
/* Check the version + state has not changed. */ /* Check the version + state has not changed. */
if (copy->m_version_state != version_state) if (copy->m_version_state != version_state)
@@ -298,7 +298,7 @@ struct pfs_lock
{ {
uint32 version_state; uint32 version_state;
version_state= PFS_atomic::load_u32(&m_version_state); version_state= m_version_state.load();
return (version_state & VERSION_MASK); return (version_state & VERSION_MASK);
} }

View File

@@ -33,7 +33,6 @@
#include "pfs_account.h" #include "pfs_account.h"
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_user.h" #include "pfs_user.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "m_string.h" #include "m_string.h"

View File

@@ -34,7 +34,6 @@
#include "pfs_host.h" #include "pfs_host.h"
#include "pfs_user.h" #include "pfs_user.h"
#include "pfs_status.h" #include "pfs_status.h"
#include "pfs_atomic.h"
#include "pfs_buffer_container.h" #include "pfs_buffer_container.h"
#include "sql_show.h" /* reset_status_vars */ #include "sql_show.h" /* reset_status_vars */

View File

@@ -28,6 +28,8 @@
Performance schema user (declarations). Performance schema user (declarations).
*/ */
#include <atomic>
#include "pfs_lock.h" #include "pfs_lock.h"
#include "lf.h" #include "lf.h"
#include "pfs_con_slice.h" #include "pfs_con_slice.h"
@@ -58,22 +60,22 @@ struct PFS_ALIGNED PFS_user : public PFS_connection_slice
public: public:
inline void init_refcount(void) inline void init_refcount(void)
{ {
PFS_atomic::store_32(& m_refcount, 1); m_refcount.store(1);
} }
inline int get_refcount(void) inline int get_refcount(void)
{ {
return PFS_atomic::load_32(& m_refcount); return m_refcount.load();
} }
inline void inc_refcount(void) inline void inc_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, 1); m_refcount.fetch_add(1);
} }
inline void dec_refcount(void) inline void dec_refcount(void)
{ {
PFS_atomic::add_32(& m_refcount, -1); m_refcount.fetch_sub(1);
} }
void aggregate(bool alive); void aggregate(bool alive);
@@ -97,7 +99,7 @@ public:
ulonglong m_disconnected_count; ulonglong m_disconnected_count;
private: private:
int m_refcount; std::atomic<int> m_refcount;
}; };
int init_user(const PFS_global_param *param); int init_user(const PFS_global_param *param);