[Vm-dev] [VM-dev] Terminated process with zero pc

Eliot Miranda eliot.miranda at gmail.com
Wed May 13 00:41:57 UTC 2020


Hi Denis,

On Mon, May 11, 2020 at 2:34 PM Denis Kudriashov <dionisiydk at gmail.com>
wrote:

>
> Hi Eliot.
>
> I hope you did not spend your time on it. But if you did sorry for that.
> I found that my issue is related to the Pharo bootstrap process. On CI we
> run some kernel tests on fresh bootstrapped image to validate its
> correctness. The code for this image is loaded from prebuilt  binary files
> (containing precompiled methods). Nothing is recompiled there. So any
> changes to related part of system requires special update of those files.
>
> I am not sure what exactly happens in this tiny image. But I am quite
> confident that it is not a VM issue.
>

:-)  That's a relief!!  Good to hear.


> Anyway thanks for your help
>

You are most welcome.  Glad to help.

вт, 5 мая 2020 г. в 21:12, Denis Kudriashov <dionisiydk at gmail.com>:
>
>>
>> вт, 5 мая 2020 г. в 20:52, Eliot Miranda <eliot.miranda at gmail.com>:
>>
>>>
>>> Hi Denis,
>>>
>>> On May 5, 2020, at 12:39 PM, Denis Kudriashov <dionisiydk at gmail.com>
>>> wrote:
>>>
>>> 
>>> Hi.
>>>
>>> I encounter interesting behavior of process termination. I can't
>>> reproduce it locally but I have constantly failing test on Pharo CI (as
>>> part of full test suite) due to following conditions:
>>>
>>> ended := false.
>>> process := [ Processor activeProcess suspend. ended := true]
>>>                        forkAt: Processor activePriority + 1.
>>> self assert: process isSuspended description: 'should be suspended'.
>>>
>>> process resume.
>>>
>>> self assert: ended description: 'last statement is done'.
>>> self assert: process suspendedContext pc equals: 0
>>>
>>> When I try to run it locally the pc is always greater than #startpc.
>>> On CI the test very rarely behaves same way. The process is always
>>> finished (#ended is true) but in most of runs the pc of #terminate context
>>> is somehow reset to zero (probably related to the order of overall test
>>> suite). .
>>>
>>> In Pharo succeed process ends here:
>>>
>>> terminate
>>>             ...........
>>>
>>>  self isActiveProcess ifTrue: [
>>>
>>> thisContext terminateTo: nil.
>>>
>>> self suspend ]
>>>
>>>
>>> It seems that Context>>#terminateTo: can reset the pc to zero under some
>>> condition (jitter related?).
>>>
>>>
>>> The JIT maps machine code PCs to bytecode PCs whenever the pc is
>>> accessed of a context which is running JITted code.  If the mapping fails
>>> then 0 may be returned.  But this is evidence of a bug in the mapping
>>> computation.
>>>
>>
>> And in that case Process>>terminate would be a jitted method context. In
>> Pharo it is quite monstrous:
>>
>> https://github.com/pharo-project/pharo/blob/7fc0df20a60bfbdf06e7fa6f21cfdc9bba81c3cc/src/Kernel/Process.class.st#L679
>> I will try to rerun my test with smaller refactored version.
>>
>

-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20200512/93352f65/attachment-0001.html>


More information about the Vm-dev mailing list