debase-ruby_core_source 0.10.10 → 0.10.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -3
  3. data/debase-ruby_core_source.gemspec +4 -4
  4. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/addr2line.h +20 -0
  5. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/builtin.h +83 -0
  6. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/build_assert/build_assert.h +40 -0
  7. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/check_type/check_type.h +63 -0
  8. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/container_of/container_of.h +142 -0
  9. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/list/list.h +788 -0
  10. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ccan/str/str.h +16 -0
  11. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/constant.h +55 -0
  12. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/debug_counter.h +423 -0
  13. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/dln.h +36 -0
  14. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/encindex.h +70 -0
  15. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/eval_intern.h +312 -0
  16. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/gc.h +140 -0
  17. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/hrtime.h +168 -0
  18. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/id.h +290 -0
  19. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/id_table.h +36 -0
  20. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/insns.inc +249 -0
  21. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/insns_info.inc +8979 -0
  22. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal.h +107 -0
  23. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/array.h +114 -0
  24. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/bignum.h +246 -0
  25. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/bits.h +566 -0
  26. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/class.h +168 -0
  27. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compar.h +50 -0
  28. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compile.h +32 -0
  29. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/compilers.h +108 -0
  30. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/complex.h +29 -0
  31. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/cont.h +25 -0
  32. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/dir.h +17 -0
  33. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enc.h +20 -0
  34. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/encoding.h +28 -0
  35. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enum.h +19 -0
  36. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/enumerator.h +22 -0
  37. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/error.h +131 -0
  38. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/eval.h +33 -0
  39. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/file.h +39 -0
  40. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/fixnum.h +185 -0
  41. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/gc.h +154 -0
  42. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/hash.h +240 -0
  43. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/imemo.h +243 -0
  44. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/inits.h +51 -0
  45. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/io.h +35 -0
  46. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/load.h +19 -0
  47. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/loadpath.h +17 -0
  48. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/math.h +24 -0
  49. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/missing.h +19 -0
  50. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/mjit.h +29 -0
  51. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/numeric.h +252 -0
  52. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/object.h +83 -0
  53. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/parse.h +23 -0
  54. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/proc.h +32 -0
  55. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/process.h +136 -0
  56. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/random.h +17 -0
  57. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/range.h +37 -0
  58. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/rational.h +69 -0
  59. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/re.h +29 -0
  60. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/sanitizers.h +191 -0
  61. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/scheduler.h +35 -0
  62. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/serial.h +24 -0
  63. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/signal.h +22 -0
  64. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/static_assert.h +17 -0
  65. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/string.h +135 -0
  66. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/struct.h +154 -0
  67. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/symbol.h +41 -0
  68. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/thread.h +60 -0
  69. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/time.h +35 -0
  70. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/transcode.h +21 -0
  71. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/util.h +31 -0
  72. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/variable.h +83 -0
  73. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/vm.h +135 -0
  74. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/internal/warnings.h +17 -0
  75. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/iseq.h +304 -0
  76. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/known_errors.inc +791 -0
  77. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/method.h +245 -0
  78. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/mjit.h +197 -0
  79. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/mjit_compile.inc +8082 -0
  80. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/node.h +484 -0
  81. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/node_name.inc +210 -0
  82. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/opt_sc.inc +109 -0
  83. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/optinsn.inc +128 -0
  84. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/optunifs.inc +43 -0
  85. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/parse.h +211 -0
  86. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/probes_helper.h +44 -0
  87. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ractor.h +271 -0
  88. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ractor_pub.h +50 -0
  89. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regenc.h +254 -0
  90. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regint.h +938 -0
  91. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/regparse.h +370 -0
  92. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/revision.h +2 -0
  93. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ruby_assert.h +15 -0
  94. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/ruby_atomic.h +236 -0
  95. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/siphash.h +48 -0
  96. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/symbol.h +119 -0
  97. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/thread_pthread.h +106 -0
  98. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/thread_win32.h +66 -0
  99. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/timev.h +57 -0
  100. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/transcode_data.h +138 -0
  101. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/transient_heap.h +61 -0
  102. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/variable.h +21 -0
  103. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/version.h +89 -0
  104. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm.inc +5360 -0
  105. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_call_iseq_optimized.inc +244 -0
  106. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_callinfo.h +457 -0
  107. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_core.h +1952 -0
  108. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_debug.h +116 -0
  109. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_exec.h +196 -0
  110. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_insnhelper.h +260 -0
  111. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_opts.h +73 -0
  112. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vm_sync.h +97 -0
  113. data/lib/debase/ruby_core_source/ruby-3.0.0-preview1/vmtc.inc +243 -0
  114. data/lib/debase/ruby_core_source/version.rb +1 -1
  115. metadata +123 -13
