[Cuis-dev] Cuis web package
Andres Valloud
ten at smallinteger.com
Thu Jun 13 15:36:51 PDT 2024
Thanks! That explains what is going on. And indeed, the whole process
and the semaphore itself all go away, as they should :).
On 6/13/24 3:13 PM, Jaromir Matas wrote:
> Hi Andres,
>
> Thanks! I correct myself, yes the circualr referenced objects in this
> case should be gc'd indeed.
>
> However,
> When you run you example and get to `w first`, the process hasn't run
> yet and is still waiting at the Processor's priority 40 list (see
> Processor waitingProcessesAt: 40) - so this is the reference at this point.
>
> When the example finishes execution the UI lets your new process run and
> create the semaphore - becoming a zombie because the only (strong)
> references are circular now.
>
> So, if I add a `yield` before the gc, the example works as expected:
>
> w := WeakArray new: 1.
> w at: 1 put: [Semaphore new wait] newProcess resume.
> Processor yield.
> Smalltalk garbageCollect.
> w first
>
> Does this explain the behavior you observed? Or am I still missing
> something?
> best,
> Jaromir
>
>
> On 13-Jun-24 9:01:53 PM, "Andres Valloud via Cuis-dev"
> <cuis-dev at lists.cuis.st> wrote:
>
>> Check this out. In a workspace, put in the following code.
>>
>> w := WeakArray new: 1.
>> w at: 1 put: [Semaphore new wait] newProcess resume.
>> Smalltalk garbageCollect.
>> w first
>>
>> If you evaluate it, you see that the weak array still references the
>> zombie process.
>>
>> Now, somewhere else in the workspace, do a print-it of 2 + 3. Then,
>> run the last two lines of the first snippet.
>>
>> Smalltalk garbageCollect.
>> w first
>>
>> And now the process is gone. It appears that workspace do-its are
>> remembering way more than they should.
>>
>> The fascinating thing is that the reference finder doesn't find the
>> presumptive references (and class skipping is not the issue). So,
>> what's going on here?
>>
>> On 6/13/24 11:38 AM, Andres Valloud via Cuis-dev wrote:
>>>>> So, where is the reference to this zombie process object?
>>>>
>>>> The process's myList references the new semaphore and the semaphore
>>>> references the process back. So it won't go away unless the
>>>> semaphore is signaled or the process terminated from another process
>>>> (or from Process Browser, Inspector etc.) What do I miss?
>>>
>>> Why isn't this just a cycle of garbage objects? Who is referencing
>>> the semaphore?
>>>
>>> In others Smalltalk systems, I know for a fact that when I tried this
>>> the zombie process and the semaphore were summarily scavenged away
>>> with extreme prejudice :p.
>>>
>>> Andres.
>> -- Cuis-dev mailing list
>> Cuis-dev at lists.cuis.st
>> https://lists.cuis.st/mailman/listinfo/cuis-dev
More information about the Cuis-dev
mailing list