[squeak-dev] Re: The broken user interrupt, or the saga of 100000
factorial.
Levente Uzonyi
leves at elte.hu
Fri Dec 23 15:57:02 UTC 2011
On Fri, 23 Dec 2011, David T. Lewis wrote:
> On Fri, Dec 23, 2011 at 10:13:18AM -0500, David T. Lewis wrote:
>> On Fri, Dec 23, 2011 at 07:39:41AM -0500, Bob Arning wrote:
>>> I've seen suspicious behavior (tough time interrupting and lots of
>>> finalization in MessageTally reports) in my 4.2 image, so I thought I'd
>>> look at applying this fix. One thing I'm a little puzzled about:
>>> HasNewFinalization is false in my image (I'm using a Cog that's a few
>>> months old). Under what conditions is it true?
>>
>> I think you have spotted a timing problem here. I put the initTestPair
>> and checkTestPair calls together in a startUp: method, which is
>> wrong because it does not give the VM an opportunity to do its
>> updates, so the results of the test are not valid.
>>
>> This is not exactly elegant, but if you force a garbage collection
>> between initTestPair and checkTestPair, the test will work properly.
>>
>> WeakArray class>>startUp: resuming
>> resuming ifFalse: [ ^self ].
>> "Check if new finalization is supported by the VM"
>> WeakFinalizationList initTestPair.
>> Smalltalk garbageCollect.
>> WeakFinalizationList checkTestPair.
>> self restartFinalizationProcess.
>>
>> A better fix is needed - sorry about that. I'm not sure if I'll
>> have a chance to look at this today, but the important thing is
>> to arrange for the check to be done when the image is started,
>> but not to continue repeating the test after it has been
>> successfully performed.
>
> The following seems to take care of the issue without requiring
> anything to be done in the startUp: method.
>
> WeakArray class>>finalizationProcess
> | initialized |
> initialized := false.
> [FinalizationSemaphore wait.
> initialized ifFalse: ["check VM capability once at image startup time"
> WeakFinalizationList initTestPair.
> Smalltalk garbageCollect.
> WeakFinalizationList checkTestPair.
> initialized := true].
> FinalizationLock critical:
> [FinalizationDependents do:
> [ :weakDependent |
> weakDependent ifNotNil:
> [weakDependent finalizeValues]]]
> ifError:
> [:msg :rcvr | rcvr error: msg]] repeat
>
> I'll update this in the inbox. Bob, thanks for catching the error.
There's still a very small window during startUp while the value of
HasNewFinalization can be incorrect and it seems to be really hard to fix
it from the image side. I don't know if this can cause any problems, but a
new primitive for checking the availability would have been a better
choice IMHO.
Levente
>
> Dave
>
>
>
More information about the Squeak-dev
mailing list
|