Re: [Gc] Trouble with disappearing links

Ivan Maidanski <ivmai-JGs/[email protected]> Fri, 08 Aug 2014 22:47:59 +0400
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <[email protected]>
Hi Christian, 
You should alway do access to such fields (including read) inside a callback routine called from GC_call_with_alloc_lock.
--
Fri, 08 Aug 2014, 09:30 +04:00 from Christian Schafmeister <[email protected]>:
Thank you,  your suggestions gave me what I needed to get it working reliably.
I’m not sure how asynchronously the Boehm collector updates disappearing links.
Do I need to temporarily suspend the Boehm collector by suspending interrupts or signals while I’m updating my weak-key-hash-table?
Best,
.Chris.
On Aug 6, 2014, at 5:08 PM, Bruce Hoult < [email protected] > wrote:
>> I don’t see any mention of this in the documentation unless the statement “where p
>> is a pointer that is not followed by finalization code” is supposed to indicate that
>> you put the pointer in memory that is not scanned for pointers
>
>No, it means what it says.  GC_register_disappearing_link() is used for fields of normal scannable objects. If your finalizer tries to dereference a pointer field that just got zeroed then your program is going to crash. So if the finalizer uses a particular pointer, don't ask for it to disappear.
>
>The ECL code you quoted uses  GC_general_register_ disappearing_link() not  GC_register_disappearing_link(). They do very different things. Possibly they should have names that are more different.
>
>
>
>On Thu, Aug 7, 2014 at 7:20 AM, Christian Schafmeister  < [email protected] > wrote:
>>
>>Following up on my own question I looked into ECL which uses the Boehm garbage collector and supports weak pointers.
>>
>>It uses this code to allocate a weak pointer with GC_MALLOC_ATOMIC which contains objects that are not scanned for pointers.
>>I don’t see any mention of this in the documentation unless the statement “where p is a pointer that is not followed by finalization code” is supposed to indicate that you put the pointer in memory that is not scanned for pointers.: 
>>
>>/* The following routine may be used to break cycles between	*/
/* finalizable objects, thus causing cyclic finalizable		*/
/* objects to be finalized in the correct order.  Standard	*/
/* use involves calling GC_register_disappearing_link(&p),	*/
/* where p is a pointer that is not followed by finalization	*/
/* code, and should not be considered in determining 		*/
/* finalization order.						*/
>>
>>——— ECL code below ———— 
>>
>>static cl_object
>>ecl_alloc_weak_pointer(cl_object o)
>>{
>>const cl_env_ptr the_env = ecl_process_env();
>>struct ecl_weak_pointer *obj;
>>ecl_disable_interrupts_env(the_env);
>>obj = GC_MALLOC_ATOMIC(sizeof(struct ecl_weak_pointer));
>>ecl_enable_interrupts_env(the_env);
>>obj->t = t_weak_pointer;
>>obj->value = o;
>>        if (!ECL_FIXNUMP(o) && !ECL_CHARACTERP(o) && !Null(o)) {
>>                GC_general_register_disappearing_link((void**)&(obj->value), (void*)o);
>>                si_set_finalizer((cl_object)obj, ECL_T);
>>        }
>>return (cl_object)obj;
>>}
>>
>>
>>
>>
>>On Aug 6, 2014, at 2:03 PM, Christian Schafmeister < [email protected] > wrote:
>>>
>>>I’m using disappearing links for the first time (I may not know what I’m doing) and they seem to be keeping the object that they are pointing to alive.
>>>I don’t know why the disappearing link is not disappearing and appears to keep the object it points to alive.
>>>Should I not be allocating the memory that contains the disappearing link within the Boehm managed memory?
>>>
>>>Pseudo code:
>>>1) I’m implementing a weak key hash table
>>>2) I allocate two parallel arrays (key array/value array) using GC_MALLOC.
>>>3) I write a key and value into each corresponding array.
>>>4) I call GC_register_disappearing_link(&key[0]).  This should make the key entry at index 0 a disappearing link.
>>>5) Then I destroy all references to the key other than what are in the array.
>>>6) The key object stays alive until I reset the key[0] entry - then it gets finalized.
>>>
>>>
>>>Here is a transcript of the Common Lisp session:
>>>
>>>> (setq ht (make-weak-key-hash-table))
>>>(setq ht (make-weak-key-hash-table))
>>>
>>>#<CORE:WEAK-KEY-HASH-TABLE @0x11464c1d8) > 
>>>> (low-level-describe ht)
>>>(low-level-describe ht)
>>>WeakKeyHashTable   size: 16
>>>   keys memory range:  0x1142e0c00  - 0x1142e0d00 
>>>   0  key.px@0x1142e0c00  unbound
>>>   1  key.px@0x1142e0c10  unbound
>>>   2  key.px@0x1142e0c20  unbound
>>>   3  key.px@0x1142e0c30  unbound
>>>   4  key.px@0x1142e0c40  unbound
>>>   5  key.px@0x1142e0c50  unbound
>>>   6  key.px@0x1142e0c60  unbound
>>>   7  key.px@0x1142e0c70  unbound
>>>   8  key.px@0x1142e0c80  unbound
>>>   9  key.px@0x1142e0c90  unbound
>>>   10  key.px@0x1142e0ca0  unbound
>>>   11  key.px@0x1142e0cb0  unbound
>>>   12  key.px@0x1142e0cc0  unbound
>>>   13  key.px@0x1142e0cd0  unbound
>>>   14  key.px@0x1142e0ce0  unbound
>>>   15  key.px@0x1142e0cf0  unbound
>>>
>>>> (setq key (cons 1 2))
>>>(setq key (cons 1 2))
>>>
>>>(1 . 2)
>>>> (weak-hash-table-put ht 0 key 9999)
>>>(weak-hash-table-put ht 0 key 9999)
>>>../../src/gctools/gcalloc.h:969  Registered disappearing link 0x1142e0c00  obj 0x1120c5700  return val = 0
>>>
>>>> (low-level-describe ht)
>>>(low-level-describe ht)
>>>WeakKeyHashTable   size: 16
>>>   keys memory range:  0x1142e0c00  - 0x1142e0d00 
>>>   0  key.px@0x1142e0c00  (1 . 2)@0x1120c5700   -->   9999
>>>   1  key.px@0x1142e0c10  unbound
>>>   2  key.px@0x1142e0c20  unbound
>>>   3  key.px@0x1142e0c30  unbound
>>>   4  key.px@0x1142e0c40  unbound
>>>   5  key.px@0x1142e0c50  unbound
>>>   6  key.px@0x1142e0c60  unbound
>>>   7  key.px@0x1142e0c70  unbound
>>>   8  key.px@0x1142e0c80  unbound
>>>   9  key.px@0x1142e0c90  unbound
>>>   10  key.px@0x1142e0ca0  unbound
>>>   11  key.px@0x1142e0cb0  unbound
>>>   12  key.px@0x1142e0cc0  unbound
>>>   13  key.px@0x1142e0cd0  unbound
>>>   14  key.px@0x1142e0ce0  unbound
>>>   15  key.px@0x1142e0cf0  unbound
>>>
>>>> (setq key nil)    ;;;   Here I wipe out the only non-disappearing reference to the key
>>>(setq key nil)    ;;;   Here I wipe out the only non-disappearing reference to the key
>>>
>>>NIL
>>>> (gctools:garbage-collect)  ;; I force garbage collections - the key object is not collected although I think it should be
>>>(gctools:garbage-collect)
>>>
>>>> (gctools:garbage-collect)
>>>(gctools:garbage-collect)
>>>
>>>> (gctools:garbage-collect)
>>>(gctools:garbage-collect)
>>>
>>>> (gctools:garbage-collect)
>>>(gctools:garbage-collect)
>>>
>>>> ;; No finalization messages have been printed
>>>;; No finalization message
>>>
>>>> (low-level-describe ht)  ;; Here we see the key object is still alive
>>>(low-level-describe ht)
>>>WeakKeyHashTable   size: 16
>>>   keys memory range:  0x1142e0c00  - 0x1142e0d00 
>>>   0  key.px@0x1142e0c00  (1 . 2)@0x1120c5700   -->   9999
>>>   1  key.px@0x1142e0c10  unbound
>>>   2  key.px@0x1142e0c20  unbound
>>>   3  key.px@0x1142e0c30  unbound
>>>   4  key.px@0x1142e0c40  unbound
>>>   5  key.px@0x1142e0c50  unbound
>>>   6  key.px@0x1142e0c60  unbound
>>>   7  key.px@0x1142e0c70  unbound
>>>   8  key.px@0x1142e0c80  unbound
>>>   9  key.px@0x1142e0c90  unbound
>>>   10  key.px@0x1142e0ca0  unbound
>>>   11  key.px@0x1142e0cb0  unbound
>>>   12  key.px@0x1142e0cc0  unbound
>>>   13  key.px@0x1142e0cd0  unbound
>>>   14  key.px@0x1142e0ce0  unbound
>>>   15  key.px@0x1142e0cf0  unbound
>>>
>>>> ;; Key is still there
>>>;; Key is still there
>>>
>>>
>>>> (weak-hash-table-put ht 0 nil 9999)
>>>(weak-hash-table-put ht 0 nil 9999)
>>>../../src/gctools/gcalloc.h:969  Registered disappearing link 0x1142e0c00  obj 0x9  return val = 1
>>>
>>>> (gctools:garbage-collect)   ;; Now the object will be collected and a finalization function called
>>>(gctools:garbage-collect)
>>>../../src/gctools/gcalloc.h:894 Boehm finalized weak linked address 0x1120c5700 at 0x1142e0c00
>>>
>>>> (low-level-describe ht)
>>>(low-level-describe ht)
>>>WeakKeyHashTable   size: 16
>>>   keys memory range:  0x1142e0c00  - 0x1142e0d00 
>>>   0  key.px@0x1142e0c00  nil
>>>   1  key.px@0x1142e0c10  unbound
>>>   2  key.px@0x1142e0c20  unbound
>>>   3  key.px@0x1142e0c30  unbound
>>>   4  key.px@0x1142e0c40  unbound
>>>   5  key.px@0x1142e0c50  unbound
>>>   6  key.px@0x1142e0c60  unbound
>>>   7  key.px@0x1142e0c70  unbound
>>>   8  key.px@0x1142e0c80  unbound
>>>   9  key.px@0x1142e0c90  unbound
>>>   10  key.px@0x1142e0ca0  unbound
>>>   11  key.px@0x1142e0cb0  unbound
>>>   12  key.px@0x1142e0cc0  unbound
>>>   13  key.px@0x1142e0cd0  unbound
>>>   14  key.px@0x1142e0ce0  unbound
>>>   15  key.px@0x1142e0cf0  unbound
>>>
>>>> 
>>
>>--
>>This message has been scanned for viruses and
>>dangerous content by MailScanner , and is
>>believed to be clean.
>>_______________________________________________
>>bdwgc mailing list
>>[email protected]
>>https://lists.opendylan.org/mailman/listinfo/bdwgc
>
_______________________________________________
bdwgc mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/bdwgc

_______________________________________________
bdwgc mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/bdwgc