Commit 1e5fcaf
fix: prevent ProtocolCallback memory leak during tracing (#2977)
Fix memory leak where ProtocolCallback objects accumulated when tracing
was enabled. The issue affected both sync and async Playwright, but was
more severe in async usage where callbacks persisted permanently.
- When tracing is enabled, send_no_reply() creates ProtocolCallback objects
- These callbacks have circular references via task cancellation handlers
- For no_reply messages, futures are never resolved, preventing GC cleanup
- Each page operation during tracing leaked ~10 callbacks permanently
- Add no_reply parameter to ProtocolCallback constructor
- For no_reply=True: skip cancellation setup and resolve future immediately
- For no_reply=False: use full constructor with cancellation handling
- Update dispatch() to handle missing callbacks gracefully
- Added regression test in test_reference_count_async.py
- Test fails before fix (30+ leaked callbacks) and passes after (≤5)
- All existing tracing and asyncio tests continue to pass
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>1 parent e43199c commit 1e5fcaf
File tree
2 files changed
+86
-11
lines changed- playwright/_impl
- tests
2 files changed
+86
-11
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
218 | 218 | | |
219 | 219 | | |
220 | 220 | | |
221 | | - | |
| 221 | + | |
222 | 222 | | |
223 | | - | |
| 223 | + | |
224 | 224 | | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
225 | 231 | | |
226 | 232 | | |
227 | 233 | | |
| |||
360 | 366 | | |
361 | 367 | | |
362 | 368 | | |
363 | | - | |
364 | | - | |
365 | | - | |
366 | | - | |
367 | | - | |
368 | | - | |
369 | | - | |
370 | | - | |
| 369 | + | |
371 | 370 | | |
372 | 371 | | |
373 | 372 | | |
| |||
400 | 399 | | |
401 | 400 | | |
402 | 401 | | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
403 | 414 | | |
404 | 415 | | |
405 | 416 | | |
| |||
409 | 420 | | |
410 | 421 | | |
411 | 422 | | |
412 | | - | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
413 | 427 | | |
414 | 428 | | |
415 | 429 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
16 | 18 | | |
17 | 19 | | |
18 | 20 | | |
| |||
71 | 73 | | |
72 | 74 | | |
73 | 75 | | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
0 commit comments