| 26 | | return "%s %s %s %s" % (gc.collect(), |
|---|
| 27 | | len(get_instances(_cprequest.Request)), |
|---|
| 28 | | len(get_instances(_cprequest.Response)), |
|---|
| 29 | | len(gc.get_referrers(data))) |
|---|
| | 26 | output = [] |
|---|
| | 27 | |
|---|
| | 28 | # Uncollectable garbage |
|---|
| | 29 | |
|---|
| | 30 | # gc_collect isn't perfectly synchronous, because it may |
|---|
| | 31 | # break reference cycles that then take time to fully |
|---|
| | 32 | # finalize. Call it twice and hope for the best. |
|---|
| | 33 | gc.collect() |
|---|
| | 34 | unreachable = gc.collect() |
|---|
| | 35 | if unreachable: |
|---|
| | 36 | output.append("\n%s unreachable objects:" % unreachable) |
|---|
| | 37 | trash = {} |
|---|
| | 38 | for x in gc.garbage: |
|---|
| | 39 | trash[type(x)] = trash.get(type(x), 0) + 1 |
|---|
| | 40 | trash = [(v, k) for k, v in trash.iteritems()] |
|---|
| | 41 | trash.sort() |
|---|
| | 42 | for pair in trash: |
|---|
| | 43 | output.append(" " + repr(pair)) |
|---|
| | 44 | |
|---|
| | 45 | # Request references |
|---|
| | 46 | reqs = get_instances(_cprequest.Request) |
|---|
| | 47 | lenreqs = len(reqs) |
|---|
| | 48 | if lenreqs < 2: |
|---|
| | 49 | output.append("\nMissing Request reference. Should be 1 in " |
|---|
| | 50 | "this request thread and 1 in the main thread.") |
|---|
| | 51 | elif lenreqs > 2: |
|---|
| | 52 | output.append("\nToo many Request references (%r)." % lenreqs) |
|---|
| | 53 | for req in reqs: |
|---|
| | 54 | output.append("Referrers for %s:" % repr(req)) |
|---|
| | 55 | for ref in gc.get_referrers(req): |
|---|
| | 56 | if ref is not reqs: |
|---|
| | 57 | output.append(" %s" % repr(ref)) |
|---|
| | 58 | |
|---|
| | 59 | # Response references |
|---|
| | 60 | resps = get_instances(_cprequest.Response) |
|---|
| | 61 | lenresps = len(resps) |
|---|
| | 62 | if lenresps < 2: |
|---|
| | 63 | output.append("\nMissing Response reference. Should be 1 in " |
|---|
| | 64 | "this request thread and 1 in the main thread.") |
|---|
| | 65 | elif lenresps > 2: |
|---|
| | 66 | output.append("\nToo many Response references (%r)." % lenresps) |
|---|
| | 67 | for resp in resps: |
|---|
| | 68 | output.append("Referrers for %s:" % repr(resp)) |
|---|
| | 69 | for ref in gc.get_referrers(resp): |
|---|
| | 70 | if ref is not resps: |
|---|
| | 71 | output.append(" %s" % repr(ref)) |
|---|
| | 72 | |
|---|
| | 73 | return "\n".join(output) |
|---|