PostgreSQL Source Code: src/include/port/atomics/generic.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16#ifndef INSIDE_ATOMICS_H

17# error "should be included via atomics.h"

18#endif

19

20

21

22

23

24#if !defined(pg_read_barrier_impl)

25# define pg_read_barrier_impl pg_memory_barrier_impl

26#endif

27#if !defined(pg_write_barrier_impl)

28# define pg_write_barrier_impl pg_memory_barrier_impl

29#endif

30

31#ifndef PG_HAVE_SPIN_DELAY

32#define PG_HAVE_SPIN_DELAY

33#define pg_spin_delay_impl() ((void)0)

34#endif

35

36

37

38#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && defined(PG_HAVE_ATOMIC_U32_SUPPORT)

39#define PG_HAVE_ATOMIC_FLAG_SUPPORT

41#endif

42

43#ifndef PG_HAVE_ATOMIC_READ_U32

44#define PG_HAVE_ATOMIC_READ_U32

47{

48 return ptr->value;

49}

50#endif

51

52#ifndef PG_HAVE_ATOMIC_WRITE_U32

53#define PG_HAVE_ATOMIC_WRITE_U32

54static inline void

59#endif

60

61#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32

62#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32

63static inline void

68#endif

69

70

71

72

73#if !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)

74

75#define PG_HAVE_ATOMIC_INIT_FLAG

76static inline void

78{

80}

81

82#define PG_HAVE_ATOMIC_TEST_SET_FLAG

83static inline bool

85{

87}

88

89#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG

90static inline bool

92{

94}

95

96

97#define PG_HAVE_ATOMIC_CLEAR_FLAG

98static inline void

100{

101

104}

105

106

107

108

109

110#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

111

112#define PG_HAVE_ATOMIC_INIT_FLAG

113static inline void

115{

117}

118

119#define PG_HAVE_ATOMIC_TEST_SET_FLAG

120static inline bool

122{

125}

126

127#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG

128static inline bool

130{

132}

133

134#define PG_HAVE_ATOMIC_CLEAR_FLAG

135static inline void

137{

138

141}

142

143#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG)

144# error "No pg_atomic_test_and_set provided"

145#endif

146

147

148#ifndef PG_HAVE_ATOMIC_INIT_U32

149#define PG_HAVE_ATOMIC_INIT_U32

150static inline void

155#endif

156

157#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

158#define PG_HAVE_ATOMIC_EXCHANGE_U32

161{

163 old = ptr->value;

165 ;

166 return old;

167}

168#endif

169

170#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

171#define PG_HAVE_ATOMIC_FETCH_ADD_U32

174{

176 old = ptr->value;

178 ;

179 return old;

180}

181#endif

182

183#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

184#define PG_HAVE_ATOMIC_FETCH_SUB_U32

187{

189}

190#endif

191

192#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

193#define PG_HAVE_ATOMIC_FETCH_AND_U32

196{

198 old = ptr->value;

200 ;

201 return old;

202}

203#endif

204

205#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)

206#define PG_HAVE_ATOMIC_FETCH_OR_U32

209{

211 old = ptr->value;

213 ;

214 return old;

215}

216#endif

217

218#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)

219#define PG_HAVE_ATOMIC_ADD_FETCH_U32

222{

224}

225#endif

226

227#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32)

228#define PG_HAVE_ATOMIC_SUB_FETCH_U32

231{

233}

234#endif

235

236#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)

237#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32

240{

242}

243#endif

244

245#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)

246#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32

247static inline void

249{

251}

252#endif

253

254#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)

255#define PG_HAVE_ATOMIC_EXCHANGE_U64

258{

260 old = ptr->value;

262 ;

263 return old;

264}

265#endif

266

267#ifndef PG_HAVE_ATOMIC_WRITE_U64

268#define PG_HAVE_ATOMIC_WRITE_U64

269

270#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \

271 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)

272

273static inline void

275{

276

277

278

279

280

283}

284

285#else

286

287static inline void

289{

290

291

292

293

295}

296

297#endif

298#endif

299

300#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64

301#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64

302static inline void

307#endif

308

309#ifndef PG_HAVE_ATOMIC_READ_U64

310#define PG_HAVE_ATOMIC_READ_U64

311

312#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \

313 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)

314

317{

318

319

320

322 return ptr->value;

323}

324

325#else

326

329{

331

332

333

334

335

336

337

339

340 return old;

341}

342#endif

343#endif

344

345#ifndef PG_HAVE_ATOMIC_INIT_U64

346#define PG_HAVE_ATOMIC_INIT_U64

347static inline void

352#endif

353

354#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)

355#define PG_HAVE_ATOMIC_FETCH_ADD_U64

358{

360 old = ptr->value;

362 ;

363 return old;

364}

365#endif

366

367#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)

368#define PG_HAVE_ATOMIC_FETCH_SUB_U64

371{

373}

374#endif

375

376#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)

377#define PG_HAVE_ATOMIC_FETCH_AND_U64

380{

382 old = ptr->value;

384 ;

385 return old;

386}

387#endif

388

389#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)

390#define PG_HAVE_ATOMIC_FETCH_OR_U64

393{

395 old = ptr->value;

397 ;

398 return old;

399}

400#endif

401

402#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)

403#define PG_HAVE_ATOMIC_ADD_FETCH_U64

406{

408}

409#endif

410

411#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U64)

412#define PG_HAVE_ATOMIC_SUB_FETCH_U64

415{

417}

418#endif

419

420#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)

421#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64

424{

426}

427#endif

428

429#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64)

430#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64

431static inline void

433{

435}

436#endif

static bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)

static uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)

uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)

bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)

#define AssertPointerAlignment(ptr, bndr)

#define pg_memory_barrier_impl()

static uint32 pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)

static void pg_atomic_unlocked_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)

static uint64 pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)

static void pg_atomic_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)

static void pg_atomic_unlocked_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)

static void pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)

static void pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)

static uint32 pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)

static void pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)