| 30 | | |
|---|
| 31 | | def gc_stats(self): |
|---|
| 32 | | return "%s %s %s %s" % (gc.collect(), |
|---|
| 33 | | len(get_instances(_cprequest.Request)), |
|---|
| 34 | | len(get_instances(_cprequest.Response)), |
|---|
| 35 | | len(gc.get_referrers(data))) |
|---|
| 36 | | gc_stats.exposed = True |
|---|
| 37 | | |
|---|
| 38 | | def gc_objtypes(self): |
|---|
| 39 | | data = {} |
|---|
| 40 | | for x in gc.get_objects(): |
|---|
| 41 | | data[type(x)] = data.get(type(x), 0) + 1 |
|---|
| 42 | | |
|---|
| 43 | | data = [(v, k) for k, v in data.iteritems()] |
|---|
| 44 | | data.sort() |
|---|
| 45 | | return "\n".join([repr(pair) for pair in data]) |
|---|
| 46 | | gc_objtypes.exposed = True |
|---|
| 65 | | class ReferenceTests(helper.CPWebCase): |
|---|
| 66 | | |
|---|
| 67 | | def test_threadlocal_garbage(self): |
|---|
| 68 | | def getpage(): |
|---|
| 69 | | self.getPage('/') |
|---|
| 70 | | self.assertBody("Hello world!") |
|---|
| 71 | | |
|---|
| 72 | | ts = [] |
|---|
| 73 | | for _ in range(25): |
|---|
| 74 | | t = threading.Thread(target=getpage) |
|---|
| 75 | | ts.append(t) |
|---|
| 76 | | t.start() |
|---|
| 77 | | |
|---|
| 78 | | for t in ts: |
|---|
| 79 | | t.join() |
|---|
| 80 | | |
|---|
| 81 | | self.getPage("/gc_stats") |
|---|
| 82 | | self.assertBody("0 1 1 1") |
|---|
| 83 | | |
|---|
| 84 | | # If gc_stats fails, choose "ignore" to see the type counts for |
|---|
| 85 | | # all the unreachable objects in this body. |
|---|
| 86 | | self.getPage("/gc_objtypes") |
|---|
| 87 | | self.assertBody("") |
|---|
| 88 | | |
|---|
| 89 | | |
|---|