#include "postgres.h"
#include "access/hash.h"
#include "access/relscan.h"
#include "utils/memutils.h"
#include "utils/rel.h"
#include "utils/resowner.h"
Go to the source code of this file.
Data Structures | |
struct | HashScanListData |
Typedefs | |
typedef struct HashScanListData | HashScanListData |
typedef HashScanListData * | HashScanList |
Functions | |
void | ReleaseResources_hash (void) |
void | _hash_regscan (IndexScanDesc scan) |
void | _hash_dropscan (IndexScanDesc scan) |
bool | _hash_has_active_scan (Relation rel, Bucket bucket) |
Variables | |
static HashScanList | HashScans = NULL |
typedef HashScanListData* HashScanList |
Definition at line 42 of file hashscan.c.
typedef struct HashScanListData HashScanListData |
void _hash_dropscan | ( | IndexScanDesc | scan | ) |
Definition at line 109 of file hashscan.c.
References elog, ERROR, HashScanListData::hashsl_next, HashScanListData::hashsl_scan, NULL, and pfree().
Referenced by hashendscan().
{ HashScanList chk, last; last = NULL; for (chk = HashScans; chk != NULL && chk->hashsl_scan != scan; chk = chk->hashsl_next) last = chk; if (chk == NULL) elog(ERROR, "hash scan list trashed; cannot find 0x%p", (void *) scan); if (last == NULL) HashScans = chk->hashsl_next; else last->hashsl_next = chk->hashsl_next; pfree(chk); }
Definition at line 135 of file hashscan.c.
References HashScanListData::hashsl_next, HashScanListData::hashsl_scan, HashScanOpaqueData::hashso_bucket, HashScanOpaqueData::hashso_bucket_valid, IndexScanDescData::indexRelation, IndexScanDescData::opaque, RelationData::rd_id, and RelationGetRelid.
Referenced by _hash_expandtable(), and hashbulkdelete().
{ Oid relid = RelationGetRelid(rel); HashScanList l; for (l = HashScans; l != NULL; l = l->hashsl_next) { if (relid == l->hashsl_scan->indexRelation->rd_id) { HashScanOpaque so = (HashScanOpaque) l->hashsl_scan->opaque; if (so->hashso_bucket_valid && so->hashso_bucket == bucket) return true; } } return false; }
void _hash_regscan | ( | IndexScanDesc | scan | ) |
Definition at line 93 of file hashscan.c.
References CurrentResourceOwner, HashScanListData::hashsl_next, HashScanListData::hashsl_owner, HashScanListData::hashsl_scan, MemoryContextAlloc(), and TopMemoryContext.
Referenced by hashbeginscan().
{ HashScanList new_el; new_el = (HashScanList) MemoryContextAlloc(TopMemoryContext, sizeof(HashScanListData)); new_el->hashsl_scan = scan; new_el->hashsl_owner = CurrentResourceOwner; new_el->hashsl_next = HashScans; HashScans = new_el; }
void ReleaseResources_hash | ( | void | ) |
Definition at line 53 of file hashscan.c.
References CurrentResourceOwner, HashScanListData::hashsl_next, HashScanListData::hashsl_owner, NULL, and pfree().
Referenced by ResourceOwnerReleaseInternal().
{ HashScanList l; HashScanList prev; HashScanList next; /* * Release all HashScanList items belonging to the current ResourceOwner. * Note that we do not release the underlying IndexScanDesc; that's in * executor memory and will go away on its own (in fact quite possibly has * gone away already, so we mustn't try to touch it here). * * Note: this should be a no-op during normal query shutdown. However, in * an abort situation ExecutorEnd is not called and so there may be open * index scans to clean up. */ prev = NULL; for (l = HashScans; l != NULL; l = next) { next = l->hashsl_next; if (l->hashsl_owner == CurrentResourceOwner) { if (prev == NULL) HashScans = next; else prev->hashsl_next = next; pfree(l); /* prev does not change */ } else prev = l; } }
HashScanList HashScans = NULL [static] |
Definition at line 44 of file hashscan.c.