impl/codegen/atm_windows.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPC_IMPL_CODEGEN_ATM_WINDOWS_H
20 #define GRPC_IMPL_CODEGEN_ATM_WINDOWS_H
21 
22 // IWYU pragma: private, include <grpc/support/atm.h>
23 
26 
27 #ifdef GPR_WINDOWS
28 
29 typedef intptr_t gpr_atm;
30 #define GPR_ATM_MAX INTPTR_MAX
31 #define GPR_ATM_MIN INTPTR_MIN
32 #define GPR_ATM_INC_CAS_THEN(blah) blah
33 #define GPR_ATM_INC_ADD_THEN(blah) blah
34 
35 #define gpr_atm_full_barrier MemoryBarrier
36 
37 static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) {
38  gpr_atm result = *p;
40  return result;
41 }
42 
43 static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) {
44  /* TODO(dklempner): Can we implement something better here? */
45  return gpr_atm_acq_load(p);
46 }
47 
48 static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) {
50  *p = value;
51 }
52 
53 static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) {
54  /* TODO(ctiller): Can we implement something better here? */
56 }
57 
58 static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
61 #ifdef GPR_ARCH_64
62  return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
63  (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
64 #else
65  return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p,
66  (LONG)n, (LONG)o);
67 #endif
68 }
69 
70 static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
71 #ifdef GPR_ARCH_64
72  return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
73  (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
74 #else
75  return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p,
76  (LONG)n, (LONG)o);
77 #endif
78 }
79 
80 static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
81 #ifdef GPR_ARCH_64
82  return o == (gpr_atm)InterlockedCompareExchangeRelease64(
83  (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o);
84 #else
85  return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG*)p,
86  (LONG)n, (LONG)o);
87 #endif
88 }
89 
90 static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) {
91 #ifdef GPR_ARCH_64
92  return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p,
93  (LONGLONG)n, (LONGLONG)o);
94 #else
95  return o == (gpr_atm)InterlockedCompareExchange((volatile LONG*)p, (LONG)n,
96  (LONG)o);
97 #endif
98 }
99 
101  gpr_atm delta) {
103  gpr_atm old;
104  do {
105  old = *p;
106  } while (!gpr_atm_no_barrier_cas(p, old, old + delta));
107  return old;
108 }
109 
110 static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm* p, gpr_atm delta) {
112  gpr_atm old;
113 #ifdef GPR_ARCH_64
114  do {
115  old = *p;
116  } while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p,
117  (LONGLONG)old + delta,
118  (LONGLONG)old));
119 #else
120  do {
121  old = *p;
122  } while (old != (gpr_atm)InterlockedCompareExchange(
123  (volatile LONG*)p, (LONG)old + delta, (LONG)old));
124 #endif
125  return old;
126 }
127 
128 static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) {
129  return (gpr_atm)InterlockedExchangePointer((PVOID*)p, (PVOID)n);
130 }
131 
132 #endif /* GPR_WINDOWS */
133 
134 #endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
gpr_atm_no_barrier_load
#define gpr_atm_no_barrier_load(p)
Definition: impl/codegen/atm_gcc_atomic.h:53
gpr_atm_full_fetch_add
#define gpr_atm_full_fetch_add(p, delta)
Definition: impl/codegen/atm_gcc_atomic.h:62
gpr_atm_no_barrier_store
#define gpr_atm_no_barrier_store(p, value)
Definition: impl/codegen/atm_gcc_atomic.h:56
gpr_atm_acq_cas
#define gpr_atm_acq_cas(p, o, n)
Definition: impl/codegen/atm_gcc_sync.h:75
gpr_atm_full_xchg
#define gpr_atm_full_xchg(p, n)
Definition: impl/codegen/atm_gcc_atomic.h:86
gpr_atm_rel_cas
#define gpr_atm_rel_cas(p, o, n)
Definition: impl/codegen/atm_gcc_sync.h:76
xds_manager.p
p
Definition: xds_manager.py:60
gpr_atm_full_barrier
#define gpr_atm_full_barrier()
Definition: impl/codegen/atm_gcc_atomic.h:50
o
UnboundConversion o
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:97
gpr_atm_acq_load
#define gpr_atm_acq_load(p)
Definition: impl/codegen/atm_gcc_atomic.h:52
gpr_atm_rel_store
#define gpr_atm_rel_store(p, value)
Definition: impl/codegen/atm_gcc_atomic.h:54
gpr_atm_no_barrier_fetch_add
#define gpr_atm_no_barrier_fetch_add(p, delta)
Definition: impl/codegen/atm_gcc_atomic.h:59
grpc_core::ExecutorJobType::LONG
@ LONG
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
gpr_atm_no_barrier_cas
#define gpr_atm_no_barrier_cas(p, o, n)
Definition: impl/codegen/atm_gcc_sync.h:74
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
value
const char * value
Definition: hpack_parser_table.cc:165
gpr_atm
intptr_t gpr_atm
Definition: impl/codegen/atm_gcc_atomic.h:32
port_platform.h
binary_size.old
string old
Definition: binary_size.py:128
gpr_atm_full_cas
#define gpr_atm_full_cas(p, o, n)
Definition: impl/codegen/atm_gcc_sync.h:77


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:35