[Stackless] How do I get a callstack of a Tasklet ?
Hussain Bohra
hussainbohra_30 at yahoo.com
Tue Oct 11 16:12:27 CEST 2011
Hi Christian,
Currently I am working with stackless python 3.2, which I have downloaded almost 3-4 months back.
At http://www.stackless.com/download, I can see stackless version 3.2 as the latest one which got released in March 2011 by Richard Tew.
I also browsed stackless code in SVN, but I couldn't locate your suggested changes in the file 'stackless_util.c' in any of the following versions:
- http://svn.python.org/projects/stackless/branches/release32-maint/Stackless/core/stackless_util.c
- http://svn.python.org/projects/stackless/tags/python-3.2/Stackless/core/stackless_util.c
Can you please let me know how I can grab the latest stackless version.
Thanks and Regards,
Hussain Bohra
________________________________
From: Christian Tismer <tismer at stackless.com>
To: Hussain Bohra <hussainbohra_30 at yahoo.com>; The Stackless Python Mailing List <stackless at stackless.com>
Sent: Monday, 10 October 2011 8:23 PM
Subject: Re: [Stackless] How do I get a callstack of a Tasklet ?
Hi Hussain,
have you upgraded to the latest Stackless version?
I think the necessary changes have been incorporated, lately.
This function should not be visible from Python. It is just
a change that makes sys._getframe behave correctly.
cheers - chris
On 10/10/11 3:55 PM, Hussain Bohra wrote:
Hi Christian,
>
>
>I have incorporated the following changes in the filestackless_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;
>>}
>
>
>I am able to build the stackless-python without any errors.
>But after which I am not able to use this method from the python prompt, I am not sure whether I need to write any specific code to expose this new method?
>
>
>Can you please let me know your feedback.
>
>
>Thanks in advance.
>Hussain Bohra
>
>
>
>________________________________
>From: Hussain Bohra <hussainbohra_30 at yahoo.com>
>To: "stackless at stackless.com" <stackless at stackless.com>
>Sent: Thursday, 11 August 2011 3:23 PM
>Subject: Re: How do I get a callstack of a Tasklet ?
>
>
>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/
>
>
>
>
>
>
>_______________________________________________
Stackless mailing list Stackless at stackless.com http://www.stackless.com/mailman/listinfo/stackless
--
Christian Tismer :^) <mailto:tismer at stackless.com> tismerysoft GmbH : Have a break! Take a ride on Python's
Karl-Liebknecht-Str. 121 : *Starship* http://starship.python.net/ 14482 Potsdam : PGP key -> http://pgp.uni-mainz.de work +49 173 24 18 776 mobile +49 173 24 18 776 fax n.a.
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/20111011/0a5e3835/attachment-0001.html>
More information about the Stackless
mailing list