On May 2, 2013, at 4:46 PM, Igor Stasenko wrote:

> On 2 May 2013 16:39, Igor Stasenko <siguc...@gmail.com> wrote:
>> On 2 May 2013 15:33, Henrik Johansen <henrik.s.johan...@veloxit.no> wrote:
>>> 
>>> On May 2, 2013, at 2:50 PM, Igor Stasenko wrote:
>>> 
>>>> On 2 May 2013 09:54, Henrik Johansen <henrik.s.johan...@veloxit.no> wrote:
>>>>> What?
>>>>> I am 99.99% sure it used to interrupt the GUI process if no other viable 
>>>>> candidate could be found, why change that?
>>>>> At least in my mind, if you hit cmd - dot, either you want to interrupt 
>>>>> some process blocking the UI on a higher priority, or you want the UI 
>>>>> process itself.
>>>>> For everything else, there's the Process Browser.
>>>>> 
>>>> 
>>>> It was never like that.
>>>> It was always looking for a process which is scheduled, but not
>>>> interrupt process itself.
>>>> usually that meant it interrupts things like finalization process,
>>>> so i added logic to avoid interrupting it unless there's nothing else
>>>> to interrupt.
>>> 
>>> From 1.4:
>>> handleUserInterrupt
>>> [|toInterrupt|
>>>                        toInterrupt := Processor preemptedProcess.
>>>                        "Only interrupt processes which are potentially 
>>> blocking the UI"
>>>                        toInterrupt priority <  UIManager default uiProcess 
>>> priority ifTrue: [toInterrupt := Project uiProcess].
>>> 
>>> So yes, it was like that.
>>> (barring the other flaws you mentioned, about potentially interrupting 
>>> critical high-priority processes)
>>> 
>> Okay, then we need to change #ifNil clause in following method to just
>> interrupt UI process,
>> instead of showing useless "not interruptable" message:
>> 
>> handleUserInterrupt
>>        "This will be called from the event-fetcher process.
>>        Assume no system-vital processes have a lower priority than this, and
>> are thus ok to interrupt"
>>        UserInterruptHandler cmdDotEnabled ifFalse: [ ^ self ].
>> 
>>        [
>>                self processToInterrupt
>>                        ifNotNil: [ :proc | proc debugWithTitle: 'User 
>> Interrupt' ]
>>                        ifNil: [ UIManager default inform: 'Process not 
>> interruptable' ]
>> 
>>        "fork exceptions, we don't want interrupt handler to die"
>>        ] on: Error fork: [:ex | ex pass].
>> 
> 
> oh.. on second thought, even better..
> 
> processToInterrupt
>       "look for best candidate to interrupt:
>          first who is not weak-finalization process
>          and only then weak-finalization process, if nothing left to 
> interrupt.
>       
>         filter out the idle process, since killing it is fatal
>       "
>       | list |
>       
>       list := OrderedCollection new.
>       Processor scanSchedule: [:p |
>               "gather everything but idle process, and processes whose
> suspendedContext sender == nil,
>               which usually means that process is only scheduled but had no 
> chance to run"
>               
>               ((p ~~ Processor backgroundProcess) and: [ p suspendedContext 
> sender notNil ])
>                       ifTrue: [ list add: p ] ] startingAt: Processor 
> activePriority.
>       
>       "now answer first process in list, skipping the finalization process"
>       list do: [:p | p ==  WeakArray runningFinalizationProcess ifFalse: [ ^ 
> p ] ].
>       
>       "now answer first process , if any ,otherwise answer ui process by 
> default"
>       ^ list isEmpty ifTrue: [ UIManager default uiProcess ] ifFalse: [ list 
> first ]
> 
> 
> so it interrupts
> even if i do
> 
> 1 hour wait
> 
> in workspace
Something like that yes, or maybe even:
processToInterrupt
        "Look for best candidate to interrupt:
           - any scheduled non-finalization process of lower priority
           - the weak-finalization process, if scheduled
           - the UI process
        Never interrupt the idle process, since killing it is fatal"
        
        | fallback |
        
        fallback := UIManager default uiProcess.
        Processor 
                scanSchedule: [:p |
                        "suspendedContext sender == nil usually means that 
process is only scheduled but had no chance to run"
                        ((p ~~ Processor backgroundProcess) and: [ p 
suspendedContext sender notNil ifTrue: [ 
                                p ~~  WeakArray runningFinalizationProcess 
                                        ifTrue: [^p]
                                        ifFalse: [fallback := p]] ] 
                startingAt: Processor activePriority.
        ^fallback

Cheers,
Henry

Reply via email to