PostgreSQL Source Code git master
Loading...
Searching...
No Matches
dsm_registry.h File Reference
#include "lib/dshash.h"
Include dependency graph for dsm_registry.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

voidGetNamedDSMSegment (const char *name, size_t size, void(*init_callback)(void *ptr, void *arg), bool *found, void *arg)
 
dsa_areaGetNamedDSA (const char *name, bool *found)
 
dshash_tableGetNamedDSHash (const char *name, const dshash_parameters *params, bool *found)
 
Size DSMRegistryShmemSize (void)
 
void DSMRegistryShmemInit (void)
 

Function Documentation

◆ DSMRegistryShmemInit()

void DSMRegistryShmemInit ( void  )
extern

Definition at line 124 of file dsm_registry.c.

125{
126 bool found;
127
129 ShmemInitStruct("DSM Registry Data",
131 &found);
132
133 if (!found)
134 {
137 }
138}
#define DSA_HANDLE_INVALID
Definition dsa.h:139
#define DSHASH_HANDLE_INVALID
Definition dshash.h:27
static DSMRegistryCtxStruct * DSMRegistryCtx
Size DSMRegistryShmemSize(void)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition shmem.c:381
dshash_table_handle dshh

References DSA_HANDLE_INVALID, DSMRegistryCtxStruct::dsah, DSHASH_HANDLE_INVALID, DSMRegistryCtxStruct::dshh, DSMRegistryCtx, DSMRegistryShmemSize(), and ShmemInitStruct().

Referenced by CreateOrAttachShmemStructs().

◆ DSMRegistryShmemSize()

Size DSMRegistryShmemSize ( void  )
extern

Definition at line 118 of file dsm_registry.c.

119{
120 return MAXALIGN(sizeof(DSMRegistryCtxStruct));
121}
#define MAXALIGN(LEN)
Definition c.h:898

References MAXALIGN.

Referenced by CalculateShmemSize(), and DSMRegistryShmemInit().

◆ GetNamedDSA()

dsa_area * GetNamedDSA ( const char name,
bool found 
)
extern

Definition at line 277 of file dsm_registry.c.

278{
279 DSMRegistryEntry *entry;
280 MemoryContext oldcontext;
281 dsa_area *ret;
283
284 Assert(found);
285
286 if (!name || *name == '\0')
288 (errmsg("DSA name cannot be empty")));
289
292 (errmsg("DSA name too long")));
293
294 /* Be sure any local memory allocated by DSM/DSA routines is persistent. */
296
297 /* Connect to the registry. */
299
301 state = &entry->dsa;
302 if (!(*found))
303 {
304 entry->type = DSMR_ENTRY_TYPE_DSA;
305 state->handle = DSA_HANDLE_INVALID;
306 state->tranche = -1;
307 }
308 else if (entry->type != DSMR_ENTRY_TYPE_DSA)
310 (errmsg("requested DSA does not match type of existing entry")));
311
312 if (state->tranche == -1)
313 {
314 *found = false;
315
316 /* Initialize the LWLock tranche for the DSA. */
317 state->tranche = LWLockNewTrancheId(name);
318 }
319
320 if (state->handle == DSA_HANDLE_INVALID)
321 {
322 *found = false;
323
324 /* Initialize the DSA. */
325 ret = dsa_create(state->tranche);
326 dsa_pin(ret);
327 dsa_pin_mapping(ret);
328
329 /* Store handle for other backends to use. */
330 state->handle = dsa_get_handle(ret);
331 }
332 else if (dsa_is_attached(state->handle))
334 (errmsg("requested DSA already attached to current process")));
335 else
336 {
337 /* Attach to existing DSA. */
338 ret = dsa_attach(state->handle);
339 dsa_pin_mapping(ret);
340 }
341
343 MemoryContextSwitchTo(oldcontext);
344
345 return ret;
346}
#define Assert(condition)
Definition c.h:945
dsa_area * dsa_attach(dsa_handle handle)
Definition dsa.c:510
void dsa_pin_mapping(dsa_area *area)
Definition dsa.c:650
dsa_handle dsa_get_handle(dsa_area *area)
Definition dsa.c:498
bool dsa_is_attached(dsa_handle handle)
Definition dsa.c:540
void dsa_pin(dsa_area *area)
Definition dsa.c:990
#define dsa_create(tranche_id)
Definition dsa.h:117
void dshash_release_lock(dshash_table *hash_table, void *entry)
Definition dshash.c:579
#define dshash_find_or_insert(hash_table, key, found)
Definition dshash.h:109
@ DSMR_ENTRY_TYPE_DSA
static void init_dsm_registry(void)
static dshash_table * dsm_registry_table
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
int LWLockNewTrancheId(const char *name)
Definition lwlock.c:597
MemoryContext TopMemoryContext
Definition mcxt.c:166
static char * errmsg
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
static int fb(int x)
NamedDSAState dsa
DSMREntryType type
const char * type
const char * name

