[#31647] [Backport #3666] Backport of r26311 (Bug #2587) — Luis Lavena <redmine@...>

Backport #3666: Backport of r26311 (Bug #2587)

13 messages 2010/08/07

[#31666] [Bug #3677] unable to run certain gem binaries' in windows 7 — Roger Pack <redmine@...>

Bug #3677: unable to run certain gem binaries' in windows 7

10 messages 2010/08/10

[#31676] [Backport #3680] Splatting calls to_ary instead of to_a in some cases — Tomas Matousek <redmine@...>

Backport #3680: Splatting calls to_ary instead of to_a in some cases

10 messages 2010/08/11

[#31681] [Bug #3683] getgrnam on computer with NIS group (+)? — Rocky Bernstein <redmine@...>

Bug #3683: getgrnam on computer with NIS group (+)?

13 messages 2010/08/11

[#31843] Garbage Collection Question — Asher <asher@...>

This question is no doubt a function of my own lack of understanding, but I think that asking it will at least help some other folks see what's going on with the internals during garbage collection.

17 messages 2010/08/25
[#31861] Re: Garbage Collection Question — Roger Pack <rogerdpack2@...> 2010/08/26

> The question in short: when an object goes out of scope and has no

[#31862] Re: Garbage Collection Question — Asher <asher@...> 2010/08/26

Right - so how does a pointer ever get off the stack?

[#31873] Re: Garbage Collection Question — Kurt Stephens <ks@...> 2010/08/27

On 8/26/10 11:51 AM, Asher wrote:

[#31894] Re: Garbage Collection Question — Asher <asher@...> 2010/08/27

I very much appreciate the response, and this is helpful in describing the narrative, but it's still a few steps behind my question - but it may very well have clarified some points that help us get there.

[#31896] Re: Garbage Collection Question — Evan Phoenix <evan@...> 2010/08/27

You have introduced something called a "root node" without defining it. What do you mean by this?

[#31885] Avoiding $LOAD_PATH pollution — Eric Hodel <drbrain@...7.net>

Last year Nobu asked me to propose an API for adding an object to

21 messages 2010/08/27

[#31947] not use system for default encoding — Roger Pack <rogerdpack2@...>

It strikes me as a bit "scary" to use system locale settings to

19 messages 2010/08/30

[#31971] Change Ruby's License to BSDL + Ruby's dual license — "NARUSE, Yui" <naruse@...>

Ruby's License will change to BSDL + Ruby's dual license

16 messages 2010/08/31

[ruby-core:31898] Re: Garbage Collection Question, Followup

From: Asher <asher@...>
Date: 2010-08-27 16:14:47 UTC
List: ruby-core #31898
On Aug 27, 2010, at 11:22 AM, Asher wrote:

> I intend to look into the patch suggested by brabuhr@gmail.com (https://sites.google.com/site/brentsrubypatches/), which (so far as this issue is concerned) appears to amount to:
> 
>> VALUE *rb_gc_stack_end = (VALUE *)STACK_GROW_DIRECTION;
>> #define rb_gc_wipe_stack() {   		\
>>   VALUE *sp = alloca(0);         		\
>>   VALUE *end = rb_gc_stack_end;  \
>>   rb_gc_stack_end = sp;          		\
>>   __stack_zero(end, sp);   			\
> 
> And some other basic support. I will follow up on that once I have some time to experiment (particularly sense the patch is intended for 1.8.7 not 1.9.2). Any particular thoughts on this approach? Presumably there is some reason it has not been patched to do so? 

So as I understand it the problem is:

The basic Ruby stack looks like: 

Ruby stack, root node FP*
	ruby root node locals => st_ivar_tbl
	ruby root node stack SP* (ruby stack frame 1 after the activation record)
	
So when a function call is made the stack grows to look like:

	ruby root node locals => st_ivar_tbl
	ruby root node stack SP* (ruby stack frame 1 after the activation record)
		ruby root first child node locals => st_ivar_tbl
		ruby root first child node CP*

So when the first child node finishes the CP* moves back to the SP and st_ivar_tbl is no longer part of the stack, which is why nested local variables get GC'd as expected.

But when the local variable in the root node is set to nil, the local var data for object ID in st_ivar_tbl is set to 4 instead of object ID. This leaves a valid pointer object ID with no references. 

But "where" is this object ID pointer if its reference in the st_ivar_tbl is now replaced with Qnil? I presume the explanation for this is that the object actually leaves on the heap in ObjectSpace rather than in local variable space, which means that the object is allocated and a reference is given to st_ivar_table, so when st_ivar_table's reference is gone there is still a valid reference in ObjectSpace (the heap). 

So it seems that the root node's object is remaining around even though there are no references because its frame has not been cleared. Is this understanding correct? 

So if the reference to the object is always in the heap, how does the heap's pointer become invalidated when st_ivar_tbl is cleared, as in the examples where it works "as expected"? 

Perhaps there is something fundamental about local variable I am missing in my description here? I am trying to work through these things, so help is appreciated. 

Thanks for patience,
Asher

In This Thread