Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "postgres.h"
00023
00024 #include "storage/bufmgr.h"
00025 #include "storage/buf_internals.h"
00026
00027
00028
00029 typedef struct
00030 {
00031 BufferTag key;
00032 int id;
00033 } BufferLookupEnt;
00034
00035 static HTAB *SharedBufHash;
00036
00037
00038
00039
00040
00041
00042 Size
00043 BufTableShmemSize(int size)
00044 {
00045 return hash_estimate_size(size, sizeof(BufferLookupEnt));
00046 }
00047
00048
00049
00050
00051
00052 void
00053 InitBufTable(int size)
00054 {
00055 HASHCTL info;
00056
00057
00058
00059
00060 info.keysize = sizeof(BufferTag);
00061 info.entrysize = sizeof(BufferLookupEnt);
00062 info.hash = tag_hash;
00063 info.num_partitions = NUM_BUFFER_PARTITIONS;
00064
00065 SharedBufHash = ShmemInitHash("Shared Buffer Lookup Table",
00066 size, size,
00067 &info,
00068 HASH_ELEM | HASH_FUNCTION | HASH_PARTITION);
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 uint32
00081 BufTableHashCode(BufferTag *tagPtr)
00082 {
00083 return get_hash_value(SharedBufHash, (void *) tagPtr);
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 int
00093 BufTableLookup(BufferTag *tagPtr, uint32 hashcode)
00094 {
00095 BufferLookupEnt *result;
00096
00097 result = (BufferLookupEnt *)
00098 hash_search_with_hash_value(SharedBufHash,
00099 (void *) tagPtr,
00100 hashcode,
00101 HASH_FIND,
00102 NULL);
00103
00104 if (!result)
00105 return -1;
00106
00107 return result->id;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 int
00121 BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id)
00122 {
00123 BufferLookupEnt *result;
00124 bool found;
00125
00126 Assert(buf_id >= 0);
00127 Assert(tagPtr->blockNum != P_NEW);
00128
00129 result = (BufferLookupEnt *)
00130 hash_search_with_hash_value(SharedBufHash,
00131 (void *) tagPtr,
00132 hashcode,
00133 HASH_ENTER,
00134 &found);
00135
00136 if (found)
00137 return result->id;
00138
00139 result->id = buf_id;
00140
00141 return -1;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150 void
00151 BufTableDelete(BufferTag *tagPtr, uint32 hashcode)
00152 {
00153 BufferLookupEnt *result;
00154
00155 result = (BufferLookupEnt *)
00156 hash_search_with_hash_value(SharedBufHash,
00157 (void *) tagPtr,
00158 hashcode,
00159 HASH_REMOVE,
00160 NULL);
00161
00162 if (!result)
00163 elog(ERROR, "shared buffer hash table corrupted");
00164 }