297992 Support systems missing WIFCONTINUED (e.g. pre-2.6.10 Linux)
297993 Fix compilation of valgrind with gcc -g3.
298394 s390x: Don't bail out on an unknown machine model. Assume it's a new model.
+298943 massif asserts with --pages-as-heap=yes when brk is chaning by value different of page size
Release 3.7.0 (5 November 2011)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static
void ms_new_mem_brk ( Addr a, SizeT len, ThreadId tid )
{
- tl_assert(VG_IS_PAGE_ALIGNED(len));
- ms_record_page_mem(a, len);
+ // brk limit is not necessarily aligned on a page boundary.
+ // If new memory being brk-ed implies to allocate a new page,
+ // then call ms_record_page_mem with page aligned parameters
+ // otherwise just ignore.
+ Addr old_bottom_page = VG_PGROUNDDN(a - 1);
+ Addr new_top_page = VG_PGROUNDDN(a + len - 1);
+ if (old_bottom_page != new_top_page)
+ ms_record_page_mem(VG_PGROUNDDN(a),
+ (new_top_page - old_bottom_page));
}
static
static
void ms_die_mem_brk( Addr a, SizeT len )
{
- tl_assert(VG_IS_PAGE_ALIGNED(len));
- ms_unrecord_page_mem(a, len);
+ // Call ms_unrecord_page_mem only if one or more pages are de-allocated.
+ // See ms_new_mem_brk for more details.
+ Addr new_bottom_page = VG_PGROUNDDN(a - 1);
+ Addr old_top_page = VG_PGROUNDDN(a + len - 1);
+ if (old_top_page != new_bottom_page)
+ ms_unrecord_page_mem(VG_PGROUNDDN(a),
+ (old_top_page - new_bottom_page));
+
}
//------------------------------------------------------------//
null.post.exp null.stderr.exp null.vgtest \
one.post.exp one.post.exp2 one.stderr.exp one.vgtest \
overloaded-new.post.exp overloaded-new.stderr.exp overloaded-new.vgtest \
+ pages_as_heap.stderr.exp pages_as_heap.vgtest \
peak.post.exp peak.stderr.exp peak.vgtest \
peak2.post.exp peak2.stderr.exp peak2.vgtest \
realloc.post.exp realloc.stderr.exp realloc.vgtest \
null \
one \
overloaded-new \
+ pages_as_heap \
peak \
realloc \
thresholds \
--- /dev/null
+#include <stdio.h>
+#include <unistd.h>
+
+#define MAX 20000
+
+int main () {
+ char* ptr;
+ int i;
+ int inc_dec;
+ int delta;
+ int brk_stat;
+
+ // loop to first increase, then decrease
+ for (inc_dec = 1; inc_dec >= -1; inc_dec-=2) {
+ // loop to increase(decrease) with small then big delta
+ for (delta = 1; delta <= 400; delta+=399) {
+ if (0) printf("initial brk value for inc_dec %d delta %d: %p\n",
+ inc_dec, delta, sbrk(0));
+ for (i=0; i<MAX; i++) {
+ brk_stat = brk(sbrk(0) + inc_dec * delta);
+ if (brk_stat == -1) {
+ printf("brk value at failure: %p\n", sbrk(0));
+ perror ("brk() failed!\n");
+ return 0;
+ }
+ }
+ if (0) printf("resulting brk value for inc_dec %d delta %d: %p\n",
+ inc_dec, delta, sbrk(0));
+ }
+ }
+
+ return 0;
+}
--- /dev/null
+prog: pages_as_heap
+vgopts: --stacks=no --time-unit=B --heap-admin=0 --pages-as-heap=yes --massif-out-file=massif.out --detailed-freq=3
+vgopts: --ignore-fn=mmap
+# would be nice to test that pages as heap works properly using
+# post: perl ../../massif/ms_print massif.out | ../../tests/filter_addresses
+cleanup: rm massif.out