Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit565903a

Browse files
committed
Allow the element allocator for a simplehash to be specified.
This is infrastructure for a pending patch to allow parallel bitmapheap scans.Dilip Kumar, reviewed (in earlier versions) by Andres Freund and(more recently) by me. Some further renaming by me, also.
1 parent94708c0 commit565903a

File tree

3 files changed

+60
-14
lines changed

3 files changed

+60
-14
lines changed

‎src/backend/executor/execGrouping.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,8 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
330330
else
331331
hashtable->hash_iv=0;
332332

333-
hashtable->hashtab=tuplehash_create(tablecxt,nbuckets);
333+
hashtable->hashtab=
334+
tuplehash_create(tablecxt,nbuckets,NULL,NULL,NULL);
334335
hashtable->hashtab->private_data=hashtable;
335336

336337
returnhashtable;

‎src/backend/nodes/tidbitmap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ tbm_create_pagetable(TIDBitmap *tbm)
244244
Assert(tbm->status!=TBM_HASH);
245245
Assert(tbm->pagetable==NULL);
246246

247-
tbm->pagetable=pagetable_create(tbm->mcxt,128);
247+
tbm->pagetable=pagetable_create(tbm->mcxt,128,NULL,NULL,NULL);
248248

249249
/* If entry1 is valid, push it into the hashtable */
250250
if (tbm->status==TBM_ONE_PAGE)

‎src/include/lib/simplehash.h

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@
8787
#defineSH_INITIAL_BUCKET SH_MAKE_NAME(initial_bucket)
8888
#defineSH_ENTRY_HASH SH_MAKE_NAME(entry_hash)
8989

90+
/* Allocation function for hash table elements */
91+
typedefvoid*(*simplehash_allocate) (Sizesize,void*args);
92+
typedefvoid (*simplehash_free) (void*pointer,void*args);
93+
9094
/* generate forward declarations necessary to use the hash table */
9195
#ifdefSH_DECLARE
9296

@@ -112,6 +116,11 @@ typedef struct SH_TYPE
112116
/* hash buckets */
113117
SH_ELEMENT_TYPE*data;
114118

119+
/* Allocation and free functions, and the associated context. */
120+
simplehash_allocateelement_alloc;
121+
simplehash_freeelement_free;
122+
void*element_args;
123+
115124
/* memory context to use for allocations */
116125
MemoryContextctx;
117126

@@ -133,7 +142,8 @@ typedef struct SH_ITERATOR
133142
}SH_ITERATOR;
134143

135144
/* externally visible function prototypes */
136-
SH_SCOPESH_TYPE*SH_CREATE(MemoryContextctx,uint32nelements);
145+
SH_SCOPESH_TYPE*SH_CREATE(MemoryContextctx,uint32nelements,
146+
simplehash_allocateallocfunc,simplehash_freefreefunc,void*args);
137147
SH_SCOPEvoidSH_DESTROY(SH_TYPE*tb);
138148
SH_SCOPEvoidSH_GROW(SH_TYPE*tb,uint32newsize);
139149
SH_SCOPESH_ELEMENT_TYPE*SH_INSERT(SH_TYPE*tb,SH_KEY_TYPEkey,bool*found);
@@ -276,12 +286,35 @@ SH_ENTRY_HASH(SH_TYPE *tb, SH_ELEMENT_TYPE * entry)
276286
#endif
277287
}
278288

289+
/* default memory allocator function */
290+
staticvoid*
291+
SH_DEFAULT_ALLOC(Sizesize,void*args)
292+
{
293+
MemoryContextcontext= (MemoryContext)args;
294+
295+
returnMemoryContextAllocExtended(context,size,
296+
MCXT_ALLOC_HUGE |MCXT_ALLOC_ZERO);
297+
}
298+
299+
/* default memory free function */
300+
staticvoid
301+
SH_DEFAULT_FREE(void*pointer,void*args)
302+
{
303+
pfree(pointer);
304+
}
305+
279306
/*
280-
* Create a hash table with enough space for `nelements` distinct members,
281-
* allocating required memory in the passed-in context.
307+
* Create a hash table with enough space for `nelements` distinct members.
308+
* Memory for the hash table is allocated from the passed-in context. If
309+
* desired, the array of elements can be allocated using a passed-in allocator;
310+
* this could be useful in order to place the array of elements in a shared
311+
* memory, or in a context that will outlive the rest of the hash table.
312+
* Memory other than for the array of elements will still be allocated from
313+
* the passed-in context.
282314
*/
283315
SH_SCOPESH_TYPE*
284-
SH_CREATE(MemoryContextctx,uint32nelements)
316+
SH_CREATE(MemoryContextctx,uint32nelements,simplehash_allocateallocfunc,
317+
simplehash_freefreefunc,void*args)
285318
{
286319
SH_TYPE*tb;
287320
uint64size;
@@ -294,9 +327,22 @@ SH_CREATE(MemoryContext ctx, uint32 nelements)
294327

295328
SH_COMPUTE_PARAMETERS(tb,size);
296329

297-
tb->data=MemoryContextAllocExtended(tb->ctx,
298-
sizeof(SH_ELEMENT_TYPE)*tb->size,
299-
MCXT_ALLOC_HUGE |MCXT_ALLOC_ZERO);
330+
if (allocfunc==NULL)
331+
{
332+
tb->element_alloc=SH_DEFAULT_ALLOC;
333+
tb->element_free=SH_DEFAULT_FREE;
334+
tb->element_args=ctx;
335+
}
336+
else
337+
{
338+
tb->element_alloc=allocfunc;
339+
tb->element_free=freefunc;
340+
341+
tb->element_args=args;
342+
}
343+
344+
tb->data=tb->element_alloc(sizeof(SH_ELEMENT_TYPE)*tb->size,
345+
tb->element_args);
300346

301347
returntb;
302348
}
@@ -305,7 +351,7 @@ SH_CREATE(MemoryContext ctx, uint32 nelements)
305351
SH_SCOPEvoid
306352
SH_DESTROY(SH_TYPE*tb)
307353
{
308-
pfree(tb->data);
354+
tb->element_free(tb->data,tb->element_args);
309355
pfree(tb);
310356
}
311357

@@ -333,9 +379,8 @@ SH_GROW(SH_TYPE *tb, uint32 newsize)
333379
/* compute parameters for new table */
334380
SH_COMPUTE_PARAMETERS(tb,newsize);
335381

336-
tb->data=MemoryContextAllocExtended(
337-
tb->ctx,sizeof(SH_ELEMENT_TYPE)*tb->size,
338-
MCXT_ALLOC_HUGE |MCXT_ALLOC_ZERO);
382+
tb->data=tb->element_alloc(sizeof(SH_ELEMENT_TYPE)*tb->size,
383+
tb->element_args);
339384

340385
newdata=tb->data;
341386

@@ -421,7 +466,7 @@ SH_GROW(SH_TYPE *tb, uint32 newsize)
421466
}
422467
}
423468

424-
pfree(olddata);
469+
tb->element_free(olddata,tb->element_args);
425470
}
426471

427472
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp