[squeak-dev] A bug in active process termination (crashing image)

Jaromir Matas m at jaromir.net
Thu Apr 1 08:50:01 UTC 2021


Active process termination part of #terminate contains a line that's been a
mystery to me:

	| ctxt unwindBlock oldList outerMost |
	self isActiveProcess ifTrue:
		[ctxt := thisContext.
		 [ctxt := ctxt findNextUnwindContextUpTo: nil.
		  ctxt ~~ nil] whileTrue:
			[(ctxt tempAt: 2) ifNil:
--->				["N.B. Unlike Context>>unwindTo: we do not set complete (tempAt: 2)
to true."
				 unwindBlock := ctxt tempAt: 1.
				 thisContext terminateTo: ctxt.
				 unwindBlock value]].
		thisContext terminateTo: nil.

It appears however that the absence of the assignment (ctxt tempAt: 2 put:
true.) will cause the image crash e.g. in this scenario (probably
irrecoverably; I had to kill it):

| p |
p := [
	[ Processor activeProcess terminate ] 
		ensure: [ Processor activeProcess terminate ]. 
] fork.
Processor yield.
Transcript show: p isTerminated printString

I already mentioned this anomaly in [1] where it was causing an inability to
close a debugger.

The same algorithm is used in Context >> #resume:[through:] and #unwindTo:,
but always with the assignment.

I was wondering whether the reason for the intentional omission of the
assignment was just saving a line considered useless or whether there was a
deeper idea... Anybody remembers?

Thanks for any advice.

[1]
http://forum.world.st/Bug-in-Process-terminate-Returning-from-unwind-contexts-tp5127570p5128018.html



-----
^[^ Jaromir
--
Sent from: http://forum.world.st/Squeak-Dev-f45488.html


More information about the Squeak-dev mailing list