[Stackless] How do I get a callstack of a Tasklet ?

Hussain Bohra hussainbohra_30 at yahoo.com
Thu Aug 11 11:53:29 CEST 2011


Hi Christian,

Thanks for this solution.
I will incorporate changes suggested by you and will let you know the updates.
 
Thanks and Regards,
Hussain Bohra



________________________________
From: "stackless-request at stackless.com" <stackless-request at stackless.com>
To: stackless at stackless.com
Sent: Wednesday, 10 August 2011 3:30 PM
Subject: Stackless Digest, Vol 91, Issue 5

Send Stackless mailing list submissions to
    stackless at stackless.com

To subscribe or unsubscribe via the World Wide Web, visit
    http://www.stackless.com/mailman/listinfo/stackless
or, via email, send a message with subject or body 'help' to
    stackless-request at stackless.com

You can reach the person managing the list at
    stackless-owner at stackless.com

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Stackless digest..."


Today's Topics:

   1. pickling bug    (was:  Stackless Digest, Vol 90, Issue 3)
      (Christian Tismer)
   2. About submissions to this list (Christian Tismer)
   3. Re: About submissions to this list (Rob Coops)
   4. Re: About submissions to this list (Richard Tew)
   5. Re: About submissions to this list (Christian Tismer)


----------------------------------------------------------------------

Message: 1
Date: Tue, 09 Aug 2011 16:06:05 +0200
From: Christian Tismer <tismer at stackless.com>
To: The Stackless Python Mailing List <stackless at stackless.com>
Cc: Kristj?n Valur J?nsson     <kristjan at ccpgames.com>, Richard Tew
    <richard.m.tew at gmail.com>
Subject: [Stackless] pickling bug    (was:  Stackless Digest, Vol 90,
    Issue 3)
Message-ID: <4E413ECD.5050709 at stackless.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hi,

I sent this almost-patch a while ago, but it was probably invisible,
due to a bad subject line. Here it is again:

file stackless_util.c:

static PyObject *
tasklet_get_frame(PyTaskletObject *task)
{
     PyFrameObject *f = (PyFrameObject *) slp_get_frame(task);
     PyObject *ret;

     while (f != NULL && !PyFrame_Check(f)) {
             f = f->f_back;
     }
     ret = (PyObject *) f;

     if (ret == NULL) ret = Py_None;
     Py_INCREF(ret);
     return ret;
}

This should resolve the problem.

ciao - chris

