mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2024-12-12 10:04:14 +02:00
Add reset to temp memory contexts to save memory and processing time.
Processing large datasets in a memory context can lead to high memory usage and long allocation times. Add a new MEM_CONTEXT_TEMP_RESET_BEGIN() macro that allows temp allocations to be automatically freed after N iterations.
This commit is contained in:
parent
7d97d49f41
commit
d411321d28
@ -170,6 +170,29 @@ MEM_CONTEXT_TEMP_END();
|
|||||||
\
|
\
|
||||||
MEM_CONTEXT_BEGIN(MEM_CONTEXT_TEMP())
|
MEM_CONTEXT_BEGIN(MEM_CONTEXT_TEMP())
|
||||||
|
|
||||||
|
#define MEM_CONTEXT_TEMP_RESET_BEGIN() \
|
||||||
|
{ \
|
||||||
|
MemContext *MEM_CONTEXT_TEMP() = memContextNew("temporary"); \
|
||||||
|
unsigned int MEM_CONTEXT_TEMP_loopTotal = 0; \
|
||||||
|
\
|
||||||
|
MEM_CONTEXT_BEGIN(MEM_CONTEXT_TEMP())
|
||||||
|
|
||||||
|
#define MEM_CONTEXT_TEMP_RESET(resetTotal) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
MEM_CONTEXT_TEMP_loopTotal++; \
|
||||||
|
\
|
||||||
|
if (MEM_CONTEXT_TEMP_loopTotal >= resetTotal) \
|
||||||
|
{ \
|
||||||
|
memContextSwitch(MEM_CONTEXT_OLD()); \
|
||||||
|
memContextFree(MEM_CONTEXT_TEMP()); \
|
||||||
|
MEM_CONTEXT_TEMP() = memContextNew("temporary"); \
|
||||||
|
memContextSwitch(MEM_CONTEXT_TEMP()); \
|
||||||
|
MEM_CONTEXT_TEMP_loopTotal = 0; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#define MEM_CONTEXT_TEMP_END() \
|
#define MEM_CONTEXT_TEMP_END() \
|
||||||
/* Switch back to the old context and free temp context */ \
|
/* Switch back to the old context and free temp context */ \
|
||||||
FINALLY() \
|
FINALLY() \
|
||||||
|
@ -293,6 +293,19 @@ testRun(void)
|
|||||||
AssertError, "error in test block");
|
AssertError, "error in test block");
|
||||||
|
|
||||||
TEST_RESULT_STR(memContextName(memContextCurrent()), "TOP", "context is now top");
|
TEST_RESULT_STR(memContextName(memContextCurrent()), "TOP", "context is now top");
|
||||||
|
|
||||||
|
// Reset temp mem context after a single interation
|
||||||
|
// -------------------------------------------------------------------------------------------------------------------------
|
||||||
|
MEM_CONTEXT_TEMP_RESET_BEGIN()
|
||||||
|
{
|
||||||
|
TEST_RESULT_BOOL(MEM_CONTEXT_TEMP()->allocList[0].active, false, "nothing allocated");
|
||||||
|
memNew(99);
|
||||||
|
TEST_RESULT_BOOL(MEM_CONTEXT_TEMP()->allocList[0].active, true, "1 allocation");
|
||||||
|
|
||||||
|
MEM_CONTEXT_TEMP_RESET(1);
|
||||||
|
TEST_RESULT_BOOL(MEM_CONTEXT_TEMP()->allocList[0].active, false, "nothing allocated");
|
||||||
|
}
|
||||||
|
MEM_CONTEXT_TEMP_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
// *****************************************************************************************************************************
|
// *****************************************************************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user