diff --git a/maxutils/maxbase/include/maxbase/atomic.hh b/maxutils/maxbase/include/maxbase/atomic.hh new file mode 100644 index 000000000..b72036e3a --- /dev/null +++ b/maxutils/maxbase/include/maxbase/atomic.hh @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018 MariaDB Corporation Ab + * + * Use of this software is governed by the Business Source License included + * in the LICENSE.TXT file and at www.mariadb.com/bsl11. + * + * Change Date: 2022-01-01 + * + * On the date above, in accordance with the Business Source License, use + * of this software will be governed by version 2 or later of the General + * Public License. + */ +#pragma once + +#include + +namespace maxbase +{ + +namespace atomic +{ + +constexpr int RELAXED = __ATOMIC_RELAXED; +constexpr int CONSUME = __ATOMIC_CONSUME; +constexpr int ACQUIRE = __ATOMIC_ACQUIRE; +constexpr int RELEASE = __ATOMIC_RELEASE; +constexpr int ACQ_REL = __ATOMIC_ACQ_REL; +constexpr int SEQ_CST = __ATOMIC_SEQ_CST; + +/** + * Perform atomic fetch-and-add operation + * + * @param t Variable to add to + * @param v Value to add + * @param mode Memory ordering + * + * @return The old value + */ +template +T add(T* t, R v, int mode = SEQ_CST) +{ + return __atomic_fetch_add(t, v, mode); +} + +/** + * Perform atomic load operation + * + * @param t Variable to load + * @param mode Memory ordering + * + * @return The loaded value + */ +template +T load(T* t, int mode = SEQ_CST) +{ + return __atomic_load_n(t, mode); +} + +/** + * Perform atomic store operation + * + * @param t Variable where the value is stored + * @param v Value to store + * @param mode Memory ordering + * + * @return The loaded value + */ +template +void store(T* t, R v, int mode = SEQ_CST) +{ + __atomic_store_n(t, v, mode); +} +} +}