view tests/test-ui-verbosity.py.out @ 24710:909ee6b2a024

lazymanifest: prevent leak when updating an entry more than once __setitem__ on the lazymanifest C type wasn't checking to see if a line had previously been malloced before replacing it, leading to leaks if files got updated multiple times in the course of a task. I was able to reproduce the leak with this change to test-manifest.py: diff --git a/tests/test-manifest.py b/tests/test-manifest.py --- a/tests/test-manifest.py +++ b/tests/test-manifest.py @@ -456,6 +456,16 @@ class basemanifesttests(object): ['a/b/c/bar.txt', 'a/b/c/foo.txt', 'a/b/d/ten.txt'], m2.keys()) + def testManifestSetItem(self): + m = self.parsemanifest('') + for x in range(3): + m['file%d' % x] = BIN_HASH_1 + for x in range(3): + m['file%d' % x] = BIN_HASH_2 + import time + time.sleep(4) + + along with the commands: $ make local $ PYTHONPATH=. SILENT_BE_NOISY=1 python tests/test-manifest.py testmanifestdict.testManifestSetItem & $ sleep 4 $ leaks $(jobs -p | tee /dev/stderr | awk '{print $3}') $ wait in an interactive shell on OS X. As far as I can tell, it had to be an interactive shell so that I could get the pid of the test run using the jobs builtin. Prior to this change, I was leaking several strings, and after this change leaks reports no leaks. I thought there was a bug filed for this in bugzilla, but I can't find it either in bugzilla or by searching my email.
author Augie Fackler <augie@google.com>
date Sat, 11 Apr 2015 11:56:21 -0400
parents 807f3f5c60e9
children
line wrap: on
line source

      hgrc settings    command line options      final result   
    quiet verbo debug   quiet verbo debug      quiet verbo debug
 0  False False False   False False False  ->  False False False
 1   True False False   False False False  ->   True False False
 2  False  True False   False False False  ->  False  True False
 3   True  True False   False False False  ->  False False False
 4  False False  True   False False False  ->  False  True  True
 5   True False  True   False False False  ->  False  True  True
 6  False  True  True   False False False  ->  False  True  True
 7   True  True  True   False False False  ->  False  True  True
 8  False False False    True False False  ->   True False False
 9   True False False    True False False  ->   True False False
10  False  True False    True False False  ->   True False False
11   True  True False    True False False  ->   True False False
12  False False  True    True False False  ->   True False False
13   True False  True    True False False  ->   True False False
14  False  True  True    True False False  ->   True False False
15   True  True  True    True False False  ->   True False False
16  False False False   False  True False  ->  False  True False
17   True False False   False  True False  ->  False  True False
18  False  True False   False  True False  ->  False  True False
19   True  True False   False  True False  ->  False  True False
20  False False  True   False  True False  ->  False  True False
21   True False  True   False  True False  ->  False  True False
22  False  True  True   False  True False  ->  False  True False
23   True  True  True   False  True False  ->  False  True False
24  False False False    True  True False  ->  False False False
25   True False False    True  True False  ->  False False False
26  False  True False    True  True False  ->  False False False
27   True  True False    True  True False  ->  False False False
28  False False  True    True  True False  ->  False False False
29   True False  True    True  True False  ->  False False False
30  False  True  True    True  True False  ->  False False False
31   True  True  True    True  True False  ->  False False False
32  False False False   False False  True  ->  False  True  True
33   True False False   False False  True  ->  False  True  True
34  False  True False   False False  True  ->  False  True  True
35   True  True False   False False  True  ->  False  True  True
36  False False  True   False False  True  ->  False  True  True
37   True False  True   False False  True  ->  False  True  True
38  False  True  True   False False  True  ->  False  True  True
39   True  True  True   False False  True  ->  False  True  True
40  False False False    True False  True  ->  False  True  True
41   True False False    True False  True  ->  False  True  True
42  False  True False    True False  True  ->  False  True  True
43   True  True False    True False  True  ->  False  True  True
44  False False  True    True False  True  ->  False  True  True
45   True False  True    True False  True  ->  False  True  True
46  False  True  True    True False  True  ->  False  True  True
47   True  True  True    True False  True  ->  False  True  True
48  False False False   False  True  True  ->  False  True  True
49   True False False   False  True  True  ->  False  True  True
50  False  True False   False  True  True  ->  False  True  True
51   True  True False   False  True  True  ->  False  True  True
52  False False  True   False  True  True  ->  False  True  True
53   True False  True   False  True  True  ->  False  True  True
54  False  True  True   False  True  True  ->  False  True  True
55   True  True  True   False  True  True  ->  False  True  True
56  False False False    True  True  True  ->  False  True  True
57   True False False    True  True  True  ->  False  True  True
58  False  True False    True  True  True  ->  False  True  True
59   True  True False    True  True  True  ->  False  True  True
60  False False  True    True  True  True  ->  False  True  True
61   True False  True    True  True  True  ->  False  True  True
62  False  True  True    True  True  True  ->  False  True  True
63   True  True  True    True  True  True  ->  False  True  True