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

@@ -28,6 +28,8 @@
Performance schema user (declarations).
*/
#include <atomic>
#include "pfs_lock.h"
#include "lf.h"
#include "pfs_con_slice.h"
@@ -58,22 +60,22 @@ struct PFS_ALIGNED PFS_user : public PFS_connection_slice
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 aggregate(bool alive);
@@ -97,7 +99,7 @@ public:
ulonglong m_disconnected_count;
private:
int m_refcount;
std::atomic<int> m_refcount;
};
int init_user(const PFS_global_param *param);