|
From: <sv...@va...> - 2005-09-18 09:45:41
|
Author: sewardj
Date: 2005-09-18 10:45:33 +0100 (Sun, 18 Sep 2005)
New Revision: 4675
Log:
do_mremap(): reinstate tool-notification tracking calls
Modified:
branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c
Modified: branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.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
--- branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-18 09:=
03:56 UTC (rev 4674)
+++ branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-18 09:=
45:33 UTC (rev 4675)
@@ -158,6 +158,8 @@
Addr new_addr, SizeT new_len,
UWord flags, ThreadId tid )
{
+# define MIN_SIZET(_aa,_bb) (_aa) < (_bb) ? (_aa) : (_bb)
+
Bool ok;
NSegment* old_seg;
Addr advised;
@@ -278,8 +280,15 @@
goto eNOMEM;
ok =3D VG_(am_relocate_nooverlap_client)
( old_addr, old_len, new_addr, new_len );
- if (ok)=20
+ if (ok) {
+ VG_TRACK( copy_mem_remap, old_addr, new_addr,=20
+ MIN_SIZET(old_len,new_len) );
+ if (new_len > old_len)
+ VG_TRACK( new_mem_mmap, new_addr+old_len, new_len-old_len,
+ old_seg->hasR, old_seg->hasW, old_seg->hasX );
+ VG_TRACK(die_mem_munmap, old_addr, old_len);
return VG_(mk_SysRes_Success)( new_addr );
+ }
goto eNOMEM;
}
=20
@@ -300,9 +309,12 @@
advised =3D VG_(am_get_advisory_client_simple)( needA, needL, &ok );
if (ok && advised =3D=3D needA) {
ok =3D VG_(am_extend_map_client)( old_seg, needL );
- old_seg =3D NULL;
- if (ok)
+ if (ok) {
+ VG_TRACK( new_mem_mmap, needA, needL,=20
+ old_seg->hasR,=20
+ old_seg->hasW, old_seg->hasX );
return VG_(mk_SysRes_Success)( old_addr );
+ }
}
=20
/* that failed. Look elsewhere. */
@@ -313,7 +325,15 @@
|| advised > old_addr+old_len-1);
ok =3D VG_(am_relocate_nooverlap_client)
( old_addr, old_len, advised, new_len );
- if (ok) return VG_(mk_SysRes_Success)( advised );
+ if (ok) {
+ VG_TRACK( copy_mem_remap, old_addr, new_addr,=20
+ MIN_SIZET(old_len,new_len) );
+ if (new_len > old_len)
+ VG_TRACK( new_mem_mmap, new_addr+old_len, new_len-old_len,
+ old_seg->hasR, old_seg->hasW, old_seg->hasX );
+ VG_TRACK(die_mem_munmap, old_addr, old_len);
+ return VG_(mk_SysRes_Success)( advised );
+ }
}
goto eNOMEM;
}
@@ -331,18 +351,20 @@
if (!ok || advised !=3D needA)
goto eNOMEM;
ok =3D VG_(am_extend_map_client)( old_seg, needL );
- old_seg =3D NULL;
if (!ok)
goto eNOMEM;
+ VG_TRACK( new_mem_mmap, needA, needL,=20
+ old_seg->hasR, old_seg->hasW, old_seg->hasX )=
;
return VG_(mk_SysRes_Success)( old_addr );
}
/*NOTREACHED*/ vg_assert(0);
=20
shrink_in_place:
{
- SysRes sres =3D VG_(am_munmap_client)( old_addr+new_len, old_len-new_=
len);
+ SysRes sres =3D VG_(am_munmap_client)( old_addr+new_len, old_len-new_=
len );
if (sres.isError)
return sres;
+ VG_TRACK( die_mem_munmap, old_addr+new_len, old_len-new_len );
return VG_(mk_SysRes_Success)( old_addr );
}
/*NOTREACHED*/ vg_assert(0);
@@ -355,6 +377,8 @@
return VG_(mk_SysRes_Error)( VKI_EINVAL );
eNOMEM:
return VG_(mk_SysRes_Error)( VKI_ENOMEM );
+
+# undef MIN_SIZET
}
=20
=20
|