<div dir="ltr">Hi,<div><br></div><div style>I'm a Google Summer of Code intern working on "Deferred Cancellation" project. I'm recently working on adding cancellation support to twisted.internet.task.LoopingCall.</div>
<div style><br></div><div style>However, after I added the canceller to LoopingCall.deferred, the twisted.test.test_application.TestInternet2.testPickledTimer failed due to a PicklingError.</div><div style><br></div><div style>
My branch is loopingcall-deferred-cancellation-6656. Here is the diff of my code: <a href="http://twistedmatrix.com/~diffresource.twistd/6656">http://twistedmatrix.com/~diffresource.twistd/6656</a></div><div style><br></div>
<div style>Here is the error message:</div><div style><br></div><div style><div>===============================================================================</div><div>[ERROR]</div><div>Traceback (most recent call last):</div>
<div>  File "/home/kai/Projects/GSoC/DeferredCancellation/Twisted/branches/loopingcall-deferred-cancellation-6656/twisted/test/test_application.py", line 487, in testPickledTimer</div><div>    s = pickle.dumps(t0)</div>
<div>  File "/usr/lib/python2.7/pickle.py", line 1374, in dumps</div><div>    Pickler(file, protocol).dump(obj)</div><div>  File "/usr/lib/python2.7/pickle.py", line 224, in dump</div><div>    self.save(obj)</div>
<div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div><div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 725, in save_inst</div>
<div>    save(stuff)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div><div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict</div>
<div>    self._batch_setitems(obj.iteritems())</div><div>  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems</div><div>    save(v)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div>
<div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 725, in save_inst</div><div>    save(stuff)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div>
<div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict</div><div>    self._batch_setitems(obj.iteritems())</div><div>  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems</div>
<div>    save(v)</div><div>  File "/usr/lib/python2.7/pickle.py", line 331, in save</div><div>    self.save_reduce(obj=obj, *rv)</div><div>  File "/usr/lib/python2.7/pickle.py", line 401, in save_reduce</div>
<div>    save(args)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div><div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 562, in save_tuple</div>
<div>    save(element)</div><div>  File "/usr/lib/python2.7/pickle.py", line 331, in save</div><div>    self.save_reduce(obj=obj, *rv)</div><div>  File "/usr/lib/python2.7/pickle.py", line 419, in save_reduce</div>
<div>    save(state)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div><div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict</div>
<div>    self._batch_setitems(obj.iteritems())</div><div>  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems</div><div>    save(v)</div><div>  File "/usr/lib/python2.7/pickle.py", line 331, in save</div>
<div>    self.save_reduce(obj=obj, *rv)</div><div>  File "/usr/lib/python2.7/pickle.py", line 419, in save_reduce</div><div>    save(state)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div>
<div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict</div><div>    self._batch_setitems(obj.iteritems())</div><div>  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems</div>
<div>    save(v)</div><div>  File "/usr/lib/python2.7/pickle.py", line 331, in save</div><div>    self.save_reduce(obj=obj, *rv)</div><div>  File "/usr/lib/python2.7/pickle.py", line 419, in save_reduce</div>
<div>    save(state)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div><div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 649, in save_dict</div>
<div>    self._batch_setitems(obj.iteritems())</div><div>  File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems</div><div>    save(v)</div><div>  File "/usr/lib/python2.7/pickle.py", line 286, in save</div>
<div>    f(self, obj) # Call unbound method with explicit self</div><div>  File "/usr/lib/python2.7/pickle.py", line 748, in save_global</div><div>    (obj, module, name))</div><div>pickle.PicklingError: Can't pickle <function <lambda> at 0x8f1fb8c>: it's not found as twisted.internet.posixbase.<lambda></div>
<div><br></div><div>twisted.test.test_application.TestInternet2.testPickledTimer</div><div>===============================================================================</div><div><br></div><div style>I thought the reason was the circular references. However I searched about it and found that pickle could handle the circular reference cases. But the only significant change is that after I added the canceller, there is a circular reference between LoopingCall and LoopingCall.deferred. So I don't know what's the problem. How can I fix this?</div>
<div style><br></div><div style>Thanks,</div><div style>-Kai</div></div></div>