You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-11-29 22:28:02 +02:00
Add memGrowRaw() to memory context module.
This commit is contained in:
@@ -11,6 +11,14 @@
|
||||
|
||||
<release-list>
|
||||
<release date="XXXX-XX-XX" version="1.27dev" title="UNDER DEVELOPMENT">
|
||||
<release-core-list>
|
||||
<release-development-list>
|
||||
<release-item>
|
||||
<p>Add <code>memGrowRaw()</code> to memory context module.</p>
|
||||
</release-item>
|
||||
</release-development-list>
|
||||
</release-core-list>
|
||||
|
||||
<release-doc-list>
|
||||
<release-development-list>
|
||||
<release-item>
|
||||
|
||||
@@ -35,7 +35,7 @@ use constant BACKREST_BIN => abs_path(
|
||||
# Defines the current version of the BackRest executable. The version number is used to track features but does not affect what
|
||||
# repositories or manifests can be read - that's the job of the format number.
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
use constant BACKREST_VERSION => '1.26';
|
||||
use constant BACKREST_VERSION => '1.27dev';
|
||||
push @EXPORT, qw(BACKREST_VERSION);
|
||||
|
||||
# Format Format Number
|
||||
|
||||
@@ -6,7 +6,7 @@ package pgBackRest::LibCAuto;
|
||||
# Library version (.999 indicates development version)
|
||||
sub libcAutoVersion
|
||||
{
|
||||
return '1.26';
|
||||
return '1.27.999';
|
||||
}
|
||||
|
||||
# Configuration option value constants
|
||||
|
||||
@@ -228,8 +228,8 @@ memContextAlloc(size_t size, bool zero)
|
||||
|
||||
// ReAllocate memory before modifying anything else in case there is an error
|
||||
memContextCurrent()->allocList = memReAllocInternal(
|
||||
memContextCurrent()->allocList, sizeof(void *) * memContextCurrent()->contextChildListSize,
|
||||
sizeof(MemContext *) * allocListSizeNew, true);
|
||||
memContextCurrent()->allocList, sizeof(void *) * memContextCurrent()->allocListSize,
|
||||
sizeof(void *) * allocListSizeNew, true);
|
||||
|
||||
// Set new size
|
||||
memContextCurrent()->allocListSize = allocListSizeNew;
|
||||
@@ -243,6 +243,30 @@ memContextAlloc(size_t size, bool zero)
|
||||
return memContextCurrent()->allocList[allocIdx];
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Find a memory allocation
|
||||
***********************************************************************************************************************************/
|
||||
static int
|
||||
memFind(const void *buffer)
|
||||
{
|
||||
// Error if buffer is null
|
||||
if (!buffer)
|
||||
THROW(AssertError, "unable to find null allocation");
|
||||
|
||||
// Find memory allocation
|
||||
int allocIdx;
|
||||
|
||||
for (allocIdx = 0; allocIdx < memContextCurrent()->allocListSize; allocIdx++)
|
||||
if (memContextCurrent()->allocList[allocIdx] == buffer)
|
||||
break;
|
||||
|
||||
// Error if the buffer was not found
|
||||
if (allocIdx == memContextCurrent()->allocListSize)
|
||||
THROW(AssertError, "unable to find allocation");
|
||||
|
||||
return allocIdx;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Allocate zeroed memory in the memory context
|
||||
***********************************************************************************************************************************/
|
||||
@@ -252,6 +276,21 @@ memNew(size_t size)
|
||||
return memContextAlloc(size, true);
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Grow allocated memory without initializing the new portion
|
||||
***********************************************************************************************************************************/
|
||||
void *
|
||||
memGrowRaw(const void *buffer, size_t size)
|
||||
{
|
||||
// Find the buffer
|
||||
int allocIdx = memFind(buffer);
|
||||
|
||||
// Grow the buffer
|
||||
memContextCurrent()->allocList[allocIdx] = memReAllocInternal(memContextCurrent()->allocList[allocIdx], 0, size, false);
|
||||
|
||||
return memContextCurrent()->allocList[allocIdx];
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Allocate memory in the memory context without initializing it
|
||||
***********************************************************************************************************************************/
|
||||
@@ -267,20 +306,8 @@ Free a memory allocation in the context
|
||||
void
|
||||
memFree(void *buffer)
|
||||
{
|
||||
// Error if buffer is null
|
||||
if (!buffer)
|
||||
THROW(AssertError, "unable to free null allocation");
|
||||
|
||||
// Find memory to free
|
||||
int allocIdx;
|
||||
|
||||
for (allocIdx = 0; allocIdx < memContextCurrent()->allocListSize; allocIdx++)
|
||||
if (memContextCurrent()->allocList[allocIdx] == buffer)
|
||||
break;
|
||||
|
||||
// Error if the buffer was not found
|
||||
if (allocIdx == memContextCurrent()->allocListSize)
|
||||
THROW(AssertError, "unable to find allocation");
|
||||
// Find the buffer
|
||||
int allocIdx = memFind(buffer);
|
||||
|
||||
// Free the buffer
|
||||
memFreeInternal(memContextCurrent()->allocList[allocIdx]);
|
||||
|
||||
@@ -81,6 +81,7 @@ These functions always new/free within the current memory context.
|
||||
***********************************************************************************************************************************/
|
||||
void *memNew(size_t size);
|
||||
void *memNewRaw(size_t size);
|
||||
void *memGrowRaw(const void *buffer, size_t size);
|
||||
void memFree(void *buffer);
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
|
||||
@@ -157,7 +157,7 @@ void testRun()
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------------
|
||||
if (testBegin("memContextAlloc(), memNew*(), and memFree()"))
|
||||
if (testBegin("memContextAlloc(), memNew*(), memGrow(), and memFree()"))
|
||||
{
|
||||
memContextSwitch(memContextTop());
|
||||
memNew(sizeof(size_t));
|
||||
@@ -185,9 +185,23 @@ void testRun()
|
||||
}
|
||||
|
||||
|
||||
unsigned char *buffer= memNewRaw(sizeof(size_t));
|
||||
unsigned char *buffer = memNewRaw(sizeof(size_t));
|
||||
|
||||
TEST_ERROR(memFree(NULL), AssertError, "unable to free null allocation");
|
||||
// Grow memory
|
||||
memset(buffer, 0xFE, sizeof(size_t));
|
||||
buffer = memGrowRaw(buffer, sizeof(size_t) * 2);
|
||||
|
||||
// Check that original portion of the buffer is preserved
|
||||
int expectedTotal = 0;
|
||||
|
||||
for (unsigned int charIdx = 0; charIdx < sizeof(size_t); charIdx++)
|
||||
if (buffer[charIdx] == 0xFE)
|
||||
expectedTotal++;
|
||||
|
||||
TEST_RESULT_INT(expectedTotal, sizeof(size_t), "all bytes are 0xFE in original portion");
|
||||
|
||||
// Free memory
|
||||
TEST_ERROR(memFree(NULL), AssertError, "unable to find null allocation");
|
||||
TEST_ERROR(memFree((void *)0x01), AssertError, "unable to find allocation");
|
||||
memFree(buffer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user