1*33b1fccfSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */ 2*33b1fccfSAndroid Build Coastguard Worker /* 3*33b1fccfSAndroid Build Coastguard Worker * Copyright (C) 2024 Alibaba Cloud 4*33b1fccfSAndroid Build Coastguard Worker */ 5*33b1fccfSAndroid Build Coastguard Worker #ifndef __EROFS_ATOMIC_H 6*33b1fccfSAndroid Build Coastguard Worker #define __EROFS_ATOMIC_H 7*33b1fccfSAndroid Build Coastguard Worker 8*33b1fccfSAndroid Build Coastguard Worker /* 9*33b1fccfSAndroid Build Coastguard Worker * Just use GCC/clang built-in functions for now 10*33b1fccfSAndroid Build Coastguard Worker * See: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html 11*33b1fccfSAndroid Build Coastguard Worker */ 12*33b1fccfSAndroid Build Coastguard Worker typedef unsigned long erofs_atomic_t; 13*33b1fccfSAndroid Build Coastguard Worker typedef char erofs_atomic_bool_t; 14*33b1fccfSAndroid Build Coastguard Worker 15*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_read(ptr) ({ \ 16*33b1fccfSAndroid Build Coastguard Worker typeof(*ptr) __n; \ 17*33b1fccfSAndroid Build Coastguard Worker __atomic_load(ptr, &__n, __ATOMIC_RELAXED); \ 18*33b1fccfSAndroid Build Coastguard Worker __n;}) 19*33b1fccfSAndroid Build Coastguard Worker 20*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_set(ptr, n) do { \ 21*33b1fccfSAndroid Build Coastguard Worker typeof(*ptr) __n = (n); \ 22*33b1fccfSAndroid Build Coastguard Worker __atomic_store(ptr, &__n, __ATOMIC_RELAXED); \ 23*33b1fccfSAndroid Build Coastguard Worker } while(0) 24*33b1fccfSAndroid Build Coastguard Worker 25*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_test_and_set(ptr) \ 26*33b1fccfSAndroid Build Coastguard Worker __atomic_test_and_set(ptr, __ATOMIC_RELAXED) 27*33b1fccfSAndroid Build Coastguard Worker 28*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_add_return(ptr, i) \ 29*33b1fccfSAndroid Build Coastguard Worker __atomic_add_fetch(ptr, i, __ATOMIC_RELAXED) 30*33b1fccfSAndroid Build Coastguard Worker 31*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_sub_return(ptr, i) \ 32*33b1fccfSAndroid Build Coastguard Worker __atomic_sub_fetch(ptr, i, __ATOMIC_RELAXED) 33*33b1fccfSAndroid Build Coastguard Worker 34*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_inc_return(ptr) erofs_atomic_add_return(ptr, 1) 35*33b1fccfSAndroid Build Coastguard Worker 36*33b1fccfSAndroid Build Coastguard Worker #define erofs_atomic_dec_return(ptr) erofs_atomic_sub_return(ptr, 1) 37*33b1fccfSAndroid Build Coastguard Worker 38*33b1fccfSAndroid Build Coastguard Worker #endif 39