digitalmars.D - Weak References
- PJP (3/3) Aug 06 2008 Is there any plan to add support for weak references to the D garbage co...
- Jason House (2/7) Aug 06 2008
- Bill Baxter (15/22) Aug 06 2008 By doesn't always work you mean that it seems to you that sometimes it
- Jason House (2/31) Aug 06 2008
- PJP (1/39) Aug 07 2008
- Steven Schveighoffer (19/34) Aug 07 2008 At least on Tango, this is not the case:
- Bill Baxter (13/38) Aug 07 2008 Hmm, yeh I also went looking for the previous discussion on this topic
- Steven Schveighoffer (9/51) Aug 07 2008 I don't think that's possible. In order for this to cause a problem, th...
- Sean Kelly (12/54) Aug 07 2008 The last time I tested the WeakRef code the unittest was simply broken
- Jarrett Billingsley (3/13) Aug 07 2008 For you. For me, it still fails.
- Steven Schveighoffer (10/63) Aug 07 2008 This is probably just a typo, but the WeakRef class can only point to an...
- Jarrett Billingsley (3/6) Aug 08 2008 http://dsource.org/projects/tango/ticket/1046
- Steven Schveighoffer (4/4) Aug 07 2008 Bill,
- Bill Baxter (4/7) Aug 07 2008 Hmm, yeh. You're right. It doesn't serve any useful purpose there.
- Frank Benoit (3/15) Aug 06 2008 And please, put a WeakHashMap on the TODO list too :)
- Jason House (3/5) Aug 06 2008 I wrote one of those, but it does not work. When investigating, I found ...
Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.
Aug 06 2008
A weak reference library exists but doesn't always work... PJP Wrote:Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.
Aug 06 2008
On Thu, Aug 7, 2008 at 8:12 AM, Jason House <jason.james.house gmail.com> wrote:A weak reference library exists but doesn't always work...By doesn't always work you mean that it seems to you that sometimes it prevents the target object from being collected, right? But I think you said your only test case for this was something that is not reproducible, correct? Very frustrating to not be able to say for sure. It would be a huge help if the GC exposed some API for querying where a particular pointer is being referenced. Without that it's really hard to say where the reference actually is coming from. One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers? --bbPJP Wrote:Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.
Aug 06 2008
Bill Baxter Wrote:On Thu, Aug 7, 2008 at 8:12 AM, Jason House <jason.james.house gmail.com> wrote:It causes crashes under the right circumstances. I posted test cases to reproduce the behavior when I was experimenting with it...A weak reference library exists but doesn't always work...By doesn't always work you mean that it seems to you that sometimes it prevents the target object from being collected, right?But I think you said your only test case for this was something that is not reproducible, correct? Very frustrating to not be able to say for sure. It would be a huge help if the GC exposed some API for querying where a particular pointer is being referenced. Without that it's really hard to say where the reference actually is coming from. One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers? --bbPJP Wrote:Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.
Aug 06 2008
Jason House Wrote:Bill Baxter Wrote:On Thu, Aug 7, 2008 at 8:12 AM, Jason House <jason.james.house gmail.com> wrote:It causes crashes under the right circumstances. I posted test cases to reproduce the behavior when I was experimenting with it...A weak reference library exists but doesn't always work...By doesn't always work you mean that it seems to you that sometimes it prevents the target object from being collected, right?But I think you said your only test case for this was something that is not reproducible, correct? Very frustrating to not be able to say for sure. It would be a huge help if the GC exposed some API for querying where a particular pointer is being referenced. Without that it's really hard to say where the reference actually is coming from. One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers? --bbPJP Wrote:Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.
Aug 07 2008
"Bill Baxter" wroteOn Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote:At least on Tango, this is not the case: import tango.core.Memory; class X { int x; } class Y { int *y; } void main() { auto n = new X; assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN); auto m = new Y; assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN)); } -SteveA weak reference library exists but doesn't always work...By doesn't always work you mean that it seems to you that sometimes it prevents the target object from being collected, right? But I think you said your only test case for this was something that is not reproducible, correct? Very frustrating to not be able to say for sure. It would be a huge help if the GC exposed some API for querying where a particular pointer is being referenced. Without that it's really hard to say where the reference actually is coming from. One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers?
Aug 07 2008
On Thu, Aug 7, 2008 at 11:38 PM, Steven Schveighoffer <schveiguy yahoo.com> wrote:"Bill Baxter" wroteHmm, yeh I also went looking for the previous discussion on this topic and found there that someone had already checked that the GC flag on the WeakRef class was getting set properly. The only other potential problem I can see is the manipulation of the member variable that goes on in the destructor of the WeakRef. It makes the assumption that if the referred object has been collected then the notification function will have been called, and thus the pointer-as-size_t variable will be null. But that code is very similar to what std.signals does in its destructor. So if that's the source of the bug then it's probably a bug that's in std.signal too. --bbOn Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote: One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers?At least on Tango, this is not the case: import tango.core.Memory; class X { int x; } class Y { int *y; } void main() { auto n = new X; assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN); auto m = new Y; assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN)); }
Aug 07 2008
"Bill Baxter" wroteOn Thu, Aug 7, 2008 at 11:38 PM, Steven Schveighoffer <schveiguy yahoo.com> wrote:I don't think that's possible. In order for this to cause a problem, the GC would have to collect the memory from the referred object before calling your hook, or else that it doesn't call your hook at all. Neither of these seem likely. Looking through your code with thread-oriented eyes, and assuming that any thread can cause a collect cycle at any time, it seems that it is impossible for a race to occur. -Steve"Bill Baxter" wroteHmm, yeh I also went looking for the previous discussion on this topic and found there that someone had already checked that the GC flag on the WeakRef class was getting set properly. The only other potential problem I can see is the manipulation of the member variable that goes on in the destructor of the WeakRef. It makes the assumption that if the referred object has been collected then the notification function will have been called, and thus the pointer-as-size_t variable will be null. But that code is very similar to what std.signals does in its destructor. So if that's the source of the bug then it's probably a bug that's in std.signal too.On Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote: One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers?At least on Tango, this is not the case: import tango.core.Memory; class X { int x; } class Y { int *y; } void main() { auto n = new X; assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN); auto m = new Y; assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN)); }
Aug 07 2008
== Quote from Bill Baxter (wbaxter gmail.com)'s articleOn Thu, Aug 7, 2008 at 11:38 PM, Steven Schveighoffer <schveiguy yahoo.com> wrote:The last time I tested the WeakRef code the unittest was simply broken in that it tried something like this: WeakRef!(int) r = new int; GC.collect(); assert( r.get() is null ); Problem being that a register still may have a reference to the int value that the test expected to be collected. The easiest way around this is to perform a second "dummy" allocation in hopes that the relevant registers will be overwritten. Once I made this change in the WeakRef code the unittest passed for Tango. Sean"Bill Baxter" wroteHmm, yeh I also went looking for the previous discussion on this topic and found there that someone had already checked that the GC flag on the WeakRef class was getting set properly. The only other potential problem I can see is the manipulation of the member variable that goes on in the destructor of the WeakRef. It makes the assumption that if the referred object has been collected then the notification function will have been called, and thus the pointer-as-size_t variable will be null. But that code is very similar to what std.signals does in its destructor. So if that's the source of the bug then it's probably a bug that's in std.signal too.On Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote: One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers?At least on Tango, this is not the case: import tango.core.Memory; class X { int x; } class Y { int *y; } void main() { auto n = new X; assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN); auto m = new Y; assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN)); }
Aug 07 2008
"Sean Kelly" <sean invisibleduck.org> wrote in message news:g7fv4t$2bce$1 digitalmars.com...The last time I tested the WeakRef code the unittest was simply broken in that it tried something like this: WeakRef!(int) r = new int; GC.collect(); assert( r.get() is null ); Problem being that a register still may have a reference to the int value that the test expected to be collected. The easiest way around this is to perform a second "dummy" allocation in hopes that the relevant registers will be overwritten. Once I made this change in the WeakRef code the unittest passed for Tango.For you. For me, it still fails.
Aug 07 2008
"Sean Kelly" wrote== Quote from Bill Baxter (wbaxter gmail.com)'s articleThis is probably just a typo, but the WeakRef class can only point to an Object derivative, because it adds an extra monitor code in a hidden field, which wouldn't be on an int.On Thu, Aug 7, 2008 at 11:38 PM, Steven Schveighoffer <schveiguy yahoo.com> wrote:The last time I tested the WeakRef code the unittest was simply broken in that it tried something like this: WeakRef!(int) r = new int;"Bill Baxter" wroteHmm, yeh I also went looking for the previous discussion on this topic and found there that someone had already checked that the GC flag on the WeakRef class was getting set properly. The only other potential problem I can see is the manipulation of the member variable that goes on in the destructor of the WeakRef. It makes the assumption that if the referred object has been collected then the notification function will have been called, and thus the pointer-as-size_t variable will be null. But that code is very similar to what std.signals does in its destructor. So if that's the source of the bug then it's probably a bug that's in std.signal too.On Thu, Aug 7, 2008 at 8:12 AM, Jason House wrote: One possible gotcha that just crossed my mind: I think the current GC allocates chunks in an all or nothing manner -- hasPointers is just a single bit. So could it be that the fact that all Objects have a vtable pointer mean that everything in an Object is always treated as having pointers?At least on Tango, this is not the case: import tango.core.Memory; class X { int x; } class Y { int *y; } void main() { auto n = new X; assert(GC.getAttr(cast(void*)n) & GC.BlkAttr.NO_SCAN); auto m = new Y; assert(!(GC.getAttr(cast(void*)m) & GC.BlkAttr.NO_SCAN)); }GC.collect(); assert( r.get() is null ); Problem being that a register still may have a reference to the int value that the test expected to be collected. The easiest way around this is to perform a second "dummy" allocation in hopes that the relevant registers will be overwritten. Once I made this change in the WeakRef code the unittest passed for Tango.I don't see this as an issue, except that the unittest needs updating. The object still functions as designed. Jarrett has some other issue (which he has yet to share :) ) I'd like to see this get solved, as I can see a benefit to having a WeakRef class in Tango. -Steve
Aug 07 2008
"Steven Schveighoffer" <schveiguy yahoo.com> wrote in message news:g7g9if$10vt$1 digitalmars.com...I don't see this as an issue, except that the unittest needs updating. The object still functions as designed. Jarrett has some other issue (which he has yet to share :) )http://dsource.org/projects/tango/ticket/1046
Aug 08 2008
Bill, As an aside, I notice you have a dup() function in WeakRef. When would you ever want to dup the WeakRef? If anything, dup() should just return 'this'. -Steve
Aug 07 2008
On Fri, Aug 8, 2008 at 11:09 AM, Steven Schveighoffer <schveiguy yahoo.com> wrote:Bill, As an aside, I notice you have a dup() function in WeakRef. When would you ever want to dup the WeakRef? If anything, dup() should just return 'this'.Hmm, yeh. You're right. It doesn't serve any useful purpose there. --bb
Aug 07 2008
PJP schrieb:Is there any plan to add support for weak references to the D garbage collector? Weak references are references which don't prevent the object from being garbage collected. If it has been garbage collected then the weak reference returns null. This is useful for things like resource caches, maintaining references to all instances of a specific class (ex: to implement an operation such as Window.minimizeAllWindows()), or to register a callback/listener with an object such that the registration won't prevent that object from being garbage collected.And please, put a WeakHashMap on the TODO list too :) http://java.sun.com/j2se/1.4.2/docs/api/java/util/WeakHashMap.html
Aug 06 2008
Frank Benoit Wrote:And please, put a WeakHashMap on the TODO list too :) http://java.sun.com/j2se/1.4.2/docs/api/java/util/WeakHashMap.htmlI wrote one of those, but it does not work. When investigating, I found issues with the basic weak reference.
Aug 06 2008