5
5
#![ no_std]
6
6
#![ feature( allocator_api, global_asm) ]
7
7
8
- use alloc:: { boxed:: Box , sync :: Arc } ;
8
+ use alloc:: boxed:: Box ;
9
9
use core:: pin:: Pin ;
10
10
use kernel:: prelude:: * ;
11
11
use kernel:: {
@@ -14,7 +14,7 @@ use kernel::{
14
14
file_operations:: { FileOpener , FileOperations } ,
15
15
io_buffer:: { IoBufferReader , IoBufferWriter } ,
16
16
miscdev,
17
- sync:: { CondVar , Mutex } ,
17
+ sync:: { CondVar , Mutex , Ref } ,
18
18
Error ,
19
19
} ;
20
20
@@ -38,38 +38,41 @@ struct SharedState {
38
38
}
39
39
40
40
impl SharedState {
41
- fn try_new ( ) -> Result < Pin < Arc < Self > > > {
42
- let state = Arc :: try_pin ( Self {
43
- // SAFETY: `condvar_init!` is called below.
44
- state_changed : unsafe { CondVar :: new ( ) } ,
45
- // SAFETY: `mutex_init!` is called below.
46
- inner : unsafe { Mutex :: new ( SharedStateInner { token_count : 0 } ) } ,
47
- } ) ?;
48
- // SAFETY: `state_changed` is pinned behind `Pin<Arc>`.
49
- let state_changed = unsafe { Pin :: new_unchecked ( & state. state_changed ) } ;
50
- kernel:: condvar_init!( state_changed, "SharedState::state_changed" ) ;
51
- // SAFETY: `inner` is pinned behind `Pin<Arc>`.
52
- let inner = unsafe { Pin :: new_unchecked ( & state. inner ) } ;
53
- kernel:: mutex_init!( inner, "SharedState::inner" ) ;
54
- Ok ( state)
41
+ fn try_new ( ) -> Result < Pin < Ref < Self > > > {
42
+ Ok ( Ref :: pinned ( Ref :: try_new_and_init (
43
+ Self {
44
+ // SAFETY: `condvar_init!` is called below.
45
+ state_changed : unsafe { CondVar :: new ( ) } ,
46
+ // SAFETY: `mutex_init!` is called below.
47
+ inner : unsafe { Mutex :: new ( SharedStateInner { token_count : 0 } ) } ,
48
+ } ,
49
+ |state| {
50
+ // SAFETY: `state_changed` is pinned when `state` is.
51
+ let state_changed = unsafe { Pin :: new_unchecked ( & state. state_changed ) } ;
52
+ kernel:: condvar_init!( state_changed, "SharedState::state_changed" ) ;
53
+ // SAFETY: `inner` is pinned when `state` is.
54
+ let inner = unsafe { Pin :: new_unchecked ( & state. inner ) } ;
55
+ kernel:: mutex_init!( inner, "SharedState::inner" ) ;
56
+ } ,
57
+ ) ?) )
55
58
}
56
59
}
57
60
58
61
struct Token ;
59
62
60
- impl FileOpener < Pin < Arc < SharedState > > > for Token {
61
- fn open ( shared : & Pin < Arc < SharedState > > ) -> Result < Self :: Wrapper > {
63
+ impl FileOpener < Pin < Ref < SharedState > > > for Token {
64
+ fn open ( shared : & Pin < Ref < SharedState > > ) -> Result < Self :: Wrapper > {
62
65
Ok ( shared. clone ( ) )
63
66
}
64
67
}
65
68
66
69
impl FileOperations for Token {
67
- type Wrapper = Pin < Arc < SharedState > > ;
70
+ type Wrapper = Pin < Ref < SharedState > > ;
68
71
69
72
kernel:: declare_file_operations!( read, write) ;
70
73
71
74
fn read < T : IoBufferWriter > (
72
- shared : & SharedState ,
75
+ shared : & Ref < SharedState > ,
73
76
_: & File ,
74
77
data : & mut T ,
75
78
offset : u64 ,
@@ -102,10 +105,10 @@ impl FileOperations for Token {
102
105
}
103
106
104
107
fn write < T : IoBufferReader > (
105
- shared : & SharedState ,
108
+ shared : & Ref < SharedState > ,
106
109
_: & File ,
107
110
data : & mut T ,
108
- _offs : u64 ,
111
+ _offset : u64 ,
109
112
) -> Result < usize > {
110
113
{
111
114
let mut inner = shared. inner . lock ( ) ;
@@ -128,7 +131,7 @@ impl FileOperations for Token {
128
131
}
129
132
130
133
struct RustMiscdev {
131
- _dev : Pin < Box < miscdev:: Registration < Pin < Arc < SharedState > > > > > ,
134
+ _dev : Pin < Box < miscdev:: Registration < Pin < Ref < SharedState > > > > > ,
132
135
}
133
136
134
137
impl KernelModule for RustMiscdev {
0 commit comments