From: Rick DeNatale Date: 2008-01-09T05:34:27+09:00 Subject: Re: Manual Memory Management On Jan 8, 2008 12:35 AM, Marcin Raczkowski wrote: > Evan Weaver wrote: > > Python supports 'del reference', which decrements the reference > > counter by one and removes the variable name from scope. I would > > really like to see that in Ruby. > > > > Evan > > > I had idea of reference counting GC for a moment, I'm not sure how hard > it would be to implement and if it's actually usable. > > Mental: isn't reference on c-stack still REFERENCE ? what's the problem > with traversing ruby and c stack, finding every reference to object - > changing it to Qnil. then collecting object ? Let me start to answer with a story. Way back in the last century when I was at University we had a strange phenomenon occuring on our mainframe computer. Programs would give strange results which couldn't be explained, and every few days the whole system would crash. It turns out that one of the system programmers had introduced a new feature which would automatically log off users from the timesharing system on that machine. It would scan the memory area where the timesharing system kept an array of pointers to the data structures which represented logged in users, and when it found a user who was inactive for some set time logged him off by freeing the datastructure and depositing a zero in the pointer, effectively nilling the reference. The bug was that this programmer wasn't properly checking for the end of that array, so every so often it would free some random memory, and dump a word of zeros somewhere 'random'. If it affected the user area then we saw the strange unexplained bugs, but if it clobbered a crucial part of system memory then the system might crash, perhaps sometime quite a bit later. Now this situation is quite similar to how the Ruby GC treats the C-stack which is just effectively an array of words which might be pointers, integers, structs etc. The GC has no way of knowing how the C code actually interprets any particular word, so it has to treat any word which looks like a reference to an object, as a reference to an object. This is what makes it a conservative GC. So, it's quite possible that a word on the stack might LOOK like a reference to an object you want to 'manually' GC. In this case arbitrarily storing QNil in that word, might not be a good idea. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/