|
From: <sv...@va...> - 2009-06-03 13:05:28
|
Author: bart
Date: 2009-06-03 14:05:24 +0100 (Wed, 03 Jun 2009)
New Revision: 10229
Log:
Further reduced the number of memory allocations needed when DRD creates a new segment.
Modified:
branches/DRDDEV/drd/drd_vc.c
branches/DRDDEV/drd/drd_vc.h
Modified: branches/DRDDEV/drd/drd_vc.c
===================================================================
--- branches/DRDDEV/drd/drd_vc.c 2009-06-03 12:44:50 UTC (rev 10228)
+++ branches/DRDDEV/drd/drd_vc.c 2009-06-03 13:05:24 UTC (rev 10229)
@@ -338,25 +338,64 @@
void DRD_(vc_reserve)(VectorClock* const vc, const unsigned new_capacity)
{
tl_assert(vc);
+ tl_assert(vc->capacity > VC_PREALLOCATED
+ || vc->vc == 0
+ || vc->vc == vc->preallocated);
+
if (new_capacity > vc->capacity)
{
- if (vc->vc)
+ if (vc->vc && vc->capacity > VC_PREALLOCATED)
{
+ tl_assert(vc->vc
+ && vc->vc != vc->preallocated
+ && vc->capacity > VC_PREALLOCATED);
vc->vc = VG_(realloc)("drd.vc.vr.1",
vc->vc, new_capacity * sizeof(vc->vc[0]));
}
- else if (new_capacity > 0)
+ else if (vc->vc && new_capacity > VC_PREALLOCATED)
{
+ tl_assert((vc->vc == 0 || vc->vc == vc->preallocated)
+ && new_capacity > VC_PREALLOCATED
+ && vc->capacity <= VC_PREALLOCATED);
vc->vc = VG_(malloc)("drd.vc.vr.2",
new_capacity * sizeof(vc->vc[0]));
+ VG_(memcpy)(vc->vc, vc->preallocated,
+ vc->capacity * sizeof(vc->vc[0]));
}
+ else if (vc->vc)
+ {
+ tl_assert(vc->vc == vc->preallocated
+ && new_capacity <= VC_PREALLOCATED
+ && vc->capacity <= VC_PREALLOCATED);
+ }
+ else if (new_capacity > VC_PREALLOCATED)
+ {
+ tl_assert(vc->vc == 0
+ && new_capacity > VC_PREALLOCATED
+ && vc->capacity == 0);
+ vc->vc = VG_(malloc)("drd.vc.vr.3",
+ new_capacity * sizeof(vc->vc[0]));
+ }
else
{
- tl_assert(vc->vc == 0 && new_capacity == 0);
+ tl_assert(vc->vc == 0
+ && new_capacity <= VC_PREALLOCATED
+ && vc->capacity == 0);
+ vc->vc = vc->preallocated;
}
vc->capacity = new_capacity;
}
+ else if (new_capacity == 0 && vc->vc)
+ {
+ if (vc->capacity > VC_PREALLOCATED)
+ VG_(free)(vc->vc);
+ vc->vc = 0;
+ }
+
tl_assert(new_capacity == 0 || vc->vc != 0);
+ tl_assert(vc->capacity > VC_PREALLOCATED
+ || vc->vc == 0
+ || vc->vc == vc->preallocated);
}
#if 0
Modified: branches/DRDDEV/drd/drd_vc.h
===================================================================
--- branches/DRDDEV/drd/drd_vc.h 2009-06-03 12:44:50 UTC (rev 10228)
+++ branches/DRDDEV/drd/drd_vc.h 2009-06-03 13:05:24 UTC (rev 10229)
@@ -50,6 +50,9 @@
#include "pub_tool_basics.h" // Addr, SizeT
+#define VC_PREALLOCATED 8
+
+
/** Vector clock element. */
typedef struct
{
@@ -62,6 +65,7 @@
unsigned capacity; /**< number of elements allocated for array vc. */
unsigned size; /**< number of elements used of array vc. */
VCElem* vc; /**< vector clock elements. */
+ VCElem preallocated[VC_PREALLOCATED];
} VectorClock;
|