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