#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.
1.7.1