@@ -75,6 +75,87 @@ RequestAddinShmemSpace(Size size)
75
75
total_addin_request = add_size (total_addin_request ,size );
76
76
}
77
77
78
+ /*
79
+ * CalculateShmemSize
80
+ *Calculates the amount of shared memory and number of semaphores needed.
81
+ *
82
+ * If num_semaphores is not NULL, it will be set to the number of semaphores
83
+ * required.
84
+ *
85
+ * Note that this function freezes the additional shared memory request size
86
+ * from loadable modules.
87
+ */
88
+ Size
89
+ CalculateShmemSize (int * num_semaphores )
90
+ {
91
+ Size size ;
92
+ int numSemas ;
93
+
94
+ /* Compute number of semaphores we'll need */
95
+ numSemas = ProcGlobalSemas ();
96
+ numSemas += SpinlockSemas ();
97
+
98
+ /* Return the number of semaphores if requested by the caller */
99
+ if (num_semaphores )
100
+ * num_semaphores = numSemas ;
101
+
102
+ /*
103
+ * Size of the Postgres shared-memory block is estimated via moderately-
104
+ * accurate estimates for the big hogs, plus 100K for the stuff that's too
105
+ * small to bother with estimating.
106
+ *
107
+ * We take some care to ensure that the total size request doesn't
108
+ * overflow size_t. If this gets through, we don't need to be so careful
109
+ * during the actual allocation phase.
110
+ */
111
+ size = 100000 ;
112
+ size = add_size (size ,PGSemaphoreShmemSize (numSemas ));
113
+ size = add_size (size ,SpinlockSemaSize ());
114
+ size = add_size (size ,hash_estimate_size (SHMEM_INDEX_SIZE ,
115
+ sizeof (ShmemIndexEnt )));
116
+ size = add_size (size ,dsm_estimate_size ());
117
+ size = add_size (size ,BufferShmemSize ());
118
+ size = add_size (size ,LockShmemSize ());
119
+ size = add_size (size ,PredicateLockShmemSize ());
120
+ size = add_size (size ,ProcGlobalShmemSize ());
121
+ size = add_size (size ,XLOGShmemSize ());
122
+ size = add_size (size ,CLOGShmemSize ());
123
+ size = add_size (size ,CommitTsShmemSize ());
124
+ size = add_size (size ,SUBTRANSShmemSize ());
125
+ size = add_size (size ,TwoPhaseShmemSize ());
126
+ size = add_size (size ,BackgroundWorkerShmemSize ());
127
+ size = add_size (size ,MultiXactShmemSize ());
128
+ size = add_size (size ,LWLockShmemSize ());
129
+ size = add_size (size ,ProcArrayShmemSize ());
130
+ size = add_size (size ,BackendStatusShmemSize ());
131
+ size = add_size (size ,SInvalShmemSize ());
132
+ size = add_size (size ,PMSignalShmemSize ());
133
+ size = add_size (size ,ProcSignalShmemSize ());
134
+ size = add_size (size ,CheckpointerShmemSize ());
135
+ size = add_size (size ,AutoVacuumShmemSize ());
136
+ size = add_size (size ,ReplicationSlotsShmemSize ());
137
+ size = add_size (size ,ReplicationOriginShmemSize ());
138
+ size = add_size (size ,WalSndShmemSize ());
139
+ size = add_size (size ,WalRcvShmemSize ());
140
+ size = add_size (size ,PgArchShmemSize ());
141
+ size = add_size (size ,ApplyLauncherShmemSize ());
142
+ size = add_size (size ,SnapMgrShmemSize ());
143
+ size = add_size (size ,BTreeShmemSize ());
144
+ size = add_size (size ,SyncScanShmemSize ());
145
+ size = add_size (size ,AsyncShmemSize ());
146
+ #ifdef EXEC_BACKEND
147
+ size = add_size (size ,ShmemBackendArraySize ());
148
+ #endif
149
+
150
+ /* freeze the addin request size and include it */
151
+ addin_request_allowed = false;
152
+ size = add_size (size ,total_addin_request );
153
+
154
+ /* might as well round it off to a multiple of a typical page size */
155
+ size = add_size (size ,8192 - (size %8192 ));
156
+
157
+ return size ;
158
+ }
78
159
79
160
/*
80
161
* CreateSharedMemoryAndSemaphores
@@ -102,65 +183,8 @@ CreateSharedMemoryAndSemaphores(void)
102
183
Size size ;
103
184
int numSemas ;
104
185
105
- /* Compute number of semaphores we'll need */
106
- numSemas = ProcGlobalSemas ();
107
- numSemas += SpinlockSemas ();
108
-
109
- /*
110
- * Size of the Postgres shared-memory block is estimated via
111
- * moderately-accurate estimates for the big hogs, plus 100K for the
112
- * stuff that's too small to bother with estimating.
113
- *
114
- * We take some care during this phase to ensure that the total size
115
- * request doesn't overflow size_t. If this gets through, we don't
116
- * need to be so careful during the actual allocation phase.
117
- */
118
- size = 100000 ;
119
- size = add_size (size ,PGSemaphoreShmemSize (numSemas ));
120
- size = add_size (size ,SpinlockSemaSize ());
121
- size = add_size (size ,hash_estimate_size (SHMEM_INDEX_SIZE ,
122
- sizeof (ShmemIndexEnt )));
123
- size = add_size (size ,dsm_estimate_size ());
124
- size = add_size (size ,BufferShmemSize ());
125
- size = add_size (size ,LockShmemSize ());
126
- size = add_size (size ,PredicateLockShmemSize ());
127
- size = add_size (size ,ProcGlobalShmemSize ());
128
- size = add_size (size ,XLOGShmemSize ());
129
- size = add_size (size ,CLOGShmemSize ());
130
- size = add_size (size ,CommitTsShmemSize ());
131
- size = add_size (size ,SUBTRANSShmemSize ());
132
- size = add_size (size ,TwoPhaseShmemSize ());
133
- size = add_size (size ,BackgroundWorkerShmemSize ());
134
- size = add_size (size ,MultiXactShmemSize ());
135
- size = add_size (size ,LWLockShmemSize ());
136
- size = add_size (size ,ProcArrayShmemSize ());
137
- size = add_size (size ,BackendStatusShmemSize ());
138
- size = add_size (size ,SInvalShmemSize ());
139
- size = add_size (size ,PMSignalShmemSize ());
140
- size = add_size (size ,ProcSignalShmemSize ());
141
- size = add_size (size ,CheckpointerShmemSize ());
142
- size = add_size (size ,AutoVacuumShmemSize ());
143
- size = add_size (size ,ReplicationSlotsShmemSize ());
144
- size = add_size (size ,ReplicationOriginShmemSize ());
145
- size = add_size (size ,WalSndShmemSize ());
146
- size = add_size (size ,WalRcvShmemSize ());
147
- size = add_size (size ,PgArchShmemSize ());
148
- size = add_size (size ,ApplyLauncherShmemSize ());
149
- size = add_size (size ,SnapMgrShmemSize ());
150
- size = add_size (size ,BTreeShmemSize ());
151
- size = add_size (size ,SyncScanShmemSize ());
152
- size = add_size (size ,AsyncShmemSize ());
153
- #ifdef EXEC_BACKEND
154
- size = add_size (size ,ShmemBackendArraySize ());
155
- #endif
156
-
157
- /* freeze the addin request size and include it */
158
- addin_request_allowed = false;
159
- size = add_size (size ,total_addin_request );
160
-
161
- /* might as well round it off to a multiple of a typical page size */
162
- size = add_size (size ,8192 - (size %8192 ));
163
-
186
+ /* Compute the size of the shared-memory block */
187
+ size = CalculateShmemSize (& numSemas );
164
188
elog (DEBUG3 ,"invoking IpcMemoryCreate(size=%zu)" ,size );
165
189
166
190
/*