References Assert, DSMRegistryEntry::dsa, dsa_attach(), dsa_create, dsa_get_handle(), DSA_HANDLE_INVALID, dsa_is_attached(), dsa_pin(), dsa_pin_mapping(), dshash_find_or_insert, dshash_release_lock(), dsm_registry_table, DSMR_ENTRY_TYPE_DSA, ereport, errmsg, ERROR, fb(), init_dsm_registry(), LWLockNewTrancheId(), MemoryContextSwitchTo(), name, TopMemoryContext, DSMRegistryEntry::type, and type.

Referenced by tdr_attach_shmem(), test_custom_stats_var_create(), test_custom_stats_var_from_serialized_data(), test_custom_stats_var_report(), and test_custom_stats_var_to_serialized_data().

◆ GetNamedDSHash()

dshash_table * GetNamedDSHash ( const char name,
const dshash_parameters params,
bool found 
)
extern

Definition at line 358 of file dsm_registry.c.

359{
360 DSMRegistryEntry *entry;
361 MemoryContext oldcontext;
362 dshash_table *ret;
364
365 Assert(params);
366 Assert(found);
367
368 if (!name || *name == '\0')
370 (errmsg("DSHash name cannot be empty")));
371
374 (errmsg("DSHash name too long")));
375
376 /* Be sure any local memory allocated by DSM/DSA routines is persistent. */
378
379 /* Connect to the registry. */
381
383 dsh_state = &entry->dsh;
384 if (!(*found))
385 {
386 entry->type = DSMR_ENTRY_TYPE_DSH;
387 dsh_state->dsa_handle = DSA_HANDLE_INVALID;
388 dsh_state->dsh_handle = DSHASH_HANDLE_INVALID;
389 dsh_state->tranche = -1;
390 }
391 else if (entry->type != DSMR_ENTRY_TYPE_DSH)
393 (errmsg("requested DSHash does not match type of existing entry")));
394
395 if (dsh_state->tranche == -1)
396 {
397 *found = false;
398
399 /* Initialize the LWLock tranche for the hash table. */
401 }
402
403 if (dsh_state->dsa_handle == DSA_HANDLE_INVALID)
404 {
406 dsa_area *dsa;
407
408 *found = false;
409
410 /* Initialize the DSA for the hash table. */
411 dsa = dsa_create(dsh_state->tranche);
412
413 /* Initialize the dshash table. */
414 memcpy(&params_copy, params, sizeof(dshash_parameters));
415 params_copy.tranche_id = dsh_state->tranche;
416 ret = dshash_create(dsa, &params_copy, NULL);
417
418 dsa_pin(dsa);
419 dsa_pin_mapping(dsa);
420
421 /* Store handles for other backends to use. */
422 dsh_state->dsa_handle = dsa_get_handle(dsa);
423 dsh_state->dsh_handle = dshash_get_hash_table_handle(ret);
424 }
425 else if (dsa_is_attached(dsh_state->dsa_handle))
427 (errmsg("requested DSHash already attached to current process")));
428 else
429 {
430 dsa_area *dsa;
431
432 /* XXX: Should we verify params matches what table was created with? */
433
434 /* Attach to existing DSA for the hash table. */
435 dsa = dsa_attach(dsh_state->dsa_handle);
436 dsa_pin_mapping(dsa);
437
438 /* Attach to existing dshash table. */
439 ret = dshash_attach(dsa, params, dsh_state->dsh_handle, NULL);
440 }
441
443 MemoryContextSwitchTo(oldcontext);
444
445 return ret;
446}
dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table)
Definition dshash.c:371
dshash_table * dshash_attach(dsa_area *area, const dshash_parameters *params, dshash_table_handle handle, void *arg)
Definition dshash.c:274
dshash_table * dshash_create(dsa_area *area, const dshash_parameters *params, void *arg)
Definition dshash.c:210
@ DSMR_ENTRY_TYPE_DSH
NamedDSHState dsh

