diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 1999-03-06 21:17:56 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 1999-03-06 21:17:56 +0000 |
| commit | 731603a92b115db97c1202df243954195070c500 (patch) | |
| tree | 1f1226cc72e3635f2800042ebfda6316d9f8a2ea /src/backend/utils | |
| parent | 03842eb03bbded18a55177e40594018f05a73623 (diff) | |
| download | postgresql-731603a92b115db97c1202df243954195070c500.tar.gz | |
A few further tweaks to shared memory space estimation.
This change brings the default size of the main shmem block back under 1MB,
which is a fairly popular value for the kernel's SHMMAX parameter.
Diffstat (limited to 'src/backend/utils')
| -rw-r--r-- | src/backend/utils/hash/dynahash.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c index dcf4e4cce5..f9d8712053 100644 --- a/src/backend/utils/hash/dynahash.c +++ b/src/backend/utils/hash/dynahash.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/hash/dynahash.c,v 1.19 1999/02/22 06:16:47 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/hash/dynahash.c,v 1.20 1999/03/06 21:17:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -373,18 +373,23 @@ hash_estimate_size(long num_entries, long keysize, long datasize) long size = 0; long nBuckets, nSegments, + nDirEntries, nRecordAllocs, recordSize; /* estimate number of buckets wanted */ nBuckets = 1L << my_log2((num_entries - 1) / DEF_FFACTOR + 1); /* # of segments needed for nBuckets */ - nSegments = (nBuckets - 1) / DEF_SEGSIZE + 1; + nSegments = 1L << my_log2((nBuckets - 1) / DEF_SEGSIZE + 1); + /* directory entries */ + nDirEntries = DEF_DIRSIZE; + while (nDirEntries < nSegments) + nDirEntries <<= 1; /* dir_alloc doubles dsize at each call */ /* fixed control info */ size += MAXALIGN(sizeof(HHDR)); /* but not HTAB, per above */ - /* directory, assumed to be of size DEF_DIRSIZE */ - size += MAXALIGN(DEF_DIRSIZE * sizeof(SEG_OFFSET)); + /* directory */ + size += MAXALIGN(nDirEntries * sizeof(SEG_OFFSET)); /* segments */ size += nSegments * MAXALIGN(DEF_SEGSIZE * sizeof(BUCKET_INDEX)); /* records --- allocated in groups of BUCKET_ALLOC_INCR */ @@ -408,9 +413,6 @@ hash_estimate_size(long num_entries, long keysize, long datasize) void hash_destroy(HTAB *hashp) { - /* cannot destroy a shared memory hash table */ - Assert(!hashp->segbase); - if (hashp != NULL) { SEG_OFFSET segNum; @@ -422,6 +424,13 @@ hash_destroy(HTAB *hashp) q; ELEMENT *curr; + /* cannot destroy a shared memory hash table */ + Assert(!hashp->segbase); + /* allocation method must be one we know how to free, too */ + Assert(hashp->alloc == (dhalloc_ptr) MEM_ALLOC); + + hash_stats("destroy", hashp); + for (segNum = 0; nsegs > 0; nsegs--, segNum++) { @@ -435,11 +444,10 @@ hash_destroy(HTAB *hashp) MEM_FREE((char *) curr); } } - free((char *) segp); + MEM_FREE((char *) segp); } MEM_FREE((char *) hashp->dir); MEM_FREE((char *) hashp->hctl); - hash_stats("destroy", hashp); MEM_FREE((char *) hashp); } } |