@@ -0,0 +1,211 @@
1
+ /* A Bison parser, made by GNU Bison 3.0.4. */
2
+
3
+ /* Bison interface for Yacc-like parsers in C
4
+
5
+ Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
+
20
+ /* As a special exception, you may create a larger work that contains
21
+ part or all of the Bison parser skeleton and distribute that work
22
+ under terms of your choice, so long as that work isn't itself a
23
+ parser generator using the skeleton or a modified version thereof
24
+ as a parser skeleton. Alternatively, if you modify or redistribute
25
+ the parser skeleton itself, you may (at your option) remove this
26
+ special exception, which will cause the skeleton and the resulting
27
+ Bison output files to be licensed under the GNU General Public
28
+ License without this special exception.
29
+
30
+ This special exception was added by the Free Software Foundation in
31
+ version 2.2 of Bison. */
32
+
33
+ #ifndef YY_YY_Y_TAB_H_INCLUDED
34
+ # define YY_YY_Y_TAB_H_INCLUDED
35
+ /* Debug traces. */
36
+ #ifndef YYDEBUG
37
+ # define YYDEBUG 0
38
+ #endif
39
+ #if YYDEBUG
40
+ extern int yydebug;
41
+ #endif
42
+
43
+ /* Token type. */
44
+ #ifndef YYTOKENTYPE
45
+ # define YYTOKENTYPE
46
+ enum yytokentype
47
+ {
48
+ END_OF_INPUT = 0,
49
+ keyword_class = 258,
50
+ keyword_module = 259,
51
+ keyword_def = 260,
52
+ keyword_undef = 261,
53
+ keyword_begin = 262,
54
+ keyword_rescue = 263,
55
+ keyword_ensure = 264,
56
+ keyword_end = 265,
57
+ keyword_if = 266,
58
+ keyword_unless = 267,
59
+ keyword_then = 268,
60
+ keyword_elsif = 269,
61
+ keyword_else = 270,
62
+ keyword_case = 271,
63
+ keyword_when = 272,
64
+ keyword_while = 273,
65
+ keyword_until = 274,
66
+ keyword_for = 275,
67
+ keyword_break = 276,
68
+ keyword_next = 277,
69
+ keyword_redo = 278,
70
+ keyword_retry = 279,
71
+ keyword_in = 280,
72
+ keyword_do = 281,
73
+ keyword_do_cond = 282,
74
+ keyword_do_block = 283,
75
+ keyword_do_LAMBDA = 284,
76
+ keyword_return = 285,
77
+ keyword_yield = 286,
78
+ keyword_super = 287,
79
+ keyword_self = 288,
80
+ keyword_nil = 289,
81
+ keyword_true = 290,
82
+ keyword_false = 291,
83
+ keyword_and = 292,
84
+ keyword_or = 293,
85
+ keyword_not = 294,
86
+ modifier_if = 295,
87
+ modifier_unless = 296,
88
+ modifier_while = 297,
89
+ modifier_until = 298,
90
+ modifier_rescue = 299,
91
+ keyword_alias = 300,
92
+ keyword_defined = 301,
93
+ keyword_BEGIN = 302,
94
+ keyword_END = 303,
95
+ keyword__LINE__ = 304,
96
+ keyword__FILE__ = 305,
97
+ keyword__ENCODING__ = 306,
98
+ tIDENTIFIER = 307,
99
+ tFID = 308,
100
+ tGVAR = 309,
101
+ tIVAR = 310,
102
+ tCONSTANT = 311,
103
+ tCVAR = 312,
104
+ tLABEL = 313,
105
+ tINTEGER = 314,
106
+ tFLOAT = 315,
107
+ tRATIONAL = 316,
108
+ tIMAGINARY = 317,
109
+ tCHAR = 318,
110
+ tNTH_REF = 319,
111
+ tBACK_REF = 320,
112
+ tSTRING_CONTENT = 321,
113
+ tREGEXP_END = 322,
114
+ tSP = 323,
115
+ tUPLUS = 132,
116
+ tUMINUS = 133,
117
+ tPOW = 134,
118
+ tCMP = 135,
119
+ tEQ = 140,
120
+ tEQQ = 141,
121
+ tNEQ = 142,
122
+ tGEQ = 139,
123
+ tLEQ = 138,
124
+ tANDOP = 148,
125
+ tOROP = 149,
126
+ tMATCH = 143,
127
+ tNMATCH = 144,
128
+ tDOT2 = 128,
129
+ tDOT3 = 129,
130
+ tBDOT2 = 130,
131
+ tBDOT3 = 131,
132
+ tAREF = 145,
133
+ tASET = 146,
134
+ tLSHFT = 136,
135
+ tRSHFT = 137,
136
+ tANDDOT = 150,
137
+ tCOLON2 = 147,
138
+ tCOLON3 = 324,
139
+ tOP_ASGN = 325,
140
+ tASSOC = 326,
141
+ tLPAREN = 327,
142
+ tLPAREN_ARG = 328,
143
+ tRPAREN = 329,
144
+ tLBRACK = 330,
145
+ tLBRACE = 331,
146
+ tLBRACE_ARG = 332,
147
+ tSTAR = 333,
148
+ tDSTAR = 334,
149
+ tAMPER = 335,
150
+ tLAMBDA = 336,
151
+ tSYMBEG = 337,
152
+ tSTRING_BEG = 338,
153
+ tXSTRING_BEG = 339,
154
+ tREGEXP_BEG = 340,
155
+ tWORDS_BEG = 341,
156
+ tQWORDS_BEG = 342,
157
+ tSYMBOLS_BEG = 343,
158
+ tQSYMBOLS_BEG = 344,
159
+ tSTRING_END = 345,
160
+ tSTRING_DEND = 346,
161
+ tSTRING_DBEG = 347,
162
+ tSTRING_DVAR = 348,
163
+ tLAMBEG = 349,
164
+ tLABEL_END = 350,
165
+ tLOWEST = 351,
166
+ tUMINUS_NUM = 352,
167
+ tLAST_TOKEN = 353
168
+ };
169
+ #endif
170
+
171
+ /* Value type. */
172
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
173
+
174
+ union YYSTYPE
175
+ {
176
+
177
+ VALUE val;
178
+ NODE *node;
179
+ ID id;
180
+ int num;
181
+ st_table *tbl;
182
+ const struct vtable *vars;
183
+ struct rb_strterm_struct *strterm;
184
+ struct lex_context ctxt;
185
+
186
+ };
187
+
188
+ typedef union YYSTYPE YYSTYPE;
189
+ # define YYSTYPE_IS_TRIVIAL 1
190
+ # define YYSTYPE_IS_DECLARED 1
191
+ #endif
192
+
193
+ /* Location type. */
194
+ #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
195
+ typedef struct YYLTYPE YYLTYPE;
196
+ struct YYLTYPE
197
+ {
198
+ int first_line;
199
+ int first_column;
200
+ int last_line;
201
+ int last_column;
202
+ };
203
+ # define YYLTYPE_IS_DECLARED 1
204
+ # define YYLTYPE_IS_TRIVIAL 1
205
+ #endif
206
+
207
+
208
+
209
+ int yyparse (struct parser_params *p);
210
+
211
+ #endif /* !YY_YY_Y_TAB_H_INCLUDED */
@@ -0,0 +1,44 @@
1
+ #ifndef RUBY_PROBES_HELPER_H
2
+ #define RUBY_PROBES_HELPER_H
3
+
4
+ #include "ruby/ruby.h"
5
+
6
+ struct ruby_dtrace_method_hook_args {
7
+ const char *classname;
8
+ const char *methodname;
9
+ const char *filename;
10
+ int line_no;
11
+ volatile VALUE klass;
12
+ volatile VALUE name;
13
+ };
14
+
15
+ MJIT_SYMBOL_EXPORT_BEGIN
16
+ NOINLINE(int rb_dtrace_setup(rb_execution_context_t *, VALUE, ID, struct ruby_dtrace_method_hook_args *));
17
+ MJIT_SYMBOL_EXPORT_END
18
+
19
+ #define RUBY_DTRACE_METHOD_HOOK(name, ec, klazz, id) \
20
+ do { \
21
+ if (UNLIKELY(RUBY_DTRACE_##name##_ENABLED())) { \
22
+ struct ruby_dtrace_method_hook_args args; \
23
+ if (rb_dtrace_setup(ec, klazz, id, &args)) { \
24
+ RUBY_DTRACE_##name(args.classname, \
25
+ args.methodname, \
26
+ args.filename, \
27
+ args.line_no); \
28
+ } \
29
+ } \
30
+ } while (0)
31
+
32
+ #define RUBY_DTRACE_METHOD_ENTRY_HOOK(ec, klass, id) \
33
+ RUBY_DTRACE_METHOD_HOOK(METHOD_ENTRY, ec, klass, id)
34
+
35
+ #define RUBY_DTRACE_METHOD_RETURN_HOOK(ec, klass, id) \
36
+ RUBY_DTRACE_METHOD_HOOK(METHOD_RETURN, ec, klass, id)
37
+
38
+ #define RUBY_DTRACE_CMETHOD_ENTRY_HOOK(ec, klass, id) \
39
+ RUBY_DTRACE_METHOD_HOOK(CMETHOD_ENTRY, ec, klass, id)
40
+
41
+ #define RUBY_DTRACE_CMETHOD_RETURN_HOOK(ec, klass, id) \
42
+ RUBY_DTRACE_METHOD_HOOK(CMETHOD_RETURN, ec, klass, id)
43
+
44
+ #endif /* RUBY_PROBES_HELPER_H */
@@ -0,0 +1,271 @@
1
+ #include "ruby/ruby.h"
2
+ #include "vm_core.h"
3
+ #include "id_table.h"
4
+ #include "vm_debug.h"
5
+ #include "ractor_pub.h"
6
+
7
+ #ifndef RACTOR_CHECK_MODE
8
+ #define RACTOR_CHECK_MODE (0 || VM_CHECK_MODE || RUBY_DEBUG)
9
+ #endif
10
+
11
+ enum rb_ractor_basket_type {
12
+ basket_type_none,
13
+ basket_type_shareable,
14
+ basket_type_copy_marshal,
15
+ basket_type_copy_custom,
16
+ basket_type_move,
17
+ basket_type_exception,
18
+ };
19
+
20
+ struct rb_ractor_basket {
21
+ enum rb_ractor_basket_type type;
22
+ VALUE v;
23
+ VALUE sender;
24
+ };
25
+
26
+ struct rb_ractor_queue {
27
+ struct rb_ractor_basket *baskets;
28
+ int cnt;
29
+ int size;
30
+ };
31
+
32
+ struct rb_ractor_waiting_list {
33
+ int cnt;
34
+ int size;
35
+ rb_ractor_t **ractors;
36
+ };
37
+
38
+ struct rb_ractor_struct {
39
+ // ractor lock
40
+ rb_nativethread_lock_t lock;
41
+ #if RACTOR_CHECK_MODE > 0
42
+ VALUE locked_by;
43
+ #endif
44
+
45
+ // communication
46
+ struct rb_ractor_queue incoming_queue;
47
+
48
+ bool incoming_port_closed;
49
+ bool outgoing_port_closed;
50
+ bool yield_atexit;
51
+
52
+ struct rb_ractor_waiting_list taking_ractors;
53
+
54
+ struct ractor_wait {
55
+ enum ractor_wait_status {
56
+ wait_none = 0x00,
57
+ wait_recving = 0x01,
58
+ wait_taking = 0x02,
59
+ wait_yielding = 0x04,
60
+ } status;
61
+
62
+ enum ractor_wakeup_status {
63
+ wakeup_none,
64
+ wakeup_by_send,
65
+ wakeup_by_yield,
66
+ wakeup_by_take,
67
+ wakeup_by_close,
68
+ wakeup_by_interrupt,
69
+ wakeup_by_retry,
70
+ } wakeup_status;
71
+
72
+ struct rb_ractor_basket taken_basket;
73
+ struct rb_ractor_basket yielded_basket;
74
+
75
+ rb_nativethread_cond_t cond;
76
+ } wait;
77
+
78
+ // vm wide barrier synchronization
79
+ rb_nativethread_cond_t barrier_wait_cond;
80
+
81
+ // thread management
82
+ struct {
83
+ struct list_head set;
84
+ unsigned int cnt;
85
+ unsigned int blocking_cnt;
86
+ unsigned int sleeper;
87
+ rb_global_vm_lock_t gvl;
88
+ rb_execution_context_t *running_ec;
89
+ rb_thread_t *main;
90
+ } threads;
91
+ VALUE thgroup_default;
92
+
93
+ // identity
94
+ VALUE self;
95
+ uint32_t id;
96
+ VALUE name;
97
+ VALUE loc;
98
+
99
+ // created
100
+ // | ready to run
101
+ // ====================== inserted to vm->ractor
102
+ // v
103
+ // blocking <---+ all threads are blocking
104
+ // | |
105
+ // v |
106
+ // running -----+
107
+ // | all threads are terminated.
108
+ // ====================== removed from vm->ractor
109
+ // v
110
+ // terminated
111
+ //
112
+ // status is protected by VM lock (global state)
113
+
114
+ enum ractor_status {
115
+ ractor_created,
116
+ ractor_running,
117
+ ractor_blocking,
118
+ ractor_terminated,
119
+ } status_;
120
+
121
+ struct list_node vmlr_node;
122
+
123
+
124
+ VALUE r_stdin;
125
+ VALUE r_stdout;
126
+ VALUE r_stderr;
127
+ }; // rb_ractor_t is defined in vm_core.h
128
+
129
+ rb_ractor_t *rb_ractor_main_alloc(void);
130
+ void rb_ractor_main_setup(rb_vm_t *vm, rb_ractor_t *main_ractor, rb_thread_t *main_thread);
131
+ VALUE rb_ractor_self(const rb_ractor_t *g);
132
+ void rb_ractor_atexit(rb_execution_context_t *ec, VALUE result);
133
+ void rb_ractor_atexit_exception(rb_execution_context_t *ec);
134
+ void rb_ractor_teardown(rb_execution_context_t *ec);
135
+ void rb_ractor_recv_parameters(rb_execution_context_t *ec, rb_ractor_t *g, int len, VALUE *ptr);
136
+ void rb_ractor_send_parameters(rb_execution_context_t *ec, rb_ractor_t *g, VALUE args);
137
+
138
+ VALUE rb_thread_create_ractor(rb_ractor_t *g, VALUE args, VALUE proc); // defined in thread.c
139
+
140
+ rb_global_vm_lock_t *rb_ractor_gvl(rb_ractor_t *);
141
+ int rb_ractor_living_thread_num(const rb_ractor_t *);
142
+ VALUE rb_ractor_thread_list(rb_ractor_t *r);
143
+
144
+ void rb_ractor_living_threads_init(rb_ractor_t *r);
145
+ void rb_ractor_living_threads_insert(rb_ractor_t *r, rb_thread_t *th);
146
+ void rb_ractor_living_threads_remove(rb_ractor_t *r, rb_thread_t *th);
147
+ void rb_ractor_blocking_threads_inc(rb_ractor_t *r, const char *file, int line); // TODO: file, line only for RUBY_DEBUG_LOG
148
+ void rb_ractor_blocking_threads_dec(rb_ractor_t *r, const char *file, int line); // TODO: file, line only for RUBY_DEBUG_LOG
149
+
150
+ void rb_ractor_vm_barrier_interrupt_running_thread(rb_ractor_t *r);
151
+ void rb_ractor_terminate_interrupt_main_thread(rb_ractor_t *r);
152
+ void rb_ractor_terminate_all(void);
153
+
154
+ static inline bool
155
+ rb_ractor_status_p(rb_ractor_t *r, enum ractor_status status)
156
+ {
157
+ return r->status_ == status;
158
+ }
159
+
160
+ static inline void
161
+ rb_ractor_sleeper_threads_inc(rb_ractor_t *r)
162
+ {
163
+ r->threads.sleeper++;
164
+ }
165
+
166
+ static inline void
167
+ rb_ractor_sleeper_threads_dec(rb_ractor_t *r)
168
+ {
169
+ r->threads.sleeper--;
170
+ }
171
+
172
+ static inline void
173
+ rb_ractor_sleeper_threads_clear(rb_ractor_t *r)
174
+ {
175
+ r->threads.sleeper = 0;
176
+ }
177
+
178
+ static inline int
179
+ rb_ractor_sleeper_thread_num(rb_ractor_t *r)
180
+ {
181
+ return r->threads.sleeper;
182
+ }
183
+
184
+ static inline void
185
+ rb_ractor_thread_switch(rb_ractor_t *cr, rb_thread_t *th)
186
+ {
187
+ if (cr->threads.running_ec != th->ec) {
188
+ if (0) fprintf(stderr, "rb_ractor_thread_switch ec:%p->%p\n",
189
+ (void *)cr->threads.running_ec, (void *)th->ec);
190
+ }
191
+ else {
192
+ return;
193
+ }
194
+
195
+ if (cr->threads.running_ec != th->ec) {
196
+ th->running_time_us = 0;
197
+ }
198
+
199
+ cr->threads.running_ec = th->ec;
200
+
201
+ VM_ASSERT(cr == GET_RACTOR());
202
+ }
203
+
204
+ static inline void
205
+ rb_ractor_set_current_ec(rb_ractor_t *cr, rb_execution_context_t *ec)
206
+ {
207
+ native_tls_set(ruby_current_ec_key, ec);
208
+
209
+ if (cr->threads.running_ec != ec) {
210
+ if (0) fprintf(stderr, "rb_ractor_set_current_ec ec:%p->%p\n",
211
+ (void *)cr->threads.running_ec, (void *)ec);
212
+ }
213
+ else {
214
+ VM_ASSERT(0); // should be different
215
+ }
216
+
217
+ cr->threads.running_ec = ec;
218
+ }
219
+
220
+ void rb_vm_ractor_blocking_cnt_inc(rb_vm_t *vm, rb_ractor_t *cr, const char *file, int line);
221
+ void rb_vm_ractor_blocking_cnt_dec(rb_vm_t *vm, rb_ractor_t *cr, const char *file, int line);
222
+
223
+ uint32_t rb_ractor_id(const rb_ractor_t *r);
224
+
225
+ #if RACTOR_CHECK_MODE > 0
226
+ uint32_t rb_ractor_current_id(void);
227
+
228
+ static inline void
229
+ rb_ractor_setup_belonging_to(VALUE obj, uint32_t rid)
230
+ {
231
+ VALUE flags = RBASIC(obj)->flags & 0xffffffff; // 4B
232
+ RBASIC(obj)->flags = flags | ((VALUE)rid << 32);
233
+ }
234
+
235
+ static inline void
236
+ rb_ractor_setup_belonging(VALUE obj)
237
+ {
238
+ rb_ractor_setup_belonging_to(obj, rb_ractor_current_id());
239
+ }
240
+
241
+ static inline uint32_t
242
+ rb_ractor_belonging(VALUE obj)
243
+ {
244
+ if (rb_ractor_shareable_p(obj)) {
245
+ return 0;
246
+ }
247
+ else {
248
+ return RBASIC(obj)->flags >> 32;
249
+ }
250
+ }
251
+
252
+ static inline VALUE
253
+ rb_ractor_confirm_belonging(VALUE obj)
254
+ {
255
+ uint32_t id = rb_ractor_belonging(obj);
256
+
257
+ if (id == 0) {
258
+ if (UNLIKELY(!rb_ractor_shareable_p(obj))) {
259
+ rp(obj);
260
+ rb_bug("id == 0 but not shareable");
261
+ }
262
+ }
263
+ else if (UNLIKELY(id != rb_ractor_current_id())) {
264
+ rp(obj);
265
+ rb_bug("rb_ractor_confirm_belonging object-ractor id:%u, current-ractor id:%u", id, rb_ractor_current_id());
266
+ }
267
+ return obj;
268
+ }
269
+ #else
270
+ #define rb_ractor_confirm_belonging(obj) obj
271
+ #endif