# Ruby\_init\_stack and Init\_stack

**URL:** <https://www.ruby-forum.com/t/ruby-init-stack-and-init-stack/134573>\
**Category:** Development\
**Created:** [April 12, 2008, 6:28am UTC](https://www.ruby-forum.com/t/ruby-init-stack-and-init-stack/134573 "2008-04-12T06:28:21Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [April 12, 2008, 6:28am UTC](https://www.ruby-forum.com/t/ruby-init-stack-and-init-stack/134573/1 "2008-04-12T06:28:21Z")

</div>

e$B$J$+$@$G$9!#e(B

e$B$3$NFs$D$N4X?t$O$[$H$s$IF10l$J$N$G$^$H$a$h$&$H;W$$$^$9$,!"$3$l$Ge(B  
ia64-freebsde$B$G$NF0:n$OLdBj$J$$$G$7$g$&$+!#e(B

# Index: include/ruby/ruby.h

— include/ruby/ruby.h (revision 15984)  
+++ include/ruby/ruby.h (working copy)  
@@ -824,13 +824,11 @@ VALUE rb\_require(const char\*);  
#ifdef \_\_ia64  
void ruby\_init\_stack(VALUE\*, void\*);  
-#define RUBY\_INIT\_STACK \

- VALUE variable\_in\_this\_stack\_frame; \
- ruby\_init\_stack(&variable\_in\_this\_stack\_frame, rb\_ia64\_bsp());  
+#define ruby\_init\_stack(addr) ruby\_init\_stack(addr, rb\_ia64\_bsp())  
#else  
void ruby\_init\_stack(VALUE\*);  
+#endif  
#define RUBY\_INIT\_STACK   
VALUE variable\_in\_this\_stack\_frame;   
ruby\_init\_stack(&variable\_in\_this\_stack\_frame);  
-#endif  
void ruby\_init(void);  
void _ruby\_options(int, char_\*);  
Index: gc.c  
===================================================================  
— gc.c (revision 15984)  
+++ gc.c (working copy)  
@@ -1587,65 +1587,10 @@ void  
Init\_stack(VALUE \*addr)  
{  
-#ifdef \_\_ia64
- if (rb\_gc\_register\_stack\_start == 0) {  
-# if defined( **FreeBSD** )
- 

```
   /*

```

- 

```
    * FreeBSD/ia64 currently does not have a way for a process to 

```

get the

- 

```
    * base address for the RSE backing store, so hardcode it.

```

- 

```
    */

```

- 

```
   rb_gc_register_stack_start = (4ULL<<61);

```

-# elif defined(HAVE\_\_\_LIBC\_IA64\_REGISTER\_BACKING\_STORE\_BASE)  
-# pragma weak \_\_libc\_ia64\_register\_backing\_store\_base

- 

```
   extern unsigned long __libc_ia64_register_backing_store_base;

```

- 

```
   rb_gc_register_stack_start = 

```

(VALUE\*)\_\_libc\_ia64\_register\_backing\_store\_base;  
-# endif

- }
- {
- 

```
   VALUE *bsp = (VALUE*)rb_ia64_bsp();

```

- 

```
   if (rb_gc_register_stack_start == 0 ||

```

- 

```
       bsp < rb_gc_register_stack_start) {

```

- 

```
       rb_gc_register_stack_start = bsp;

```

- 

```
   }

```

- }  
-#endif  
-#if defined(\_WIN32) || defined( **CYGWIN** )
- MEMORY\_BASIC\_INFORMATION m;
- memset(&m, 0, sizeof(m));
- VirtualQuery(&m, &m, sizeof(m));
- rb\_gc\_stack\_start =
- STACK\_UPPER((VALUE \*)&m, (VALUE \*)m.BaseAddress,
- 

```
   (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1);

```

-#elif defined(STACK\_END\_ADDRESS)

- {
- 

```
   extern void *STACK_END_ADDRESS;

```

- 

```
   rb_gc_stack_start = STACK_END_ADDRESS;

```

- }  
-#else
- if (!addr) addr = (VALUE \*)&addr;
- STACK\_UPPER(&addr, addr, ++addr);
- if (rb\_gc\_stack\_start) {
- if (STACK\_UPPER(&addr,
- 

```
 rb_gc_stack_start > addr,

```

- 

```
 rb_gc_stack_start < addr))

```

- 

```
 rb_gc_stack_start = addr;

```

- return;
- }
- rb\_gc\_stack\_start = addr;  
-#endif  
-#ifdef HAVE\_GETRLIMIT
- {
- struct rlimit rlim;
- 
- if (getrlimit(RLIMIT\_STACK, &rlim) == 0) {
- 

```
 unsigned int space = rlim.rlim_cur/5;

```

- 
- 

```
 if (space > 1024*1024) space = 1024*1024;

```

- 

```
 rb_gc_stack_maxsize = rlim.rlim_cur - space;

```

- }
- }  
-#endif

- ruby\_init\_stack(addr);  
}

-void ruby\_init\_stack(VALUE \*addr  
+#undef ruby\_init\_stack  
+void  
+ruby\_init\_stack(VALUE \*addr  
#ifdef \_\_ia64  
, void \*bsp
