|
From: <sv...@va...> - 2006-07-28 00:06:43
|
Author: sewardj
Date: 2006-07-28 01:06:37 +0100 (Fri, 28 Jul 2006)
New Revision: 5992
Log:
Add a mempool-trimming client request (Graydon Hoare).
Modified:
trunk/include/valgrind.h
trunk/memcheck/mc_include.h
trunk/memcheck/mc_main.c
trunk/memcheck/mc_malloc_wrappers.c
Modified: trunk/include/valgrind.h
=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/include/valgrind.h 2006-07-27 23:48:53 UTC (rev 5991)
+++ trunk/include/valgrind.h 2006-07-28 00:06:37 UTC (rev 5992)
@@ -2288,6 +2288,7 @@
VG_USERREQ__DESTROY_MEMPOOL =3D 0x1304,
VG_USERREQ__MEMPOOL_ALLOC =3D 0x1305,
VG_USERREQ__MEMPOOL_FREE =3D 0x1306,
+ VG_USERREQ__MEMPOOL_TRIM =3D 0x1307,
=20
/* Allow printfs to valgrind log. */
VG_USERREQ__PRINTF =3D 0x1401,
@@ -2499,6 +2500,14 @@
pool, addr, 0, 0, 0); \
}
=20
+/* Disassociate any pieces outside a particular range. */
+#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
+ {unsigned int _qzz_res; \
+ VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
+ VG_USERREQ__MEMPOOL_TRIM, \
+ pool, addr, size, 0, 0); \
+ }
+
/* Mark a piece of memory as being a stack. Returns a stack id. */
#define VALGRIND_STACK_REGISTER(start, end) \
({unsigned int _qzz_res; \
Modified: trunk/memcheck/mc_include.h
=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_include.h 2006-07-27 23:48:53 UTC (rev 5991)
+++ trunk/memcheck/mc_include.h 2006-07-28 00:06:37 UTC (rev 5992)
@@ -86,6 +86,7 @@
extern void MC_(mempool_alloc) ( ThreadId tid, Addr pool,
Addr addr, SizeT size );
extern void MC_(mempool_free) ( Addr pool, Addr addr );
+extern void MC_(mempool_trim) ( Addr pool, Addr addr, SizeT size );
=20
extern MC_Chunk* MC_(get_freed_list_head)( void );
=20
Modified: trunk/memcheck/mc_main.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_main.c 2006-07-27 23:48:53 UTC (rev 5991)
+++ trunk/memcheck/mc_main.c 2006-07-28 00:06:37 UTC (rev 5992)
@@ -4053,7 +4053,8 @@
&& VG_USERREQ__CREATE_MEMPOOL !=3D arg[0]
&& VG_USERREQ__DESTROY_MEMPOOL !=3D arg[0]
&& VG_USERREQ__MEMPOOL_ALLOC !=3D arg[0]
- && VG_USERREQ__MEMPOOL_FREE !=3D arg[0])
+ && VG_USERREQ__MEMPOOL_FREE !=3D arg[0]
+ && VG_USERREQ__MEMPOOL_TRIM !=3D arg[0])
return False;
=20
switch (arg[0]) {
@@ -4219,6 +4220,15 @@
return True;
}
=20
+ case VG_USERREQ__MEMPOOL_TRIM: {
+ Addr pool =3D (Addr)arg[1];
+ Addr addr =3D (Addr)arg[2];
+ UInt size =3D arg[3];
+
+ MC_(mempool_trim) ( pool, addr, size );
+ return True;
+ }
+
default:
VG_(message)(Vg_UserMsg,=20
"Warning: unknown memcheck client request code %ll=
x",
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-07-27 23:48:53 UTC (rev 5991=
)
+++ trunk/memcheck/mc_malloc_wrappers.c 2006-07-28 00:06:37 UTC (rev 5992=
)
@@ -469,6 +469,86 @@
die_and_free_mem ( tid, mc, mp->rzB );
}
=20
+
+void MC_(mempool_trim)(Addr pool, Addr addr, SizeT size)
+{
+ MC_Mempool* mp;
+ MC_Chunk* mc;
+ ThreadId tid =3D VG_(get_running_tid)();
+ UInt n_shadows, i;
+ VgHashNode** chunks;
+
+ mp =3D VG_(HT_lookup)(MC_(mempool_list), (UWord)pool);
+ if (mp =3D=3D NULL) {
+ MC_(record_illegal_mempool_error)(tid, pool);
+ return;
+ }
+
+ chunks =3D VG_(HT_to_array) ( mp->chunks, &n_shadows );
+ if (n_shadows =3D=3D 0) {
+ tl_assert(chunks =3D=3D NULL);
+ return;
+ }
+
+ tl_assert(chunks !=3D NULL);
+ for (i =3D 0; i < n_shadows; ++i) {
+ mc =3D (MC_Chunk*) chunks[i];
+
+ if (mc->size =3D=3D 0)
+ continue;
+
+#define EXTENT_CONTAINS(x) ((addr <=3D (x)) && ((x) < addr + size))
+
+ if (EXTENT_CONTAINS(mc->data) &&
+ EXTENT_CONTAINS(mc->data + mc->size - 1)) {
+
+ /* The current chunk is entirely within the trim extent: keep
+ it. */
+
+ continue;
+
+ } else if ( (! EXTENT_CONTAINS(mc->data)) &&
+ (! EXTENT_CONTAINS(mc->data + mc->size - 1)) ) {
+
+ /* The current chunk is entirely outside the trim extent:
+ delete it. */
+
+ if (VG_(HT_remove)(mp->chunks, (UWord)mc->data) =3D=3D NULL) {
+ MC_(record_free_error)(tid, (Addr)mc->data);
+ VG_(free)(chunks);
+ return;
+ }
+ die_and_free_mem ( tid, mc, mp->rzB ); =20
+
+ } else {
+
+ /* The current chunk intersects the trim extent: remove,
+ trim, and reinsert it. */
+
+ Addr lo, hi;
+ tl_assert(EXTENT_CONTAINS(mc->data) ||
+ EXTENT_CONTAINS(mc->data + mc->size - 1));
+ if (VG_(HT_remove)(mp->chunks, (UWord)mc->data) =3D=3D NULL) {
+ MC_(record_free_error)(tid, (Addr)mc->data);
+ VG_(free)(chunks);
+ return;
+ }
+
+ lo =3D mc->data > addr ? mc->data : addr;
+ hi =3D mc->data + mc->size < addr + size ? mc->data + mc->size =
: addr + size;
+
+ tl_assert(lo < hi);
+ mc->data =3D lo;
+ mc->size =3D (UInt) (hi - lo);
+ VG_(HT_add_node)( mp->chunks, mc ); =20
+ }
+
+#undef EXTENT_CONTAINS
+ =20
+ }
+ VG_(free)(chunks);
+}
+
/*------------------------------------------------------------*/
/*--- Statistics printing ---*/
/*------------------------------------------------------------*/
|