@@ -27,6 +27,8 @@ module Truffle::CExt
27
27
SULONG = Truffle ::Boot . get_option ( 'cexts-sulong' )
28
28
NFI = !SULONG
29
29
30
+ CEXT_LOCK = Truffle ::Boot . get_option ( 'cexts-lock' )
31
+
30
32
SET_LIBTRUFFLERUBY = -> libtruffleruby do
31
33
LIBTRUFFLERUBY = libtruffleruby
32
34
end
@@ -243,7 +245,7 @@ def init_extension(library, library_path)
243
245
# Resolve while inside the ExtensionCallStackEntry to ensure the preservedObjects are still all alive
244
246
resolve_registered_addresses
245
247
end
246
- } , [ ] , nil , nil )
248
+ } , [ ] , nil , nil , CEXT_LOCK )
247
249
end
248
250
249
251
def supported?
@@ -856,12 +858,14 @@ def rb_str_new_frozen(value)
856
858
end
857
859
858
860
def rb_tracepoint_new ( events , func , data )
861
+ use_cext_lock = Primitive . use_cext_lock?
859
862
TracePoint . new ( *events_to_events_array ( events ) ) do |tp |
860
863
Primitive . call_with_cext_lock_and_frame (
861
864
POINTER2_TO_VOID_WRAPPER ,
862
865
[ func , Primitive . cext_wrap ( tp ) , data ] ,
863
866
Primitive . caller_special_variables_if_available ,
864
- nil )
867
+ nil ,
868
+ use_cext_lock )
865
869
end
866
870
end
867
871
@@ -1204,6 +1208,7 @@ def rb_path_to_class(path)
1204
1208
end
1205
1209
1206
1210
def rb_proc_new ( function , value )
1211
+ use_cext_lock = Primitive . use_cext_lock?
1207
1212
Proc . new do |*args , &block |
1208
1213
Primitive . call_with_cext_lock_and_frame_and_unwrap ( RB_BLOCK_CALL_FUNC_WRAPPER , [
1209
1214
function ,
@@ -1212,7 +1217,7 @@ def rb_proc_new(function, value)
1212
1217
args . size , # argc
1213
1218
Truffle ::CExt . RARRAY_PTR ( args ) , # argv
1214
1219
Primitive . cext_wrap ( block ) , # blockarg
1215
- ] , Primitive . caller_special_variables_if_available , nil )
1220
+ ] , Primitive . caller_special_variables_if_available , nil , use_cext_lock )
1216
1221
end
1217
1222
end
1218
1223
@@ -1475,12 +1480,14 @@ def rb_enumeratorize(obj, meth, args)
1475
1480
1476
1481
def rb_enumeratorize_with_size ( obj , meth , args , size_fn )
1477
1482
return rb_enumeratorize ( obj , meth , args ) if Primitive . interop_null? ( size_fn )
1483
+ use_cext_lock = Primitive . use_cext_lock?
1478
1484
enum = obj . to_enum ( meth , *args ) do
1479
1485
Primitive . call_with_cext_lock_and_frame_and_unwrap (
1480
1486
POINTER3_TO_POINTER_WRAPPER ,
1481
1487
[ size_fn , Primitive . cext_wrap ( obj ) , Primitive . cext_wrap ( args ) , Primitive . cext_wrap ( enum ) ] ,
1482
1488
Primitive . caller_special_variables_if_available ,
1483
- nil )
1489
+ nil ,
1490
+ use_cext_lock )
1484
1491
end
1485
1492
enum
1486
1493
end
@@ -1494,12 +1501,14 @@ def rb_newobj_of(ruby_class)
1494
1501
end
1495
1502
1496
1503
def rb_define_alloc_func ( ruby_class , function )
1504
+ use_cext_lock = Primitive . use_cext_lock?
1497
1505
ruby_class . singleton_class . define_method ( :__allocate__ ) do
1498
1506
Primitive . call_with_cext_lock_and_frame_and_unwrap (
1499
1507
POINTER_TO_POINTER_WRAPPER ,
1500
1508
[ function , Primitive . cext_wrap ( self ) ] ,
1501
1509
Primitive . caller_special_variables_if_available ,
1502
- nil )
1510
+ nil ,
1511
+ use_cext_lock )
1503
1512
end
1504
1513
class << ruby_class
1505
1514
private :__allocate__
@@ -1697,10 +1706,11 @@ def rb_nativethread_lock_destroy(lock)
1697
1706
end
1698
1707
1699
1708
def rb_set_end_proc ( func , data )
1709
+ use_cext_lock = Primitive . use_cext_lock?
1700
1710
at_exit do
1701
1711
Primitive . call_with_cext_lock_and_frame (
1702
1712
POINTER_TO_VOID_WRAPPER , [ func , data ] ,
1703
- Primitive . caller_special_variables_if_available , nil )
1713
+ Primitive . caller_special_variables_if_available , nil , use_cext_lock )
1704
1714
end
1705
1715
end
1706
1716
@@ -1736,22 +1746,24 @@ def RTYPEDDATA(object)
1736
1746
1737
1747
private def data_sizer ( sizer_function , rtypeddata )
1738
1748
raise unless sizer_function . respond_to? ( :call )
1749
+ use_cext_lock = Primitive . use_cext_lock?
1739
1750
proc {
1740
1751
Primitive . call_with_cext_lock_and_frame (
1741
1752
POINTER_TO_SIZE_T_WRAPPER , [ sizer_function , rtypeddata ] ,
1742
- Primitive . caller_special_variables_if_available , nil )
1753
+ Primitive . caller_special_variables_if_available , nil , use_cext_lock )
1743
1754
}
1744
1755
end
1745
1756
1746
1757
def rb_data_object_wrap ( ruby_class , data , mark , free )
1747
1758
ruby_class = Object unless ruby_class
1748
1759
object = ruby_class . __send__ ( :__layout_allocate__ )
1760
+ use_cext_lock = Primitive . use_cext_lock?
1749
1761
1750
1762
rdata = LIBTRUFFLERUBY . rb_tr_rdata_create ( mark , free , data )
1751
1763
Primitive . object_hidden_var_set object , DATA_STRUCT , rdata
1752
1764
Primitive . object_hidden_var_set object , DATA_MARKER , data_marker ( LIBTRUFFLERUBY [ :rb_tr_rdata_run_marker ] , rdata )
1753
1765
# Could use a simpler finalizer if Truffle::Interop.null?(free)
1754
- Primitive . objectspace_define_data_finalizer object , LIBTRUFFLERUBY [ :rb_tr_rdata_run_finalizer ] , rdata
1766
+ Primitive . objectspace_define_data_finalizer object , LIBTRUFFLERUBY [ :rb_tr_rdata_run_finalizer ] , rdata , use_cext_lock
1755
1767
1756
1768
Primitive . cext_mark_object_on_call_exit ( object ) unless Truffle ::Interop . null? ( mark )
1757
1769
@@ -1761,12 +1773,13 @@ def rb_data_object_wrap(ruby_class, data, mark, free)
1761
1773
def rb_data_typed_object_wrap ( ruby_class , data , data_type , mark , free , size )
1762
1774
ruby_class = Object unless ruby_class
1763
1775
object = ruby_class . __send__ ( :__layout_allocate__ )
1776
+ use_cext_lock = Primitive . use_cext_lock?
1764
1777
1765
1778
rtypeddata = LIBTRUFFLERUBY . rb_tr_rtypeddata_create ( data_type , data )
1766
1779
Primitive . object_hidden_var_set object , DATA_STRUCT , rtypeddata
1767
1780
Primitive . object_hidden_var_set object , DATA_MARKER , data_marker ( LIBTRUFFLERUBY [ :rb_tr_rtypeddata_run_marker ] , rtypeddata )
1768
1781
# Could use a simpler finalizer if Truffle::Interop.null?(free)
1769
- Primitive . objectspace_define_data_finalizer object , LIBTRUFFLERUBY [ :rb_tr_rtypeddata_run_finalizer ] , rtypeddata
1782
+ Primitive . objectspace_define_data_finalizer object , LIBTRUFFLERUBY [ :rb_tr_rtypeddata_run_finalizer ] , rtypeddata , use_cext_lock
1770
1783
1771
1784
unless Truffle ::Interop . null? ( size )
1772
1785
Primitive . object_hidden_var_set object , DATA_MEMSIZER , data_sizer ( LIBTRUFFLERUBY [ :rb_tr_rtypeddata_run_memsizer ] , rtypeddata )
@@ -1778,8 +1791,8 @@ def rb_data_typed_object_wrap(ruby_class, data, data_type, mark, free, size)
1778
1791
object
1779
1792
end
1780
1793
1781
- def run_data_finalizer ( function , data )
1782
- Primitive . call_with_cext_lock_and_frame POINTER_TO_VOID_WRAPPER , [ function , data ] , nil , nil
1794
+ def run_data_finalizer ( function , data , use_cext_lock )
1795
+ Primitive . call_with_cext_lock_and_frame POINTER_TO_VOID_WRAPPER , [ function , data ] , nil , nil , use_cext_lock
1783
1796
end
1784
1797
1785
1798
def run_marker ( obj )
@@ -1835,6 +1848,8 @@ def send_splatted(object, method, args)
1835
1848
end
1836
1849
1837
1850
def rb_block_call ( object , method , args , func , data )
1851
+ use_cext_lock = Primitive . use_cext_lock?
1852
+
1838
1853
object . __send__ ( method , *args ) do |*block_args |
1839
1854
Primitive . cext_unwrap ( Primitive . call_with_cext_lock ( RB_BLOCK_CALL_FUNC_WRAPPER , [ # Probably need to save the frame here for blocks.
1840
1855
func ,
@@ -1843,7 +1858,7 @@ def rb_block_call(object, method, args, func, data)
1843
1858
block_args . size , # argc
1844
1859
Truffle ::CExt . RARRAY_PTR ( block_args ) , # argv
1845
1860
nil , # blockarg
1846
- ] ) )
1861
+ ] , use_cext_lock ) )
1847
1862
end
1848
1863
end
1849
1864
@@ -1920,6 +1935,8 @@ def rb_exec_recursive(func, obj, arg)
1920
1935
Truffle ::Graal . always_split instance_method ( :rb_exec_recursive )
1921
1936
1922
1937
def rb_catch_obj ( tag , func , data )
1938
+ use_cext_lock = Primitive . use_cext_lock?
1939
+
1923
1940
catch tag do |caught |
1924
1941
Primitive . cext_unwrap ( Primitive . call_with_cext_lock ( RB_BLOCK_CALL_FUNC_WRAPPER , [
1925
1942
func ,
@@ -1928,7 +1945,7 @@ def rb_catch_obj(tag, func, data)
1928
1945
0 , # argc
1929
1946
nil , # argv
1930
1947
nil , # blockarg
1931
- ] ) )
1948
+ ] , use_cext_lock ) )
1932
1949
end
1933
1950
end
1934
1951
@@ -2006,13 +2023,14 @@ def rb_time_interval_acceptable(time_val)
2006
2023
end
2007
2024
2008
2025
def rb_thread_create ( fn , args )
2026
+ use_cext_lock = Primitive . use_cext_lock?
2009
2027
Thread . new do
2010
- Primitive . call_with_cext_lock_and_frame ( POINTER_TO_POINTER_WRAPPER , [ fn , args ] , Primitive . caller_special_variables_if_available , nil )
2028
+ Primitive . call_with_cext_lock_and_frame ( POINTER_TO_POINTER_WRAPPER , [ fn , args ] , Primitive . caller_special_variables_if_available , nil , use_cext_lock )
2011
2029
end
2012
2030
end
2013
2031
2014
2032
def rb_thread_call_with_gvl ( function , data )
2015
- Primitive . call_with_cext_lock ( POINTER_TO_POINTER_WRAPPER , [ function , data ] )
2033
+ Primitive . call_with_cext_lock ( POINTER_TO_POINTER_WRAPPER , [ function , data ] , true )
2016
2034
end
2017
2035
2018
2036
def rb_thread_call_without_gvl ( function , data1 , unblock , data2 )
@@ -2035,6 +2053,7 @@ def rb_thread_call_without_gvl(function, data1, unblock, data2)
2035
2053
end
2036
2054
2037
2055
def rb_iterate ( iteration , iterated_object , callback , callback_arg )
2056
+ use_cext_lock = Primitive . use_cext_lock?
2038
2057
block = rb_block_proc
2039
2058
wrapped_callback = proc do |block_arg |
2040
2059
Primitive . call_with_cext_lock_and_frame_and_unwrap ( RB_BLOCK_CALL_FUNC_WRAPPER , [
@@ -2044,13 +2063,13 @@ def rb_iterate(iteration, iterated_object, callback, callback_arg)
2044
2063
0 , # argc
2045
2064
nil , # argv
2046
2065
nil , # blockarg
2047
- ] , Primitive . cext_special_variables_from_stack , block )
2066
+ ] , Primitive . cext_special_variables_from_stack , block , use_cext_lock )
2048
2067
end
2049
2068
Primitive . cext_unwrap (
2050
2069
Primitive . call_with_cext_lock_and_frame ( POINTER_TO_POINTER_WRAPPER , [
2051
2070
iteration ,
2052
2071
Primitive . cext_wrap ( iterated_object )
2053
- ] , Primitive . cext_special_variables_from_stack , wrapped_callback ) )
2072
+ ] , Primitive . cext_special_variables_from_stack , wrapped_callback , use_cext_lock ) )
2054
2073
end
2055
2074
2056
2075
# From ruby.h
@@ -2147,21 +2166,24 @@ def rb_hash_aref(object, key)
2147
2166
def rb_define_hooked_variable ( name , gvar , getter , setter )
2148
2167
name = "$#{ name } " unless name . start_with? ( '$' )
2149
2168
id = name . to_sym
2169
+ use_cext_lock = Primitive . use_cext_lock?
2150
2170
2151
2171
getter_proc = -> {
2152
2172
Primitive . call_with_cext_lock_and_frame_and_unwrap (
2153
2173
POINTER2_TO_POINTER_WRAPPER ,
2154
2174
[ getter , Primitive . cext_wrap ( id ) , gvar ] ,
2155
2175
Primitive . caller_special_variables_if_available ,
2156
- nil )
2176
+ nil ,
2177
+ use_cext_lock )
2157
2178
}
2158
2179
2159
2180
setter_proc = -> _ , value {
2160
2181
Primitive . call_with_cext_lock_and_frame (
2161
2182
POINTER3_TO_VOID_WRAPPER ,
2162
2183
[ setter , Primitive . cext_wrap ( value ) , Primitive . cext_wrap ( id ) , gvar ] ,
2163
2184
Primitive . caller_special_variables_if_available ,
2164
- nil )
2185
+ nil ,
2186
+ use_cext_lock )
2165
2187
}
2166
2188
2167
2189
Truffle ::KernelOperations . define_hooked_variable id , getter_proc , setter_proc
@@ -2285,6 +2307,7 @@ def rb_fiber_current
2285
2307
end
2286
2308
2287
2309
def rb_fiber_new ( function , value )
2310
+ use_cext_lock = Primitive . use_cext_lock?
2288
2311
Fiber . new do |*args |
2289
2312
Primitive . call_with_cext_lock_and_frame_and_unwrap ( RB_BLOCK_CALL_FUNC_WRAPPER , [
2290
2313
function ,
@@ -2293,7 +2316,7 @@ def rb_fiber_new(function, value)
2293
2316
0 , # argc
2294
2317
nil , # argv
2295
2318
nil , # blockarg
2296
- ] , nil , nil )
2319
+ ] , nil , nil , use_cext_lock )
2297
2320
end
2298
2321
end
2299
2322
0 commit comments