@@ -8,8 +8,6 @@ use std::result::Result as StdResult;
8
8
use std:: sync:: Arc ;
9
9
use std:: { mem, ptr} ;
10
10
11
- use parking_lot:: ReentrantMutex ;
12
-
13
11
use crate :: chunk:: ChunkMode ;
14
12
use crate :: error:: { Error , Result } ;
15
13
use crate :: function:: Function ;
@@ -21,7 +19,7 @@ use crate::table::Table;
21
19
use crate :: thread:: Thread ;
22
20
use crate :: types:: {
23
21
AppDataRef , AppDataRefMut , Callback , CallbackUpvalue , DestructedUserdata , Integer ,
24
- LightUserData , MaybeSend , RegistryKey , SubtypeId , ValueRef ,
22
+ LightUserData , MaybeSend , ReentrantMutex , RegistryKey , SubtypeId , ValueRef , XRc ,
25
23
} ;
26
24
use crate :: userdata:: { AnyUserData , MetaMethod , UserData , UserDataRegistry , UserDataVariant } ;
27
25
use crate :: util:: {
@@ -50,7 +48,7 @@ pub struct RawLua {
50
48
// The state is dynamic and depends on context
51
49
pub ( super ) state : Cell < * mut ffi:: lua_State > ,
52
50
pub ( super ) main_state : * mut ffi:: lua_State ,
53
- pub ( super ) extra : Rc < UnsafeCell < ExtraData > > ,
51
+ pub ( super ) extra : XRc < UnsafeCell < ExtraData > > ,
54
52
}
55
53
56
54
#[ cfg( not( feature = "module" ) ) ]
@@ -69,6 +67,9 @@ impl Drop for RawLua {
69
67
}
70
68
}
71
69
70
+ #[ cfg( feature = "send" ) ]
71
+ unsafe impl Send for RawLua { }
72
+
72
73
impl RawLua {
73
74
#[ inline( always) ]
74
75
pub ( crate ) fn lua ( & self ) -> & Lua {
@@ -96,7 +97,7 @@ impl RawLua {
96
97
unsafe { ( * self . extra . get ( ) ) . ref_thread }
97
98
}
98
99
99
- pub ( super ) unsafe fn new ( libs : StdLib , options : LuaOptions ) -> Arc < ReentrantMutex < Self > > {
100
+ pub ( super ) unsafe fn new ( libs : StdLib , options : LuaOptions ) -> XRc < ReentrantMutex < Self > > {
100
101
let mem_state: * mut MemoryState = Box :: into_raw ( Box :: default ( ) ) ;
101
102
let mut state = ffi:: lua_newstate ( ALLOCATOR , mem_state as * mut c_void ) ;
102
103
// If state is null then switch to Lua internal allocator
@@ -154,7 +155,7 @@ impl RawLua {
154
155
rawlua
155
156
}
156
157
157
- pub ( super ) unsafe fn init_from_ptr ( state : * mut ffi:: lua_State ) -> Arc < ReentrantMutex < Self > > {
158
+ pub ( super ) unsafe fn init_from_ptr ( state : * mut ffi:: lua_State ) -> XRc < ReentrantMutex < Self > > {
158
159
assert ! ( !state. is_null( ) , "Lua state is NULL" ) ;
159
160
if let Some ( lua) = Self :: try_from_ptr ( state) {
160
161
return lua;
@@ -209,10 +210,10 @@ impl RawLua {
209
210
assert_stack ( main_state, ffi:: LUA_MINSTACK ) ;
210
211
211
212
#[ allow( clippy:: arc_with_non_send_sync) ]
212
- let rawlua = Arc :: new ( ReentrantMutex :: new ( RawLua {
213
+ let rawlua = XRc :: new ( ReentrantMutex :: new ( RawLua {
213
214
state : Cell :: new ( state) ,
214
215
main_state,
215
- extra : Rc :: clone ( & extra) ,
216
+ extra : XRc :: clone ( & extra) ,
216
217
} ) ) ;
217
218
( * extra. get ( ) ) . set_lua ( & rawlua) ;
218
219
@@ -221,10 +222,10 @@ impl RawLua {
221
222
222
223
pub ( super ) unsafe fn try_from_ptr (
223
224
state : * mut ffi:: lua_State ,
224
- ) -> Option < Arc < ReentrantMutex < Self > > > {
225
+ ) -> Option < XRc < ReentrantMutex < Self > > > {
225
226
match ExtraData :: get ( state) {
226
227
extra if extra. is_null ( ) => None ,
227
- extra => Some ( Arc :: clone ( & ( * extra) . lua ( ) . 0 ) ) ,
228
+ extra => Some ( XRc :: clone ( & ( * extra) . lua ( ) . 0 ) ) ,
228
229
}
229
230
}
230
231
@@ -369,7 +370,7 @@ impl RawLua {
369
370
callback_error_ext ( state, extra, move |_| {
370
371
let hook_cb = ( * extra) . hook_callback . clone ( ) ;
371
372
let hook_cb = mlua_expect ! ( hook_cb, "no hook callback set in hook_proc" ) ;
372
- if Arc :: strong_count ( & hook_cb) > 2 {
373
+ if Rc :: strong_count ( & hook_cb) > 2 {
373
374
return Ok ( ( ) ) ; // Don't allow recursion
374
375
}
375
376
let rawlua = ( * extra) . raw_lua ( ) ;
@@ -379,7 +380,7 @@ impl RawLua {
379
380
} )
380
381
}
381
382
382
- ( * self . extra . get ( ) ) . hook_callback = Some ( Arc :: new ( callback) ) ;
383
+ ( * self . extra . get ( ) ) . hook_callback = Some ( Rc :: new ( callback) ) ;
383
384
( * self . extra . get ( ) ) . hook_thread = state; // Mark for what thread the hook is set
384
385
ffi:: lua_sethook ( state, Some ( hook_proc) , triggers. mask ( ) , triggers. count ( ) ) ;
385
386
}
@@ -1105,7 +1106,7 @@ impl RawLua {
1105
1106
check_stack ( state, 4 ) ?;
1106
1107
1107
1108
let func = mem:: transmute :: < Callback , Callback < ' static > > ( func) ;
1108
- let extra = Rc :: clone ( & self . extra ) ;
1109
+ let extra = XRc :: clone ( & self . extra ) ;
1109
1110
let protect = !self . unlikely_memory_error ( ) ;
1110
1111
push_gc_userdata ( state, CallbackUpvalue { data : func, extra } , protect) ?;
1111
1112
if protect {
@@ -1149,7 +1150,7 @@ impl RawLua {
1149
1150
let args = MultiValue :: from_stack_multi ( nargs, rawlua) ?;
1150
1151
let func = & * ( * upvalue) . data ;
1151
1152
let fut = func ( rawlua, args) ;
1152
- let extra = Rc :: clone ( & ( * upvalue) . extra ) ;
1153
+ let extra = XRc :: clone ( & ( * upvalue) . extra ) ;
1153
1154
let protect = !rawlua. unlikely_memory_error ( ) ;
1154
1155
push_gc_userdata ( state, AsyncPollUpvalue { data : fut, extra } , protect) ?;
1155
1156
if protect {
@@ -1209,7 +1210,7 @@ impl RawLua {
1209
1210
check_stack ( state, 4 ) ?;
1210
1211
1211
1212
let func = mem:: transmute :: < AsyncCallback , AsyncCallback < ' static > > ( func) ;
1212
- let extra = Rc :: clone ( & self . extra ) ;
1213
+ let extra = XRc :: clone ( & self . extra ) ;
1213
1214
let protect = !self . unlikely_memory_error ( ) ;
1214
1215
let upvalue = AsyncCallbackUpvalue { data : func, extra } ;
1215
1216
push_gc_userdata ( state, upvalue, protect) ?;
0 commit comments