Archived

This forum has been archived. Please start a new discussion on GitHub.

Python seems to leak communicator objects

With 3.3.1, the following code:
import Ice
import gc

ic = Ice.initialize()
ic.shutdown()
ic.destroy()
del ic
reload(Ice)
gc.collect()

print "GLOBAL"
print dir()

print "LEFTOVER"
for o in gc.get_objects():
    if str(type(o)).find("Ice") > -1:
        print type(o)

prints:
GLOBAL
['Ice', '__builtins__', '__doc__', '__file__', '__name__', 'gc']
LEFTOVER
<class 'Ice.OperationMode'>
<class 'Ice.OperationMode'>
<class 'Ice.OperationMode'>
<class 'Ice.EndpointSelectionType'>
<class 'Ice.EndpointSelectionType'>
<class 'Ice.CommunicatorI'>
for x in range(100):
    ic = Ice.initialize()
    ic.shutdown()
    ic.destroy()
    del ic
gc.collect()
leaves 100 communicators, but only the 3 operation modes and the 2 endpoint selection types.

However, if I add "del ic._impl" then garbage collection can reap the communicator:
import Ice
import gc

for x in range(100):
    ic = Ice.initialize()
    ic.shutdown()
    ic.destroy()
    del ic._impl # THIS LINE ADDED
    del ic
gc.collect()

print "GLOBAL"
print dir()

print "LEFTOVER"
for o in gc.get_objects():
    if str(type(o)).find("Ice") > -1:
        print type(o)

prints:
<class 'Ice.OperationMode'>
<class 'Ice.OperationMode'>
<class 'Ice.OperationMode'>
<class 'Ice.EndpointSelectionType'>
<class 'Ice.EndpointSelectionType'>

Cheers,
~josh

Comments

  • mes
    mes California
    Hi Josh,

    Thanks for reporting this.

    Regards,
    Mark