File tree Expand file tree Collapse file tree 4 files changed +67
-0
lines changed Expand file tree Collapse file tree 4 files changed +67
-0
lines changed Original file line number Diff line number Diff line change 16
16
#include "mutex.c"
17
17
#include "page.c"
18
18
#include "rbtree.c"
19
+ #include "rcu.c"
19
20
#include "refcount.c"
20
21
#include "signal.c"
21
22
#include "slab.c"
Original file line number Diff line number Diff line change
1
+ // SPDX-License-Identifier: GPL-2.0
2
+
3
+ #include <linux/rcupdate.h>
4
+
5
+ void rust_helper_rcu_read_lock (void )
6
+ {
7
+ rcu_read_lock ();
8
+ }
9
+
10
+ void rust_helper_rcu_read_unlock (void )
11
+ {
12
+ rcu_read_unlock ();
13
+ }
Original file line number Diff line number Diff line change @@ -11,6 +11,7 @@ mod arc;
11
11
mod condvar;
12
12
pub mod lock;
13
13
mod locked_by;
14
+ pub mod rcu;
14
15
15
16
pub use arc:: { Arc , ArcBorrow , UniqueArc } ;
16
17
pub use condvar:: { new_condvar, CondVar , CondVarTimeoutResult } ;
Original file line number Diff line number Diff line change
1
+ // SPDX-License-Identifier: GPL-2.0
2
+
3
+ //! RCU support.
4
+ //!
5
+ //! C header: [`include/linux/rcupdate.h`](srctree/include/linux/rcupdate.h)
6
+
7
+ use crate :: bindings;
8
+ use core:: marker:: PhantomData ;
9
+
10
+ /// Evidence that the RCU read side lock is held on the current thread/CPU.
11
+ ///
12
+ /// The type is explicitly not `Send` because this property is per-thread/CPU.
13
+ ///
14
+ /// # Invariants
15
+ ///
16
+ /// The RCU read side lock is actually held while instances of this guard exist.
17
+ pub struct Guard {
18
+ _not_send : PhantomData < * mut ( ) > ,
19
+ }
20
+
21
+ impl Guard {
22
+ /// Acquires the RCU read side lock and returns a guard.
23
+ pub fn new ( ) -> Self {
24
+ // SAFETY: An FFI call with no additional requirements.
25
+ unsafe { bindings:: rcu_read_lock ( ) } ;
26
+ // INVARIANT: The RCU read side lock was just acquired above.
27
+ Self {
28
+ _not_send : PhantomData ,
29
+ }
30
+ }
31
+
32
+ /// Explicitly releases the RCU read side lock.
33
+ pub fn unlock ( self ) { }
34
+ }
35
+
36
+ impl Default for Guard {
37
+ fn default ( ) -> Self {
38
+ Self :: new ( )
39
+ }
40
+ }
41
+
42
+ impl Drop for Guard {
43
+ fn drop ( & mut self ) {
44
+ // SAFETY: By the type invariants, the rcu read side is locked, so it is ok to unlock it.
45
+ unsafe { bindings:: rcu_read_unlock ( ) } ;
46
+ }
47
+ }
48
+
49
+ /// Acquires the RCU read side lock.
50
+ pub fn read_lock ( ) -> Guard {
51
+ Guard :: new ( )
52
+ }
You can’t perform that action at this time.
0 commit comments