|
From: <sv...@va...> - 2006-08-16 17:51:32
|
Author: sewardj
Date: 2006-08-16 18:51:28 +0100 (Wed, 16 Aug 2006)
New Revision: 6006
Log:
A small fix to the "mempool trim" client request; the previous version
didn't cope with zero-sized chunks properly. (from Graydon Hoare).
Modified:
trunk/memcheck/mc_malloc_wrappers.c
Modified: trunk/memcheck/mc_malloc_wrappers.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_malloc_wrappers.c 2006-08-16 15:07:48 UTC (rev 6005=
)
+++ trunk/memcheck/mc_malloc_wrappers.c 2006-08-16 17:51:28 UTC (rev 6006=
)
@@ -492,23 +492,25 @@
=20
tl_assert(chunks !=3D NULL);
for (i =3D 0; i < n_shadows; ++i) {
+
+ Addr lo, hi;
+
mc =3D (MC_Chunk*) chunks[i];
=20
- if (mc->size =3D=3D 0)
- continue;
+ lo =3D mc->data;
+ hi =3D mc->size =3D=3D 0 ? mc->data : mc->data + mc->size - 1;
=20
#define EXTENT_CONTAINS(x) ((addr <=3D (x)) && ((x) < addr + size))
=20
- if (EXTENT_CONTAINS(mc->data) &&
- EXTENT_CONTAINS(mc->data + mc->size - 1)) {
+ if (EXTENT_CONTAINS(lo) && EXTENT_CONTAINS(hi)) {
=20
/* The current chunk is entirely within the trim extent: keep
it. */
=20
continue;
=20
- } else if ( (! EXTENT_CONTAINS(mc->data)) &&
- (! EXTENT_CONTAINS(mc->data + mc->size - 1)) ) {
+ } else if ( (! EXTENT_CONTAINS(lo)) &&
+ (! EXTENT_CONTAINS(hi)) ) {
=20
/* The current chunk is entirely outside the trim extent:
delete it. */
@@ -525,9 +527,8 @@
/* The current chunk intersects the trim extent: remove,
trim, and reinsert it. */
=20
- Addr lo, hi;
- tl_assert(EXTENT_CONTAINS(mc->data) ||
- EXTENT_CONTAINS(mc->data + mc->size - 1));
+ tl_assert(EXTENT_CONTAINS(lo) ||
+ EXTENT_CONTAINS(hi));
if (VG_(HT_remove)(mp->chunks, (UWord)mc->data) =3D=3D NULL) {
MC_(record_free_error)(tid, (Addr)mc->data);
VG_(free)(chunks);
|