Skip to content

Commit

Permalink
card: fix memory leak from nested function scoping (#33328)
Browse files Browse the repository at this point in the history
* stash

* no other leaks! pm.send grows memory usage by ~20mb but that's it

* undo

* clean up
  • Loading branch information
sshane authored Aug 19, 2024
1 parent 08f64ae commit ee9977d
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions selfdrive/car/card.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,18 @@ def is_dataclass(obj):
return hasattr(obj, _FIELDS)


def _asdictref_inner(obj) -> dict[str, Any] | Any:
if is_dataclass(obj):
ret = {}
for field in getattr(obj, _FIELDS): # similar to dataclasses.fields()
ret[field] = _asdictref_inner(getattr(obj, field))
return ret
elif isinstance(obj, (tuple, list)):
return type(obj)(_asdictref_inner(v) for v in obj)
else:
return obj


def asdictref(obj) -> dict[str, Any]:
"""
Similar to dataclasses.asdict without recursive type checking and copy.deepcopy
Expand All @@ -74,17 +86,6 @@ def asdictref(obj) -> dict[str, Any]:
if not is_dataclass(obj):
raise TypeError("asdictref() should be called on dataclass instances")

def _asdictref_inner(obj) -> dict[str, Any] | Any:
if is_dataclass(obj):
ret = {}
for field in getattr(obj, _FIELDS): # similar to dataclasses.fields()
ret[field] = _asdictref_inner(getattr(obj, field))
return ret
elif isinstance(obj, (tuple, list)):
return type(obj)(_asdictref_inner(v) for v in obj)
else:
return obj

return _asdictref_inner(obj)


Expand Down

0 comments on commit ee9977d

Please sign in to comment.