References Assert, dsa_attach(), dsa_create, dsa_get_handle(), DSA_HANDLE_INVALID, dsa_is_attached(), dsa_pin(), dsa_pin_mapping(), DSMRegistryEntry::dsh, dshash_attach(), dshash_create(), dshash_find_or_insert, dshash_get_hash_table_handle(), DSHASH_HANDLE_INVALID, dshash_release_lock(), dsm_registry_table, DSMR_ENTRY_TYPE_DSH, ereport, errmsg, ERROR, fb(), init_dsm_registry(), LWLockNewTrancheId(), MemoryContextSwitchTo(), name, TopMemoryContext, DSMRegistryEntry::type, and type.

Referenced by tdr_attach_shmem().

◆ GetNamedDSMSegment()

void * GetNamedDSMSegment ( const char name,
size_t  size,
void(*)(void *ptr, void *arg init_callback,
bool found,
void arg 
)
extern

Definition at line 188 of file dsm_registry.c.

191{
192 DSMRegistryEntry *entry;
193 MemoryContext oldcontext;
194 void *ret;
196 dsm_segment *seg;
197
198 Assert(found);
199
200 if (!name || *name == '\0')
202 (errmsg("DSM segment name cannot be empty")));
203
206 (errmsg("DSM segment name too long")));
207
208 if (size == 0)
210 (errmsg("DSM segment size must be nonzero")));
211
212 /* Be sure any local memory allocated by DSM/DSA routines is persistent. */
214
215 /* Connect to the registry. */
217
219 state = &entry->dsm;
220 if (!(*found))
221 {
222 entry->type = DSMR_ENTRY_TYPE_DSM;
223 state->handle = DSM_HANDLE_INVALID;
224 state->size = size;
225 }
226 else if (entry->type != DSMR_ENTRY_TYPE_DSM)
228 (errmsg("requested DSM segment does not match type of existing entry")));
229 else if (state->size != size)
231 (errmsg("requested DSM segment size does not match size of existing segment")));
232
233 if (state->handle == DSM_HANDLE_INVALID)
234 {
235 *found = false;
236
237 /* Initialize the segment. */
238 seg = dsm_create(size, 0);
239
240 if (init_callback)
241 (*init_callback) (dsm_segment_address(seg), arg);
242
243 dsm_pin_segment(seg);
244 dsm_pin_mapping(seg);
245 state->handle = dsm_segment_handle(seg);
246 }
247 else
248 {
249 /* If the existing segment is not already attached, attach it now. */
250 seg = dsm_find_mapping(state->handle);
251 if (seg == NULL)
252 {
253 seg = dsm_attach(state->handle);
254 if (seg == NULL)
255 elog(ERROR, "could not map dynamic shared memory segment");
256
257 dsm_pin_mapping(seg);
258 }
259 }
260
261 ret = dsm_segment_address(seg);
263 MemoryContextSwitchTo(oldcontext);
264
265 return ret;
266}
dsm_handle dsm_segment_handle(dsm_segment *seg)
Definition dsm.c:1123
void dsm_pin_mapping(dsm_segment *seg)
Definition dsm.c:915
void dsm_pin_segment(dsm_segment *seg)
Definition dsm.c:955
void * dsm_segment_address(dsm_segment *seg)
Definition dsm.c:1095
dsm_segment * dsm_create(Size size, int flags)
Definition dsm.c:516
dsm_segment * dsm_attach(dsm_handle h)
Definition dsm.c:665
dsm_segment * dsm_find_mapping(dsm_handle handle)
Definition dsm.c:1076
#define DSM_HANDLE_INVALID
Definition dsm_impl.h:58
@ DSMR_ENTRY_TYPE_DSM
Datum arg
Definition elog.c:1322
#define elog(elevel,...)
Definition elog.h:226
NamedDSMState dsm

References arg, Assert, dshash_find_or_insert, dshash_release_lock(), DSMRegistryEntry::dsm, dsm_attach(), dsm_create(), dsm_find_mapping(), DSM_HANDLE_INVALID, dsm_pin_mapping(), dsm_pin_segment(), dsm_registry_table, dsm_segment_address(), dsm_segment_handle(), DSMR_ENTRY_TYPE_DSM, elog, ereport, errmsg, ERROR, fb(), init_dsm_registry(), MemoryContextSwitchTo(), name, TopMemoryContext, DSMRegistryEntry::type, and type.

Referenced by apw_init_shmem(), injection_init_shmem(), tdr_attach_shmem(), test_dsa_allocate(), test_dsa_basic(), and test_dsa_resowners().