# Packing GC globals

**URL:** <https://www.ruby-forum.com/t/packing-gc-globals/134570>\
**Category:** Development\
**Created:** [April 12, 2008, 6:09am UTC](https://www.ruby-forum.com/t/packing-gc-globals/134570 "2008-04-12T06:09:39Z")\
**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:09am UTC](https://www.ruby-forum.com/t/packing-gc-globals/134570/1 "2008-04-12T06:09:39Z")

</div>

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

gc.ce$B$N%0%m!\<%P%kJQ?t$r9=B$BN$K$^$H$a$h$&$H;W$$$^$9$,!"L\>A0$H$+9=e(B  
e$BB$$H$+!"8f0U8+Jg=8!#e(B

# Index: gc.c

— gc.c (revision 15984)  
+++ gc.c (working copy)  
@@ -85,17 +85,7 @@ void \*alloca ();  
#endif

-static unsigned long malloc\_increase = 0;  
-static unsigned long malloc\_limit = GC\_MALLOC\_LIMIT;  
static VALUE nomem\_error;

## -static int dont\_gc; -static int during\_gc; -static int need\_call\_final = 0; -static st\_table \*finalizer\_table = 0;

#define MARK\_STACK\_MAX 1024  
-static VALUE mark\_stack[MARK\_STACK\_MAX];  
-static VALUE \*mark\_stack\_ptr;  
-static int mark\_stack\_overflow;

int ruby\_gc\_debug\_indent = 0;  
@@ -140,22 +130,81 @@ typedef struct RVALUE {  
#endif

## -static RVALUE \*freelist = 0; -static RVALUE \*deferred\_final\_list = 0;

#define HEAPS\_INCREMENT 10  
-static struct heaps\_slot {  
+struct heaps\_slot {  
void \*membase;  
RVALUE \*slot;  
int limit;  
-} \*heaps;  
-static int heaps\_length = 0;  
-static int heaps\_used = 0;  
+};

## #define HEAP\_MIN\_SLOTS 10000 -static int heap\_slots = HEAP\_MIN\_SLOTS;

#define FREE\_MIN 4096

-static RVALUE \*himem, \*lomem;  
+struct gc\_list {

- VALUE \*varptr;
- struct gc\_list \*next;  
+};
- 

+typedef struct {

- struct {
- unsigned long limit;
- unsigned long increase;
- } params;
- struct {
- int slots;
- struct heaps\_slot \*ptr;
- int length;
- int used;
- RVALUE \*freelist;
- RVALUE \*range[2];
- } heap;
- struct {
- int dont\_gc;
- int during\_gc;
- } flags;
- struct {
- int need\_call;
- st\_table \*table;
- RVALUE \*deferred;
- } final;
- struct {
- VALUE buffer[MARK\_STACK\_MAX];
- VALUE \*ptr;
- int overflow;
- } markstack;
- struct gc\_list \*global\_list;  
+} rb\_objspace\_t;
- 

+static rb\_objspace\_t rb\_objspace = {{GC\_MALLOC\_LIMIT},  
{HEAP\_MIN\_SLOTS}};  
+/\* #define objspace GET\_VM()-\>objspace \*/  
+#define malloc\_limit objspace-\>params.limit  
+#define malloc\_increase objspace-\>params.increase  
+#define heap\_slots objspace-\>heap.slots  
+#define heaps objspace-\>heap.ptr  
+#define heaps\_length objspace-\>heap.length  
+#define heaps\_used objspace-\>heap.used  
+#define freelist objspace-\>heap.freelist  
+#define lomem objspace-\>heap.range[0]  
+#define himem objspace-\>heap.range[1]  
+#define dont\_gc objspace-\>flags.dont\_gc  
+#define during\_gc objspace-\>flags.during\_gc  
+#define need\_call\_final objspace-\>final.need\_call  
+#define finalizer\_table objspace-\>final.table  
+#define deferred\_final\_list objspace-\>final.deferred  
+#define mark\_stack objspace-\>markstack.buffer  
+#define mark\_stack\_ptr objspace-\>markstack.ptr  
+#define mark\_stack\_overflow objspace-\>markstack.overflow  
+#define global\_List objspace-\>global\_list  
+  
+rb\_objspace\_t \*  
+rb\_objspace\_alloc(void)  
+{

- rb\_objspace\_t \*objspace = ALLOC(rb\_objspace\_t);
- memset(objspace, 0, sizeof(\*objspace));
- malloc\_limit = GC\_MALLOC\_LIMIT;
- heap\_slots = HEAP\_MIN\_SLOTS;
- return objspace;  
+}
- 

+#define objspace (&rb\_objspace)

extern st\_table \*rb\_class\_tbl;  
@@ -372,9 +421,4 @@ rb\_gc\_disable(void)  
VALUE rb\_mGC;

-static struct gc\_list {

- VALUE \*varptr;
- struct gc\_list \*next;  
-} \*global\_List = 0;
- 

void  
rb\_gc\_register\_address(VALUE \*addr)
