Upgrade to 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / include / mruby / gc.h
1 /**
2 ** @file mruby/gc.h - garbage collector for mruby
3 **
4 ** See Copyright Notice in mruby.h
5 */
6
7 #ifndef MRUBY_GC_H
8 #define MRUBY_GC_H
9
10 #include "common.h"
11
12 /**
13  * Uncommon memory management stuffs.
14  */
15 MRB_BEGIN_DECL
16
17
18 struct mrb_state;
19
20 #define MRB_EACH_OBJ_OK 0
21 #define MRB_EACH_OBJ_BREAK 1
22 typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data);
23 void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data);
24 MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c);
25
26 #ifndef MRB_GC_ARENA_SIZE
27 #define MRB_GC_ARENA_SIZE 100
28 #endif
29
30 typedef enum {
31   MRB_GC_STATE_ROOT = 0,
32   MRB_GC_STATE_MARK,
33   MRB_GC_STATE_SWEEP
34 } mrb_gc_state;
35
36 /* Disable MSVC warning "C4200: nonstandard extension used: zero-sized array
37  * in struct/union" when in C++ mode */
38 #ifdef _MSC_VER
39 #pragma warning(push)
40 #pragma warning(disable : 4200)
41 #endif
42
43 typedef struct mrb_heap_page {
44   struct RBasic *freelist;
45   struct mrb_heap_page *prev;
46   struct mrb_heap_page *next;
47   struct mrb_heap_page *free_next;
48   struct mrb_heap_page *free_prev;
49   mrb_bool old:1;
50   void *objects[];
51 } mrb_heap_page;
52
53 #ifdef _MSC_VER
54 #pragma warning(pop)
55 #endif
56
57 typedef struct mrb_gc {
58   mrb_heap_page *heaps;                /* heaps for GC */
59   mrb_heap_page *sweeps;
60   mrb_heap_page *free_heaps;
61   size_t live; /* count of live objects */
62 #ifdef MRB_GC_FIXED_ARENA
63   struct RBasic *arena[MRB_GC_ARENA_SIZE]; /* GC protection array */
64 #else
65   struct RBasic **arena;                   /* GC protection array */
66   int arena_capa;
67 #endif
68   int arena_idx;
69
70   mrb_gc_state state; /* state of gc */
71   int current_white_part; /* make white object by white_part */
72   struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */
73   struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */
74   size_t live_after_mark;
75   size_t threshold;
76   int interval_ratio;
77   int step_ratio;
78   mrb_bool iterating     :1;
79   mrb_bool disabled      :1;
80   mrb_bool full          :1;
81   mrb_bool generational  :1;
82   mrb_bool out_of_memory :1;
83   size_t majorgc_old_threshold;
84 } mrb_gc;
85
86 MRB_API mrb_bool
87 mrb_object_dead_p(struct mrb_state *mrb, struct RBasic *object);
88
89 MRB_END_DECL
90
91 #endif  /* MRUBY_GC_H */