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

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