On 7/8/11 2:26 PM, Christian Tismer wrote:
> On 7/8/11 1:34 PM, Christian Tismer wrote:
>> On 7/8/11 1:53 AM, Richard Tew wrote:
>>> On Thu, Jul 7, 2011 at 10:10 PM, Hussain Bohra
>>> <hussainbohra_30 at yahoo.com>  wrote:
>>>> Hi Christian,
>>>>
>>>> Thanks for your feedback.
>>>>
>>>> Could you kindly let us know when you are done with the changes, so 
>>>> that we
>>>> can complete the existing tasks that are dependent on this fix.
>>> Can't you work around it?  Like check if a frame is a cframe and skip
>>> it, if it is the case?  I haven't looked at the traceback generation
>>> in detail, but I imagine that something along the following lines
>>> would work..
>>>
>>> lastTasklet = stackless.current
>>> thisTasklet = lastTasklet.next
>>> while True:
>>>      thisFrame = thisTasklet.frame
>>>      while thisFrame is not None:
>>>          if not isinstance(thisFrame, stackless.cframe):
>>>              # Do traceback related stuff.
>>>          thisFrame = thisFrame.f_back
>>>      thisTasklet = thisTasklet.next
>>>      if lastTasklet is thisTasklet:
>>>          break
>>
>> Hi Richard, Hussain,
>>
>> yes, I had a look now, and you are right. CFrames get into the way,
>> but are a small problem. Your workaround should be a simple quick
>> solution in the first place, and I encourage Hussain to try that first.
>> It is a really simple patch to traceback.py: insert a check into 
>> extract_stack
>> before "if limit is None:":
>>
>>     while f and not isinstance(f, types.FrameType):
>>         f = f.f_back
>>
>> That should do.
>>
>> ---------------------------------------------
>> Now to the omission in stackless:
>> The special treatment of cframes is quite limited in stackless:
>>
>> - sys._getframe has a patch to skip over anything that is no normal 
>> frame.
>> - frame objects have a getter function frame_getback() instead of the 
>> f_back
>>    field.
>>
>> The only way how the treatment of cframes might be circumvented
>> in extract_stack is when a cframe is given as an argument, and that
>> was the omission in stackless:
>> tasklet.frame exposes whatever it has to the user. Only for the running
>> tasklet, this gets redirected to the threadstate's frame, which in the
>> from python visible context never is a cframe.
>>
>> The function slp_get_frame is the culprit (stackless_util.c):
>>
>> /* CAUTION: This function returns a borrowed reference */
>> PyFrameObject *
>> slp_get_frame(PyTaskletObject *task)
>> {
>>     PyThreadState *ts = PyThreadState_GET();
>>
>>     return ts->st.current == task ? ts->frame : task->f.frame;
>> }
>>
>> This is correct for builtin API functions, but not for the python
>> interface. The getter methon tasklet_get_frame (taskletobject.c)
>> should skip over cframes.
>>
>> static PyObject *
>> tasklet_get_frame(PyTaskletObject *task)
>> {
>>     PyObject *ret = (PyObject*) slp_get_frame(task);
>>
>>     if (ret == NULL) ret = Py_None;
>>     Py_INCREF(ret);
>>     return ret;
>> }
>>
>> I think something like the following should do it:
>>
>> static PyObject *
>> tasklet_get_frame(PyTaskletObject *task)
>> {
>>     PyFrameObject *f = (PyFrameObject *) slp_get_frame(task);
>>     PyObject *ret;
>>
>>     while (f != NULL && !PyFrame_Check(f)) {
>>             f = f_fback;
>>     }
>>     ret = (PyObject *) f;
>>
>>     if (ret == NULL) ret = Py_None;
>>     Py_INCREF(ret);
>>     return ret;
>> }
>>
>>
>> Not yet tested, but I guess that should do it.
>> Do you want to try when removing tasklet_become, or should I?
>>
>> cheers -- chris
>>
>
> Correction:
>             f = f_fback;
> should be
>             f = f->f_back;
>
> And as a remark:
> The long-term solution to such problems is to get rid of these old 
> tricks,
> minimizing the patches to cpython as much as possible.
> We should remove all additions/changes to frames and replace
> cframes by helper structures that are associated with a frame
> invisibly and indirectly through a dictionary.
> Of course a bit tedious, because frames do not support weak references
> (http://docs.python.org/library/weakref.html).
> I'm thinking of a shadow stack of thunks as an execution context
> which references the frames, but is used instead of the frame stack.
>
> Maybe it's time for another stackless sprint, to start a major 
> clean-up? :-)
>
> cheers - chris
>


-- 
Christian Tismer             :^)<mailto:tismer at stackless.com>
tismerysoft GmbH             :     Have a break! Take a ride on Python's
Johannes-Niemeyer-Weg 9A     :    *Starship* http://starship.python.net/
14109 Berlin                 :     PGP key ->  http://wwwkeys.pgp.net/
work +49 30 802 86 56  mobile +49 173 24 18 776  fax +49 30 80 90 57 05
PGP 0x57F3BF04       9064 F4E1 D754 C2FF 1619  305B C09C 5A3B 57F3 BF04
       whom do you want to sponsor today?  http://www.stackless.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.stackless.com/pipermail/stackless/attachments/20110811/73a57ab9/attachment-0001.html>


More information about the Stackless mailing list