PostgreSQL Source Code: src/include/utils/dsa.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14#ifndef DSA_H

15#define DSA_H

16

19

20

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38#if SIZEOF_SIZE_T == 4 || !defined(PG_HAVE_ATOMIC_U64_SUPPORT) || \

39 defined(USE_SMALL_DSA_POINTER)

40#define SIZEOF_DSA_POINTER 4

41#else

42#define SIZEOF_DSA_POINTER 8

43#endif

44

45

46

47

48

49

50

51

52#if SIZEOF_DSA_POINTER == 4

55#define dsa_pointer_atomic_init pg_atomic_init_u32

56#define dsa_pointer_atomic_read pg_atomic_read_u32

57#define dsa_pointer_atomic_write pg_atomic_write_u32

58#define dsa_pointer_atomic_fetch_add pg_atomic_fetch_add_u32

59#define dsa_pointer_atomic_compare_exchange pg_atomic_compare_exchange_u32

60#define DSA_POINTER_FORMAT "%08x"

61#else

64#define dsa_pointer_atomic_init pg_atomic_init_u64

65#define dsa_pointer_atomic_read pg_atomic_read_u64

66#define dsa_pointer_atomic_write pg_atomic_write_u64

67#define dsa_pointer_atomic_fetch_add pg_atomic_fetch_add_u64

68#define dsa_pointer_atomic_compare_exchange pg_atomic_compare_exchange_u64

69#define DSA_POINTER_FORMAT "%016" PRIx64

70#endif

71

72

73#define DSA_ALLOC_HUGE 0x01

74#define DSA_ALLOC_NO_OOM 0x02

75#define DSA_ALLOC_ZERO 0x04

76

77

78#define InvalidDsaPointer ((dsa_pointer) 0)

79

80

81

82

83

84

85#if SIZEOF_DSA_POINTER == 4

86#define DSA_OFFSET_WIDTH 27

87#else

88#define DSA_OFFSET_WIDTH 40

89#endif

90

91

92

93

94

95

96

97#define DSA_DEFAULT_INIT_SEGMENT_SIZE ((size_t) (1 * 1024 * 1024))

98

99

100#define DSA_MIN_SEGMENT_SIZE ((size_t) (256 * 1024))

101

102

103#define DSA_MAX_SEGMENT_SIZE ((size_t) 1 << DSA_OFFSET_WIDTH)

104

105

106#define DsaPointerIsValid(x) ((x) != InvalidDsaPointer)

107

108

109#define dsa_allocate(area, size) \

110 dsa_allocate_extended(area, size, 0)

111

112

113#define dsa_allocate0(area, size) \

114 dsa_allocate_extended(area, size, DSA_ALLOC_ZERO)

115

116

117#define dsa_create(tranch_id) \

118 dsa_create_ext(tranch_id, DSA_DEFAULT_INIT_SEGMENT_SIZE, \

119 DSA_MAX_SEGMENT_SIZE)

120

121

122#define dsa_create_in_place(place, size, tranch_id, segment) \

123 dsa_create_in_place_ext(place, size, tranch_id, segment, \

124 DSA_DEFAULT_INIT_SEGMENT_SIZE, \

125 DSA_MAX_SEGMENT_SIZE)

126

127

128

129

130

131

132

133

134

135

137

138

139#define DSA_HANDLE_INVALID ((dsa_handle) DSM_HANDLE_INVALID)

140

142 size_t max_segment_size);

145 size_t init_segment_size,

146 size_t max_segment_size);

165

166#endif

dsa_area * dsa_attach(dsa_handle handle)

void dsa_trim(dsa_area *area)

dsa_area * dsa_create_in_place_ext(void *place, size_t size, int tranche_id, dsm_segment *segment, size_t init_segment_size, size_t max_segment_size)

dsa_area * dsa_attach_in_place(void *place, dsm_segment *segment)

void * dsa_get_address(dsa_area *area, dsa_pointer dp)

dsa_pointer dsa_allocate_extended(dsa_area *area, size_t size, int flags)

size_t dsa_get_total_size(dsa_area *area)

void dsa_on_shmem_exit_release_in_place(int, Datum)

dsa_area * dsa_create_ext(int tranche_id, size_t init_segment_size, size_t max_segment_size)

void dsa_release_in_place(void *place)

void dsa_set_size_limit(dsa_area *area, size_t limit)

pg_atomic_uint64 dsa_pointer_atomic

void dsa_unpin(dsa_area *area)

void dsa_pin_mapping(dsa_area *area)

void dsa_dump(dsa_area *area)

void dsa_on_dsm_detach_release_in_place(dsm_segment *, Datum)

dsa_handle dsa_get_handle(dsa_area *area)

void dsa_detach(dsa_area *area)

void dsa_free(dsa_area *area, dsa_pointer dp)

size_t dsa_minimum_size(void)

void dsa_pin(dsa_area *area)