]> granicus.if.org Git - postgresql/commitdiff
simplehash: Additional tweaks to make specifying an allocator work.
authorRobert Haas <rhaas@postgresql.org>
Thu, 9 Feb 2017 19:59:57 +0000 (14:59 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 9 Feb 2017 19:59:57 +0000 (14:59 -0500)
Even if we don't emit definitions for SH_ALLOCATE and SH_FREE, we
still need prototypes.  The user can't define them before including
simplehash.h because SH_TYPE isn't available yet.

For the allocator to be able to access private_data, it needs to
become an argument to SH_CREATE.  Previously we relied on callers
to set that after returning from SH_CREATE, but SH_CREATE calls
SH_ALLOCATE before returning.

Dilip Kumar, reviewed by me.

src/backend/executor/execGrouping.c
src/backend/nodes/tidbitmap.c
src/include/lib/simplehash.h

index 47c9656e1be1fd781a25846bbdf6f16717b972f5..4b1f634e2114ae03172b10e0f51aa78598e1ed13 100644 (file)
@@ -330,8 +330,7 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
        else
                hashtable->hash_iv = 0;
 
-       hashtable->hashtab = tuplehash_create(tablecxt, nbuckets);
-       hashtable->hashtab->private_data = hashtable;
+       hashtable->hashtab = tuplehash_create(tablecxt, nbuckets, hashtable);
 
        return hashtable;
 }
index 7b31948fd28a8993e01333c67a2b1145089089d8..0885812420906ec351d2e8062011eee9f14e38b8 100644 (file)
@@ -244,7 +244,7 @@ tbm_create_pagetable(TIDBitmap *tbm)
        Assert(tbm->status != TBM_HASH);
        Assert(tbm->pagetable == NULL);
 
-       tbm->pagetable = pagetable_create(tbm->mcxt, 128);
+       tbm->pagetable = pagetable_create(tbm->mcxt, 128, NULL);
 
        /* If entry1 is valid, push it into the hashtable */
        if (tbm->status == TBM_ONE_PAGE)
index ff50633549de218b50256be4dcf55b65d4fae712..2635bd720eb3f93ac87d5ebcc3996809cd78872e 100644 (file)
@@ -137,7 +137,8 @@ typedef struct SH_ITERATOR
 } SH_ITERATOR;
 
 /* externally visible function prototypes */
-SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements);
+SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
+                                                       void *private_data);
 SH_SCOPE void SH_DESTROY(SH_TYPE *tb);
 SH_SCOPE void SH_GROW(SH_TYPE *tb, uint32 newsize);
 SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT(SH_TYPE *tb, SH_KEY_TYPE key, bool *found);
@@ -280,6 +281,10 @@ SH_ENTRY_HASH(SH_TYPE *tb, SH_ELEMENT_TYPE * entry)
 #endif
 }
 
+/* default memory allocator function */
+static inline void *SH_ALLOCATE(SH_TYPE *type, Size size);
+static inline void SH_FREE(SH_TYPE *type, void *pointer);
+
 #ifndef SH_USE_NONDEFAULT_ALLOCATOR
 
 /* default memory allocator function */
@@ -309,13 +314,14 @@ SH_FREE(SH_TYPE *type, void *pointer)
  * the passed-in context.
  */
 SH_SCOPE SH_TYPE *
-SH_CREATE(MemoryContext ctx, uint32 nelements)
+SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
 {
        SH_TYPE    *tb;
        uint64          size;
 
        tb = MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
        tb->ctx = ctx;
+       tb->private_data = private_data;
 
        /* increase nelements by fillfactor, want to store nelements elements */
        size = Min((double) SH_MAX_SIZE, ((double) nelements) / SH_FILLFACTOR);