[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