Hi Eliot,

thank you very much. I imported your changes in a pharo 3 image and it works 
awesome. So I'm preparing a slice for pharo. 

Thanks again, a very annoying problem seems to be solved,

Norbert

Am 23.06.2014 um 19:29 schrieb Eliot Miranda <eliot.mira...@gmail.com>:

> and here are the changes I've just committed to Squeak trunk.
> 
> 
> On Mon, Jun 23, 2014 at 10:05 AM, Eliot Miranda <eliot.mira...@gmail.com> 
> wrote:
> Hi Norbert,
> 
>     [ let me try again.  never try and get code out too early in the morning 
> ;-) ]
> 
>     it is the debugger that needs fixing, not your code !! :-).  The debugger 
> needs to respect process identity.  Andreas and I (mostly Andreas) came up 
> with the following changes at Qwaq.  Your message is a good reminder that I 
> need to add this to Squeak asap.
> 
> The idea is for Process to have an additional inst var 'effectiveProcess' 
> that holds the actual process running code.  For the most part this is self, 
> but in the debugger we substitute the process being debugged:
> 
> Process methods for accessing
> effectiveProcess
>       "effectiveProcess is a mechanism to allow process-faithful debugging.  
> The debugger executes code
>        on behalf of processes, so unless some effort is made the identity of 
> Processor activeProcess is not
>        correctly maintained when debugging code.  The debugger uses 
> evaluate:onBehalfOf: to assign the
>        debugged process as the effectiveProcess of the process executing the 
> code, preserving process
>        identity."
>       ^effectiveProcess ifNil: [self]
> 
> then the relevant methods in Process and processorScheduler defer to 
> effectiveProcess, e.g.
> 
> ProcessorScheduler methods for process state change
> terminateActive
>       "Terminate the process that is currently running."
> 
>       activeProcess effectiveProcess terminate
> 
> and the debugging methods use evaluate:onBehalfOf: to install the process 
> being debugged:
> 
> Process methods for private
> evaluate: aBlock onBehalfOf: aProcess
>       "Evaluate aBlock setting effectiveProcess to aProcess.  Used
>        in the execution simulation machinery to ensure that
>        Processor activeProcess evaluates correctly when debugging."
>       | oldEffectiveProcess |
>       oldEffectiveProcess := effectiveProcess.
>       effectiveProcess := aProcess.
>       ^aBlock ensure: [effectiveProcess := oldEffectiveProcess]
> 
> Process methods for changing suspended state
> step
> 
>       ^Processor activeProcess
>               evaluate: [suspendedContext := suspendedContext step]
>               onBehalfOf: self
> 
> stepToCallee
>       "Step until top context changes"
> 
>       Processor activeProcess
>               evaluate:
>                       [| ctxt |
>                       ctxt := suspendedContext.
>                       [ctxt == suspendedContext] whileTrue: [
>                               suspendedContext := suspendedContext step]]
>               onBehalfOf: self.
>       ^suspendedContext
> 
> etc.  Changes from a Qwaq image attached.
> 
> HTH
> 
> 
> On Mon, Jun 23, 2014 at 4:50 AM, Norbert Hartl <norb...@hartl.name> wrote:
> In my code I'm using a DynamicVariable to request a context object when 
> needed. Until now I knew the name DynamicVariable only from seaside. There it 
> is called WADynamicVariable and it is an exception. So I blindly assumed the 
> pharo DynamicVariable works the same.
> I thought this might be a good optimization not to travel the stack all the 
> time but put in the process.
> Now that I am using it I can see the difference. I find it real hard using it 
> because I don't know how to debug/step in code. DynamicVariable is a process 
> specific variable but as soon as a debugger opens it is very likely to be in 
> another process. This makes stepping in method using the DynamicVariable 
> impossible. The only way round is to set break points after the dynamic 
> lookup and step from there. But this feels just wrong.
> What would be the best way to have DynamicVariable and be able to debug 
> anything? Or is there a variant that uses the stack instead of the "active" 
> process?
> 
> thanks,
> 
> Norbert
> 
> 
> 
> 
> 
> -- 
> best,
> Eliot
> 
> 
> 
> -- 
> best,
> Eliot
> <trunk4.6EffectiveProcessMethods.st>

Reply via email to