[Vm-dev] Image freeze because handleTimerEvent and Seaside process
gone?!
Andreas Raab
andreas.raab at gmx.de
Fri Dec 31 09:08:04 UTC 2010
Revert LinkedList>>remove:ifAbsent: back to the version in Squeak and
your problems will go away.
Cheers,
- Andreas
On 12/30/2010 11:50 PM, Adrian Lienhard wrote:
>
> Thanks Andreas and David for the responses!
>
> In the meantime I've gathered more information. From the mail of Andreas I assumed that the most likely reason for the freeze is that the timer event loop throws an unhandled exception and therefore gets suspended.
>
> So I added a guard to catch any error in handleTimerEvent, restart the loop, and then pass the exception to open a debugger:
>
> runTimerEventLoop
> [RunTimerEventLoop] whileTrue: [
> [ self handleTimerEvent ]
> on: Error
> do: [ :e |
> self startTimerEventLoop.
> ...write a warning to stdout...
> e pass ] ]
>
> And voila, after 10 days or so I got the stack trace below.
>
> I haven't had time to dive into it, but from the stack it seems like a concurrency issue in linked list (although I wonder whether that's possible since the timer event loop runs at the highest priority...).
>
> Maybe something catches somebody's eye.
>
> Cheers,
> Adrian
>
>
> THERE_BE_DRAGONS_HERE
> Error: no such method!
> 30 December 2010 10:32:28 pm
>
> VM: unix - i686 - linux - Squeak3.10.2 of '5 June 2008' [latest update: #7179]
> Image: Pharo1.1 [Latest update: #11410]
>
> Semaphore(Object)>>error:
> Receiver: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Arguments and temporary variables:
> t1: 'no such method!'
> Receiver's instance variables:
> firstLink: a Process in [] in DelayWaitTimeout>>wait
> lastLink: a Process in [] in DelayWaitTimeout>>wait
> excessSignals: 0
>
>
> [] in Semaphore(LinkedList)>>removeLink:
> Receiver: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> firstLink: a Process in [] in DelayWaitTimeout>>wait
> lastLink: a Process in [] in DelayWaitTimeout>>wait
> excessSignals: 0
>
>
> Semaphore(LinkedList)>>removeLink:ifAbsent:
> Receiver: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Arguments and temporary variables:
> aLink: a Process in [] in DelayWaitTimeout>>wait
> aBlock: [self error: 'no such method!']
> tempLink: nil
> Receiver's instance variables:
> firstLink: a Process in [] in DelayWaitTimeout>>wait
> lastLink: a Process in [] in DelayWaitTimeout>>wait
> excessSignals: 0
>
>
> Semaphore(LinkedList)>>removeLink:
> Receiver: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Arguments and temporary variables:
> aLink: a Process in [] in DelayWaitTimeout>>wait
> Receiver's instance variables:
> firstLink: a Process in [] in DelayWaitTimeout>>wait
> lastLink: a Process in [] in DelayWaitTimeout>>wait
> excessSignals: 0
>
>
> Semaphore(LinkedList)>>remove:ifAbsent:
> Receiver: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Arguments and temporary variables:
> aLinkOrObject: a Process in [] in DelayWaitTimeout>>wait
> aBlock: []
> link: a Process in [] in DelayWaitTimeout>>wait
> Receiver's instance variables:
> firstLink: a Process in [] in DelayWaitTimeout>>wait
> lastLink: a Process in [] in DelayWaitTimeout>>wait
> excessSignals: 0
>
>
> Process>>suspend
> Receiver: a Process in [] in DelayWaitTimeout>>wait
> Arguments and temporary variables:
> t1: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> Receiver's instance variables:
> nextLink: nil
> suspendedContext: [] in DelayWaitTimeout>>wait
> priority: 30
> myList: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> errorHandler: nil
> name: 'seaside'
> env: nil
>
>
> DelayWaitTimeout>>signalWaitingProcess
> Receiver: a DelayWaitTimeout(10000 msecs)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> delayDuration: 10000
> resumptionTime: 217048389
> delaySemaphore: a Semaphore(a Process in [] in DelayWaitTimeout>>wait)
> beingWaitedOn: false
> process: a Process in [] in DelayWaitTimeout>>wait
> expired: true
>
>
> Delay class>>handleTimerEvent
> Receiver: Delay
> Arguments and temporary variables:
> t1: 217128602
> t2: nil
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#adjustResumptionTimeOldBase:newBase:->(Delay>>#...etc...
> format: 138
> instanceVariables: #('delayDuration' 'resumptionTime' 'delaySemaphore' 'beingWa...etc...
> organization: ('as yet unclassified' adjustResumptionTimeOldBase:newBase: being...etc...
> subclasses: {MonitorDelay. DelayWaitTimeout}
> name: #Delay
> classPool: a Dictionary(#AccessProtect->a Semaphore() #ActiveDelay->a Delay(10 ...etc...
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'Kernel-Processes'
> traitComposition: {}
> localSelectors: nil
>
>
> [] in Delay class>>runTimerEventLoop
> Receiver: Delay
> Arguments and temporary variables:
>
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#adjustResumptionTimeOldBase:newBase:->(Delay>>#...etc...
> format: 138
> instanceVariables: #('delayDuration' 'resumptionTime' 'delaySemaphore' 'beingWa...etc...
> organization: ('as yet unclassified' adjustResumptionTimeOldBase:newBase: being...etc...
> subclasses: {MonitorDelay. DelayWaitTimeout}
> name: #Delay
> classPool: a Dictionary(#AccessProtect->a Semaphore() #ActiveDelay->a Delay(10 ...etc...
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'Kernel-Processes'
> traitComposition: {}
> localSelectors: nil
>
>
> BlockClosure>>on:do:
> Receiver: [self handleTimerEvent]
> Arguments and temporary variables:
> exception: Error
> handlerAction: [:e |
> self startTimerEventLoop.
> FileStream
> fileNamed: '/dev/...etc...
> handlerActive: false
> Receiver's instance variables:
> outerContext: Delay class>>runTimerEventLoop
> startpc: 108
> numArgs: 0
>
>
> Delay class>>runTimerEventLoop
> Receiver: Delay
> Arguments and temporary variables:
>
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#adjustResumptionTimeOldBase:newBase:->(Delay>>#...etc...
> format: 138
> instanceVariables: #('delayDuration' 'resumptionTime' 'delaySemaphore' 'beingWa...etc...
> organization: ('as yet unclassified' adjustResumptionTimeOldBase:newBase: being...etc...
> subclasses: {MonitorDelay. DelayWaitTimeout}
> name: #Delay
> classPool: a Dictionary(#AccessProtect->a Semaphore() #ActiveDelay->a Delay(10 ...etc...
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'Kernel-Processes'
> traitComposition: {}
> localSelectors: nil
>
>
> [] in Delay class>>startTimerEventLoop
> Receiver: Delay
> Arguments and temporary variables:
>
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#adjustResumptionTimeOldBase:newBase:->(Delay>>#...etc...
> format: 138
> instanceVariables: #('delayDuration' 'resumptionTime' 'delaySemaphore' 'beingWa...etc...
> organization: ('as yet unclassified' adjustResumptionTimeOldBase:newBase: being...etc...
> subclasses: {MonitorDelay. DelayWaitTimeout}
> name: #Delay
> classPool: a Dictionary(#AccessProtect->a Semaphore() #ActiveDelay->a Delay(10 ...etc...
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'Kernel-Processes'
> traitComposition: {}
> localSelectors: nil
>
>
> [] in BlockClosure>>newProcess
> Receiver: [self runTimerEventLoop]
> Arguments and temporary variables:
>
> Receiver's instance variables:
> outerContext: Delay class>>startTimerEventLoop
> startpc: 144
> numArgs: 0
>
>
>
> --- The full stack ---
> Semaphore(Object)>>error:
> [] in Semaphore(LinkedList)>>removeLink:
> Semaphore(LinkedList)>>removeLink:ifAbsent:
> Semaphore(LinkedList)>>removeLink:
> Semaphore(LinkedList)>>remove:ifAbsent:
> Process>>suspend
> DelayWaitTimeout>>signalWaitingProcess
> Delay class>>handleTimerEvent
> [] in Delay class>>runTimerEventLoop
> BlockClosure>>on:do:
> Delay class>>runTimerEventLoop
> [] in Delay class>>startTimerEventLoop
> [] in BlockClosure>>newProcess
> ------------------------------------------------------------
More information about the Vm-dev
mailing list