xref: /aosp_15_r20/external/grpc-grpc/include/grpc/support/atm.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker  *
3*cc02d7e2SAndroid Build Coastguard Worker  * Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker  *
5*cc02d7e2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker  *
9*cc02d7e2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker  *
11*cc02d7e2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker  * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker  *
17*cc02d7e2SAndroid Build Coastguard Worker  */
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPC_SUPPORT_ATM_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_SUPPORT_ATM_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker /** This interface provides atomic operations and barriers.
23*cc02d7e2SAndroid Build Coastguard Worker    It is internal to gpr support code and should not be used outside it.
24*cc02d7e2SAndroid Build Coastguard Worker 
25*cc02d7e2SAndroid Build Coastguard Worker    If an operation with acquire semantics precedes another memory access by the
26*cc02d7e2SAndroid Build Coastguard Worker    same thread, the operation will precede that other access as seen by other
27*cc02d7e2SAndroid Build Coastguard Worker    threads.
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker    If an operation with release semantics follows another memory access by the
30*cc02d7e2SAndroid Build Coastguard Worker    same thread, the operation will follow that other access as seen by other
31*cc02d7e2SAndroid Build Coastguard Worker    threads.
32*cc02d7e2SAndroid Build Coastguard Worker 
33*cc02d7e2SAndroid Build Coastguard Worker    Routines with "acq" or "full" in the name have acquire semantics.  Routines
34*cc02d7e2SAndroid Build Coastguard Worker    with "rel" or "full" in the name have release semantics.  Routines with
35*cc02d7e2SAndroid Build Coastguard Worker    "no_barrier" in the name have neither acquire not release semantics.
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker    The routines may be implemented as macros.
38*cc02d7e2SAndroid Build Coastguard Worker 
39*cc02d7e2SAndroid Build Coastguard Worker    // Atomic operations act on an integral_type gpr_atm that is guaranteed to
40*cc02d7e2SAndroid Build Coastguard Worker    // be the same size as a pointer.
41*cc02d7e2SAndroid Build Coastguard Worker    typedef intptr_t gpr_atm;
42*cc02d7e2SAndroid Build Coastguard Worker 
43*cc02d7e2SAndroid Build Coastguard Worker    // A memory barrier, providing both acquire and release semantics, but not
44*cc02d7e2SAndroid Build Coastguard Worker    // otherwise acting on memory.
45*cc02d7e2SAndroid Build Coastguard Worker    void gpr_atm_full_barrier(void);
46*cc02d7e2SAndroid Build Coastguard Worker 
47*cc02d7e2SAndroid Build Coastguard Worker    // Atomically return *p, with acquire semantics.
48*cc02d7e2SAndroid Build Coastguard Worker    gpr_atm gpr_atm_acq_load(gpr_atm *p);
49*cc02d7e2SAndroid Build Coastguard Worker    gpr_atm gpr_atm_no_barrier_load(gpr_atm *p);
50*cc02d7e2SAndroid Build Coastguard Worker 
51*cc02d7e2SAndroid Build Coastguard Worker    // Atomically set *p = value, with release semantics.
52*cc02d7e2SAndroid Build Coastguard Worker    void gpr_atm_rel_store(gpr_atm *p, gpr_atm value);
53*cc02d7e2SAndroid Build Coastguard Worker 
54*cc02d7e2SAndroid Build Coastguard Worker    // Atomically add delta to *p, and return the old value of *p, with
55*cc02d7e2SAndroid Build Coastguard Worker    // the barriers specified.
56*cc02d7e2SAndroid Build Coastguard Worker    gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p, gpr_atm delta);
57*cc02d7e2SAndroid Build Coastguard Worker    gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta);
58*cc02d7e2SAndroid Build Coastguard Worker 
59*cc02d7e2SAndroid Build Coastguard Worker    // Atomically, if *p==o, set *p=n and return non-zero otherwise return 0,
60*cc02d7e2SAndroid Build Coastguard Worker    // with the barriers specified if the operation succeeds.
61*cc02d7e2SAndroid Build Coastguard Worker    int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
62*cc02d7e2SAndroid Build Coastguard Worker    int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
63*cc02d7e2SAndroid Build Coastguard Worker    int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
64*cc02d7e2SAndroid Build Coastguard Worker    int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
65*cc02d7e2SAndroid Build Coastguard Worker 
66*cc02d7e2SAndroid Build Coastguard Worker    // Atomically, set *p=n and return the old value of *p
67*cc02d7e2SAndroid Build Coastguard Worker    gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n);
68*cc02d7e2SAndroid Build Coastguard Worker */
69*cc02d7e2SAndroid Build Coastguard Worker 
70*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
71*cc02d7e2SAndroid Build Coastguard Worker 
72*cc02d7e2SAndroid Build Coastguard Worker #if defined(GPR_GCC_ATOMIC)
73*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/atm_gcc_atomic.h>  // IWYU pragma: export
74*cc02d7e2SAndroid Build Coastguard Worker #elif defined(GPR_GCC_SYNC)
75*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/atm_gcc_sync.h>  // IWYU pragma: export
76*cc02d7e2SAndroid Build Coastguard Worker #elif defined(GPR_WINDOWS_ATOMIC)
77*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/atm_windows.h>  // IWYU pragma: export
78*cc02d7e2SAndroid Build Coastguard Worker #else
79*cc02d7e2SAndroid Build Coastguard Worker #error could not determine platform for atm
80*cc02d7e2SAndroid Build Coastguard Worker #endif
81*cc02d7e2SAndroid Build Coastguard Worker 
82*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus
83*cc02d7e2SAndroid Build Coastguard Worker extern "C" {
84*cc02d7e2SAndroid Build Coastguard Worker #endif
85*cc02d7e2SAndroid Build Coastguard Worker 
86*cc02d7e2SAndroid Build Coastguard Worker /** Adds \a delta to \a *value, clamping the result to the range specified
87*cc02d7e2SAndroid Build Coastguard Worker     by \a min and \a max.  Returns the new value. */
88*cc02d7e2SAndroid Build Coastguard Worker gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta,
89*cc02d7e2SAndroid Build Coastguard Worker                                        gpr_atm min, gpr_atm max);
90*cc02d7e2SAndroid Build Coastguard Worker 
91*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus
92*cc02d7e2SAndroid Build Coastguard Worker }
93*cc02d7e2SAndroid Build Coastguard Worker #endif
94*cc02d7e2SAndroid Build Coastguard Worker 
95*cc02d7e2SAndroid Build Coastguard Worker #endif /* GRPC_SUPPORT_ATM_H */
96