Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
* Remove uses of pkg_resources in non-namespace packages. (#7902)
* [bazel/py] Omit google/__init__.py from the Protobuf runtime. (#7908)
* Removed the unnecessary setuptools package dependency for Python package (#7511)
* Fix PyUnknownFields memory leak (#7928)

PHP
* Added support for "==" to the PHP C extension (#7883)
Expand Down
24 changes: 24 additions & 0 deletions python/google/protobuf/internal/unknown_fields_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@
import unittest2 as unittest #PY26
except ImportError:
import unittest
import sys
try:
import tracemalloc
except ImportError:
# Requires python 3.4+
pass
from google.protobuf import map_unittest_pb2
from google.protobuf import unittest_mset_pb2
from google.protobuf import unittest_pb2
Expand Down Expand Up @@ -312,6 +318,24 @@ def testClear(self):
self.assertIn('UnknownFields does not exist.',
str(context.exception))

@unittest.skipIf((sys.version_info.major, sys.version_info.minor) < (3, 4),
'tracemalloc requires python 3.4+')
def testUnknownFieldsNoMemoryLeak(self):
# Call to UnknownFields must not leak memory
nb_leaks = 1234
def leaking_function():
for _ in range(nb_leaks):
self.empty_message.UnknownFields()
tracemalloc.start()
snapshot1 = tracemalloc.take_snapshot()
leaking_function()
snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
tracemalloc.stop()
# There's no easy way to look for a precise leak source.
# Rely on a "marker" count value while checking allocated memory.
self.assertEqual([], [x for x in top_stats if x.count_diff == nb_leaks])

def testSubUnknownFields(self):
message = unittest_pb2.TestAllTypes()
message.optionalgroup.a = 123
Expand Down
1 change: 1 addition & 0 deletions python/google/protobuf/pyext/unknown_fields.cc
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ static void Dealloc(PyObject* pself) {
}
Py_CLEAR(self->parent);
self->~PyUnknownFields();
Py_TYPE(pself)->tp_free(pself);
}

static PySequenceMethods SqMethods = {
Expand Down