本文整理汇总了C++中MemoryContextReset函数的典型用法代码示例。如果您正苦于以下问题:C++ MemoryContextReset函数的具体用法?C++ MemoryContextReset怎么用?C++ MemoryContextReset使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MemoryContextReset函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: compute_metric
static
inline
double
compute_metric(PGFunction inMetricFn, MemoryContext inMemContext, Datum inVec1,
Datum inVec2) {
float8 distance;
MemoryContext oldContext;
oldContext = MemoryContextSwitchTo(inMemContext);
distance = DatumGetFloat8(DirectFunctionCall2(inMetricFn, inVec1, inVec2));
#ifdef GP_VERSION_NUM
/*
* Once the direct function calls have leaked enough memory, let's do some
* garbage collection...
* The 50k bound here is arbitrary, and motivated by ResetExprContext()
* in execUtils.c
*/
if(inMemContext->allBytesAlloc - inMemContext->allBytesFreed > 50000)
MemoryContextReset(inMemContext);
#else
/* PostgreSQL does not have the allBytesAlloc and allBytesFreed fields */
MemoryContextReset(inMemContext);
#endif
MemoryContextSwitchTo(oldContext);
return distance;
}
开发者ID:0x0all,项目名称:madlib,代码行数:30,代码来源:kmeans.c
示例2: spgistBuildCallback
/* Callback to process one heap tuple during IndexBuildHeapScan */
static void
spgistBuildCallback(Relation index, HeapTuple htup, Datum *values,
bool *isnull, bool tupleIsAlive, void *state)
{
SpGistBuildState *buildstate = (SpGistBuildState *) state;
MemoryContext oldCtx;
/* Work in temp context, and reset it after each tuple */
oldCtx = MemoryContextSwitchTo(buildstate->tmpCtx);
/*
* Even though no concurrent insertions can be happening, we still might
* get a buffer-locking failure due to bgwriter or checkpointer taking a
* lock on some buffer. So we need to be willing to retry. We can flush
* any temp data when retrying.
*/
while (!spgdoinsert(index, &buildstate->spgstate, &htup->t_self,
*values, *isnull))
{
MemoryContextReset(buildstate->tmpCtx);
}
MemoryContextSwitchTo(oldCtx);
MemoryContextReset(buildstate->tmpCtx);
}
开发者ID:ArgenBarbie,项目名称:postgresql-9.5.0,代码行数:26,代码来源:spginsert.c
示例3: PageMakeUnionKey
/*
* Make union of keys on page
*/
static IndexTuple
PageMakeUnionKey(GistVacuum *gv, Buffer buffer)
{
Page page = BufferGetPage(buffer);
IndexTuple *vec,
tmp,
res;
int veclen = 0;
MemoryContext oldCtx = MemoryContextSwitchTo(gv->opCtx);
vec = gistextractpage(page, &veclen);
/*
* we call gistunion() in temprorary context because user-defined
* functions called in gistunion() may do not free all memory
*/
tmp = gistunion(gv->index, vec, veclen, &(gv->giststate));
MemoryContextSwitchTo(oldCtx);
res = (IndexTuple) palloc(IndexTupleSize(tmp));
memcpy(res, tmp, IndexTupleSize(tmp));
ItemPointerSetBlockNumber(&(res->t_tid), BufferGetBlockNumber(buffer));
GistTupleSetValid(res);
MemoryContextReset(gv->opCtx);
return res;
}
开发者ID:KMU-embedded,项目名称:mosbench-ext,代码行数:32,代码来源:gistvacuum.c
示例4: elements_array_element_end
static void
elements_array_element_end(void *state, bool isnull)
{
ElementsState _state = (ElementsState) state;
MemoryContext old_cxt;
int len;
text *val;
HeapTuple tuple;
Datum values[1];
static bool nulls[1] = {false};
/* skip over nested objects */
if (_state->lex->lex_level != 1)
return;
/* use the tmp context so we can clean up after each tuple is done */
old_cxt = MemoryContextSwitchTo(_state->tmp_cxt);
len = _state->lex->prev_token_terminator - _state->result_start;
val = cstring_to_text_with_len(_state->result_start, len);
values[0] = PointerGetDatum(val);
tuple = heap_form_tuple(_state->ret_tdesc, values, nulls);
tuplestore_puttuple(_state->tuple_store, tuple);
/* clean up and switch back */
MemoryContextSwitchTo(old_cxt);
MemoryContextReset(_state->tmp_cxt);
}
开发者ID:50wu,项目名称:gpdb,代码行数:31,代码来源:jsonfuncs.c
示例5: brin_memtuple_initialize
/*
* Reset a BrinMemTuple to initial state. We return the same tuple, for
* notational convenience.
*/
BrinMemTuple *
brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
{
int i;
char *currdatum;
MemoryContextReset(dtuple->bt_context);
currdatum = (char *) dtuple +
MAXALIGN(sizeof(BrinMemTuple) +
sizeof(BrinValues) * brdesc->bd_tupdesc->natts);
for (i = 0; i < brdesc->bd_tupdesc->natts; i++)
{
dtuple->bt_columns[i].bv_allnulls = true;
dtuple->bt_columns[i].bv_hasnulls = false;
dtuple->bt_columns[i].bv_attno = i + 1;
dtuple->bt_columns[i].bv_allnulls = true;
dtuple->bt_columns[i].bv_hasnulls = false;
dtuple->bt_columns[i].bv_values = (Datum *) currdatum;
currdatum += sizeof(Datum) * brdesc->bd_info[i]->oi_nstored;
}
return dtuple;
}
开发者ID:adityavs,项目名称:postgres,代码行数:29,代码来源:brin_tuple.c
示例6: gistinsert
/*
* gistinsert -- wrapper for GiST tuple insertion.
*
* This is the public interface routine for tuple insertion in GiSTs.
* It doesn't do any work; just locks the relation and passes the buck.
*/
bool
gistinsert(Relation r, Datum *values, bool *isnull,
ItemPointer ht_ctid, Relation heapRel,
IndexUniqueCheck checkUnique,
IndexInfo *indexInfo)
{
GISTSTATE *giststate = (GISTSTATE *) indexInfo->ii_AmCache;
IndexTuple itup;
MemoryContext oldCxt;
/* Initialize GISTSTATE cache if first call in this statement */
if (giststate == NULL)
{
oldCxt = MemoryContextSwitchTo(indexInfo->ii_Context);
giststate = initGISTstate(r);
giststate->tempCxt = createTempGistContext();
indexInfo->ii_AmCache = (void *) giststate;
MemoryContextSwitchTo(oldCxt);
}
oldCxt = MemoryContextSwitchTo(giststate->tempCxt);
itup = gistFormTuple(giststate, r,
values, isnull, true /* size is currently bogus */ );
itup->t_tid = *ht_ctid;
gistdoinsert(r, itup, 0, giststate);
/* cleanup */
MemoryContextSwitchTo(oldCxt);
MemoryContextReset(giststate->tempCxt);
return false;
}
开发者ID:BertrandAreal,项目名称:postgres,代码行数:40,代码来源:gist.c
示例7: PLy_input_convert
/*
* Perform input conversion, given correctly-set-up state information.
*
* This is the outer-level entry point for any input conversion. Internally,
* the conversion functions recurse directly to each other.
*/
PyObject *
PLy_input_convert(PLyDatumToOb *arg, Datum val)
{
PyObject *result;
PLyExecutionContext *exec_ctx = PLy_current_execution_context();
MemoryContext scratch_context = PLy_get_scratch_context(exec_ctx);
MemoryContext oldcontext;
/*
* Do the work in the scratch context to avoid leaking memory from the
* datatype output function calls. (The individual PLyDatumToObFunc
* functions can't reset the scratch context, because they recurse and an
* inner one might clobber data an outer one still needs. So we do it
* once at the outermost recursion level.)
*
* We reset the scratch context before, not after, each conversion cycle.
* This way we aren't on the hook to release a Python refcount on the
* result object in case MemoryContextReset throws an error.
*/
MemoryContextReset(scratch_context);
oldcontext = MemoryContextSwitchTo(scratch_context);
result = arg->func(arg, val);
MemoryContextSwitchTo(oldcontext);
return result;
}
开发者ID:AmiGanguli,项目名称:postgres,代码行数:35,代码来源:plpy_typeio.c
示例8: gist_redo
void
gist_redo(XLogReaderState *record)
{
uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
MemoryContext oldCxt;
/*
* GiST indexes do not require any conflict processing. NB: If we ever
* implement a similar optimization we have in b-tree, and remove killed
* tuples outside VACUUM, we'll need to handle that here.
*/
oldCxt = MemoryContextSwitchTo(opCtx);
switch (info)
{
case XLOG_GIST_PAGE_UPDATE:
gistRedoPageUpdateRecord(record);
break;
case XLOG_GIST_PAGE_SPLIT:
gistRedoPageSplitRecord(record);
break;
case XLOG_GIST_CREATE_INDEX:
gistRedoCreateIndex(record);
break;
default:
elog(PANIC, "gist_redo: unknown op code %u", info);
}
MemoryContextSwitchTo(oldCxt);
MemoryContextReset(opCtx);
}
开发者ID:AmiGanguli,项目名称:postgres,代码行数:31,代码来源:gistxlog.c
示例9: ginBuildCallback
static void
ginBuildCallback(Relation index, HeapTuple htup, Datum *values,
bool *isnull, bool tupleIsAlive, void *state)
{
GinBuildState *buildstate = (GinBuildState *) state;
MemoryContext oldCtx;
if (*isnull)
return;
oldCtx = MemoryContextSwitchTo(buildstate->tmpCtx);
buildstate->indtuples += ginHeapTupleBulkInsert(buildstate, *values, &htup->t_self);
/* If we've maxed out our available memory, dump everything to the index */
/* Also dump if the tree seems to be getting too unbalanced */
if (buildstate->accum.allocatedMemory >= maintenance_work_mem * 1024L ||
buildstate->accum.maxdepth > GIN_MAX_TREE_DEPTH)
{
ItemPointerData *list;
Datum entry;
uint32 nlist;
while ((list = ginGetEntry(&buildstate->accum, &entry, &nlist)) != NULL)
ginEntryInsert(index, &buildstate->ginstate, entry, list, nlist, TRUE);
MemoryContextReset(buildstate->tmpCtx);
ginInitBA(&buildstate->accum);
}
MemoryContextSwitchTo(oldCtx);
}
开发者ID:KMU-embedded,项目名称:mosbench-ext,代码行数:32,代码来源:gininsert.c
示例10: DynamicScan_InitExpr
/*
* DynamicScan_InitExpr
* Initialize ExprState for a new partition from the plan's expressions
*/
static void
DynamicScan_InitExpr(ScanState* scanState)
{
MemoryContext oldCxt = NULL;
MemoryContext partCxt = DynamicScan_GetPartitionMemoryContext(scanState);
if (NULL != partCxt)
{
MemoryContextReset(partCxt);
/*
* Switch to partition memory context to prevent memory leak for
* per-partition data structures.
*/
oldCxt = MemoryContextSwitchTo(partCxt);
}
/*
* We might have reset the memory context. Set these dangling
* pointers to NULL so that we don't try to pfree them later
*/
scanState->ps.ps_ProjInfo = NULL;
scanState->ps.qual = NULL;
scanState->ps.targetlist = NULL;
/* Initialize child expressions */
scanState->ps.qual = (List*) ExecInitExpr((Expr*) scanState->ps.plan->qual,
(PlanState*) scanState);
scanState->ps.targetlist = (List*) ExecInitExpr(
(Expr*) scanState->ps.plan->targetlist, (PlanState*) scanState);
ExecAssignScanProjectionInfo(scanState);
if (NULL != oldCxt)
{
MemoryContextSwitchTo(oldCxt);
}
}
开发者ID:LJoNe,项目名称:gpdb,代码行数:38,代码来源:execDynamicScan.c
示例11: execTuplesMatch
/*
* execTuplesMatch
* Return true if two tuples match in all the indicated fields.
*
* This actually implements SQL's notion of "not distinct". Two nulls
* match, a null and a not-null don't match.
*
* slot1, slot2: the tuples to compare (must have same columns!)
* numCols: the number of attributes to be examined
* matchColIdx: array of attribute column numbers
* eqFunctions: array of fmgr lookup info for the equality functions to use
* evalContext: short-term memory context for executing the functions
*
* NB: evalContext is reset each time!
*/
bool
execTuplesMatch(TupleTableSlot *slot1,
TupleTableSlot *slot2,
int numCols,
AttrNumber *matchColIdx,
FmgrInfo *eqfunctions,
MemoryContext evalContext)
{
MemoryContext oldContext;
bool result;
int i;
/* Reset and switch into the temp context. */
MemoryContextReset(evalContext);
oldContext = MemoryContextSwitchTo(evalContext);
/*
* We cannot report a match without checking all the fields, but we can
* report a non-match as soon as we find unequal fields. So, start
* comparing at the last field (least significant sort key). That's the
* most likely to be different if we are dealing with sorted input.
*/
result = true;
for (i = numCols; --i >= 0;)
{
AttrNumber att = matchColIdx[i];
Datum attr1,
attr2;
bool isNull1,
isNull2;
attr1 = slot_getattr(slot1, att, &isNull1);
attr2 = slot_getattr(slot2, att, &isNull2);
if (isNull1 != isNull2)
{
result = false; /* one null and one not; they aren't equal */
break;
}
if (isNull1)
continue; /* both are null, treat as equal */
/* Apply the type-specific equality function */
if (!DatumGetBool(FunctionCall2(&eqfunctions[i],
attr1, attr2)))
{
result = false; /* they aren't equal */
break;
}
}
MemoryContextSwitchTo(oldContext);
return result;
}
开发者ID:dreamsxin,项目名称:postgresql-1,代码行数:74,代码来源:execGrouping.c
示例12: MemoryContextResetAndDeleteChildren
/*
* MemoryContextResetAndDeleteChildren
* Release all space allocated within a context and delete all
* its descendants.
*
* This is a common combination case where we want to preserve the
* specific context but get rid of absolutely everything under it.
*/
void
MemoryContextResetAndDeleteChildren(MemoryContext context)
{
AssertArg(MemoryContextIsValid(context));
MemoryContextDeleteChildren(context);
MemoryContextReset(context);
}
开发者ID:adunstan,项目名称:postgresql-dev,代码行数:16,代码来源:mcxt.c
示例13: ReScanExprContext
/*
* ReScanExprContext
*
* Reset an expression context in preparation for a rescan of its
* plan node. This requires calling any registered shutdown callbacks,
* since any partially complete set-returning-functions must be canceled.
*
* Note we make no assumption about the caller's memory context.
*/
void
ReScanExprContext(ExprContext *econtext)
{
/* Call any registered callbacks */
ShutdownExprContext(econtext, true);
/* And clean up the memory used */
MemoryContextReset(econtext->ecxt_per_tuple_memory);
}
开发者ID:pavanvd,项目名称:postgres-xl,代码行数:17,代码来源:execUtils.c
示例14: PLyDict_FromTuple
/*
* Transform a tuple into a Python dict object.
*/
PyObject *
PLyDict_FromTuple(PLyTypeInfo *info, HeapTuple tuple, TupleDesc desc)
{
PyObject *volatile dict;
PLyExecutionContext *exec_ctx = PLy_current_execution_context();
MemoryContext oldcontext = CurrentMemoryContext;
int i;
if (info->is_rowtype != 1)
elog(ERROR, "PLyTypeInfo structure describes a datum");
dict = PyDict_New();
if (dict == NULL)
PLy_elog(ERROR, "could not create new dictionary");
PG_TRY();
{
/*
* Do the work in the scratch context to avoid leaking memory from the
* datatype output function calls.
*/
MemoryContextSwitchTo(exec_ctx->scratch_ctx);
for (i = 0; i < info->in.r.natts; i++)
{
char *key;
Datum vattr;
bool is_null;
PyObject *value;
if (desc->attrs[i]->attisdropped)
continue;
key = NameStr(desc->attrs[i]->attname);
vattr = heap_getattr(tuple, (i + 1), desc, &is_null);
if (is_null || info->in.r.atts[i].func == NULL)
PyDict_SetItemString(dict, key, Py_None);
else
{
value = (info->in.r.atts[i].func) (&info->in.r.atts[i], vattr);
PyDict_SetItemString(dict, key, value);
Py_DECREF(value);
}
}
MemoryContextSwitchTo(oldcontext);
MemoryContextReset(exec_ctx->scratch_ctx);
}
PG_CATCH();
{
MemoryContextSwitchTo(oldcontext);
Py_DECREF(dict);
PG_RE_THROW();
}
PG_END_TRY();
return dict;
}
开发者ID:AllenDou,项目名称:postgresql,代码行数:60,代码来源:plpy_typeio.c
示例15: pg_callable_func
static int
pg_callable_func(lua_State *L)
{
MemoryContext m;
int i;
FunctionCallInfoData fcinfo;
Lua_pgfunc *fi;
fi = (Lua_pgfunc *) lua_touserdata(L, lua_upvalueindex(1));
InitFunctionCallInfoData(fcinfo, &fi->fi, fi->numargs, InvalidOid, NULL, NULL);
if(tmpcontext_usage> RESET_CONTEXT_AFTER ){
MemoryContextReset(tmpcontext);
tmpcontext_usage = 0;
}
++tmpcontext_usage;
m = MemoryContextSwitchTo(tmpcontext);
for (i=0; i<fi->numargs; ++i){
fcinfo.arg[i] = luaP_todatum(L, fi->argtypes[i], 0, &fcinfo.argnull[i], i+1);
}
if(!fi->options.only_internal && fi->options.throwable){
SPI_push();
PG_TRY();
{
Datum d = FunctionCallInvoke(&fcinfo);
MemoryContextSwitchTo(m);
if (fcinfo.isnull) {
lua_pushnil(L);
} else {
luaP_pushdatum(L, d, fi->prorettype);
}
SPI_pop();
}
PG_CATCH();
{
lua_pop(L, lua_gettop(L));
push_spi_error(L, m); /*context switch to m inside push_spi_error*/
SPI_pop();
return lua_error(L);
}PG_END_TRY();
}else{
Datum d = FunctionCallInvoke(&fcinfo);
MemoryContextSwitchTo(m);
if (fcinfo.isnull) {
lua_pushnil(L);
} else {
luaP_pushdatum(L, d, fi->prorettype);
}
}
return 1;
}
开发者ID:eugwne,项目名称:pllua,代码行数:56,代码来源:pllua_pgfunc.c
示例16: MemoryContextResetChildren
/*
* MemoryContextResetChildren
* Release all space allocated within a context's descendants,
* but don't delete the contexts themselves. The named context
* itself is not touched.
*/
void
MemoryContextResetChildren(MemoryContext context)
{
MemoryContext child;
AssertArg(MemoryContextIsValid(context));
for (child = context->firstchild; child != NULL; child = child->nextchild)
MemoryContextReset(child);
}
开发者ID:adunstan,项目名称:postgresql-dev,代码行数:16,代码来源:mcxt.c
示例17: sepgsql_avc_reset
/*
* Reset all the avc caches
*/
static void
sepgsql_avc_reset(void)
{
MemoryContextReset(avc_mem_cxt);
memset(avc_slots, 0, sizeof(List *) * AVC_NUM_SLOTS);
avc_num_caches = 0;
avc_lru_hint = 0;
avc_unlabeled = NULL;
}
开发者ID:ArgenBarbie,项目名称:postgresql-9.5.0,代码行数:13,代码来源:uavc.c
示例18: gistfindnext
/*
* Return the offset of the first index entry that is consistent with
* the search key after offset 'n' in the current page. If there are
* no more consistent entries, return InvalidOffsetNumber.
* Page should be locked....
*/
static OffsetNumber
gistfindnext(IndexScanDesc scan, OffsetNumber n, ScanDirection dir)
{
OffsetNumber maxoff;
IndexTuple it;
GISTScanOpaque so;
MemoryContext oldcxt;
Page p;
so = (GISTScanOpaque) scan->opaque;
p = BufferGetPage(so->curbuf);
maxoff = PageGetMaxOffsetNumber(p);
/*
* Make sure we're in a short-lived memory context when we invoke a
* user-supplied GiST method in gistindex_keytest(), so we don't leak
* memory
*/
oldcxt = MemoryContextSwitchTo(so->tempCxt);
/*
* If we modified the index during the scan, we may have a pointer to a
* ghost tuple, before the scan. If this is the case, back up one.
*/
if (so->flags & GS_CURBEFORE)
{
so->flags &= ~GS_CURBEFORE;
n = OffsetNumberPrev(n);
}
while (n >= FirstOffsetNumber && n <= maxoff)
{
it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
if (gistindex_keytest(it, scan, n))
break;
if (ScanDirectionIsBackward(dir))
n = OffsetNumberPrev(n);
else
n = OffsetNumberNext(n);
}
MemoryContextSwitchTo(oldcxt);
MemoryContextReset(so->tempCxt);
/*
* If we found a matching entry, return its offset; otherwise return
* InvalidOffsetNumber to inform the caller to go to the next page.
*/
if (n >= FirstOffsetNumber && n <= maxoff)
return n;
else
return InvalidOffsetNumber;
}
开发者ID:50wu,项目名称:gpdb,代码行数:60,代码来源:gistget.c
示例19: brin_memtuple_initialize
/*
* Reset a BrinMemTuple to initial state
*/
void
brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
{
int i;
MemoryContextReset(dtuple->bt_context);
for (i = 0; i < brdesc->bd_tupdesc->natts; i++)
{
dtuple->bt_columns[i].bv_allnulls = true;
dtuple->bt_columns[i].bv_hasnulls = false;
}
}
开发者ID:0x0FFF,项目名称:postgres,代码行数:15,代码来源:brin_tuple.c
示例20: ResetPMJC
/**
* Reset the context.
*/
static void ResetPMJC(PartitionJoinMutatorContext *ctx)
{
ctx->safeToConvert = true;
ctx->partitionOid = InvalidOid;
ctx->partitionVarno = 0;
ctx->partitionInfo = NULL;
ctx->partitionKeySet = NULL;
ctx->joinKeySet = NULL;
ctx->outerPlan = NULL;
ctx->outerTargetList = NULL;
MemoryContextReset(ctx->localCtx);
}
开发者ID:huor,项目名称:gpdb,代码行数:16,代码来源:planpartition.c
注:本文中的MemoryContextReset函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论