Skip to content

Commit 675c8b7

Browse files
committed
init() function takes state ownership
1 parent c5f0309 commit 675c8b7

File tree

9 files changed

+37
-108
lines changed

9 files changed

+37
-108
lines changed

concurrency/src/tasks/gen_server.rs

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ impl<G: GenServer> Clone for GenServerHandle<G> {
2020
}
2121

2222
impl<G: GenServer> GenServerHandle<G> {
23-
pub(crate) fn new(mut initial_state: G::State) -> Self {
23+
pub(crate) fn new(initial_state: G::State) -> Self {
2424
let (tx, mut rx) = mpsc::channel::<GenServerInMsg<G>>();
2525
let handle = GenServerHandle { tx };
2626
let mut gen_server: G = GenServer::new();
2727
let handle_clone = handle.clone();
2828
// Ignore the JoinHandle for now. Maybe we'll use it in the future
2929
let _join_handle = rt::spawn(async move {
3030
if gen_server
31-
.run(&handle, &mut rx, &mut initial_state)
31+
.run(&handle, &mut rx, initial_state)
3232
.await
3333
.is_err()
3434
{
@@ -38,7 +38,7 @@ impl<G: GenServer> GenServerHandle<G> {
3838
handle_clone
3939
}
4040

41-
pub(crate) fn new_blocking(mut initial_state: G::State) -> Self {
41+
pub(crate) fn new_blocking(initial_state: G::State) -> Self {
4242
let (tx, mut rx) = mpsc::channel::<GenServerInMsg<G>>();
4343
let handle = GenServerHandle { tx };
4444
let mut gen_server: G = GenServer::new();
@@ -47,7 +47,7 @@ impl<G: GenServer> GenServerHandle<G> {
4747
let _join_handle = rt::spawn_blocking(|| {
4848
rt::block_on(async move {
4949
if gen_server
50-
.run(&handle, &mut rx, &mut initial_state)
50+
.run(&handle, &mut rx, initial_state)
5151
.await
5252
.is_err()
5353
{
@@ -109,7 +109,7 @@ where
109109
type CastMsg: Send + Sized;
110110
type OutMsg: Send + Sized;
111111
type State: Clone + Send;
112-
type Error: Debug;
112+
type Error: Debug + Send;
113113

114114
fn new() -> Self;
115115

@@ -130,23 +130,29 @@ where
130130
&mut self,
131131
handle: &GenServerHandle<Self>,
132132
rx: &mut mpsc::Receiver<GenServerInMsg<Self>>,
133-
state: &mut Self::State,
133+
state: Self::State,
134134
) -> impl Future<Output = Result<(), GenServerError>> + Send {
135135
async {
136-
if let Err(err) = self.init(handle, state).await {
137-
tracing::error!("Initialization failed: {err:?}");
138-
return Err(GenServerError::Initialization);
136+
match self.init(handle, state).await {
137+
Ok(mut new_state) => {
138+
self.main_loop(handle, rx, &mut new_state).await?;
139+
Ok(())
140+
}
141+
Err(err) => {
142+
tracing::error!("Initialization failed: {err:?}");
143+
Err(GenServerError::Initialization)
144+
}
139145
}
140-
self.main_loop(handle, rx, state).await?;
141-
Ok(())
142146
}
143147
}
144148

145149
fn init(
146150
&mut self,
147-
handle: &GenServerHandle<Self>,
148-
state: &mut Self::State,
149-
) -> impl Future<Output = Result<(), Self::Error>> + Send;
151+
_handle: &GenServerHandle<Self>,
152+
state: Self::State,
153+
) -> impl Future<Output = Result<Self::State, Self::Error>> + Send {
154+
async { Ok(state) }
155+
}
150156

151157
fn main_loop(
152158
&mut self,
@@ -267,14 +273,6 @@ mod tests {
267273
Self {}
268274
}
269275

270-
async fn init(
271-
&mut self,
272-
_handle: &GenServerHandle<Self>,
273-
_state: &mut Self::State,
274-
) -> Result<(), Self::Error> {
275-
Ok(())
276-
}
277-
278276
async fn handle_call(
279277
&mut self,
280278
_: Self::CallMsg,
@@ -314,14 +312,6 @@ mod tests {
314312
Self {}
315313
}
316314

317-
async fn init(
318-
&mut self,
319-
_handle: &GenServerHandle<Self>,
320-
_state: &mut Self::State,
321-
) -> Result<(), Self::Error> {
322-
Ok(())
323-
}
324-
325315
async fn handle_call(
326316
&mut self,
327317
message: Self::CallMsg,

concurrency/src/threads/gen_server.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,14 @@ impl<G: GenServer> Clone for GenServerHandle<G> {
2222
}
2323

2424
impl<G: GenServer> GenServerHandle<G> {
25-
pub(crate) fn new(mut initial_state: G::State) -> Self {
25+
pub(crate) fn new(initial_state: G::State) -> Self {
2626
let (tx, mut rx) = mpsc::channel::<GenServerInMsg<G>>();
2727
let handle = GenServerHandle { tx };
2828
let mut gen_server: G = GenServer::new();
2929
let handle_clone = handle.clone();
3030
// Ignore the JoinHandle for now. Maybe we'll use it in the future
3131
let _join_handle = rt::spawn(move || {
32-
if gen_server
33-
.run(&handle, &mut rx, &mut initial_state)
34-
.is_err()
35-
{
32+
if gen_server.run(&handle, &mut rx, initial_state).is_err() {
3633
tracing::trace!("GenServer crashed")
3734
};
3835
});
@@ -108,21 +105,27 @@ where
108105
&mut self,
109106
handle: &GenServerHandle<Self>,
110107
rx: &mut mpsc::Receiver<GenServerInMsg<Self>>,
111-
state: &mut Self::State,
108+
state: Self::State,
112109
) -> Result<(), GenServerError> {
113-
if let Err(err) = self.init(handle, state) {
114-
tracing::error!("Initialization failed: {err:?}");
115-
return Err(GenServerError::Initialization);
110+
match self.init(handle, state) {
111+
Ok(mut new_state) => {
112+
self.main_loop(handle, rx, &mut new_state)?;
113+
Ok(())
114+
}
115+
Err(err) => {
116+
tracing::error!("Initialization failed: {err:?}");
117+
Err(GenServerError::Initialization)
118+
}
116119
}
117-
self.main_loop(handle, rx, state)?;
118-
Ok(())
119120
}
120121

121122
fn init(
122123
&mut self,
123-
handle: &GenServerHandle<Self>,
124-
state: &mut Self::State,
125-
) -> Result<(), Self::Error>;
124+
_handle: &GenServerHandle<Self>,
125+
state: Self::State,
126+
) -> Result<Self::State, Self::Error> {
127+
Ok(state)
128+
}
126129

127130
fn main_loop(
128131
&mut self,

examples/bank/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ impl GenServer for Bank {
5151
Self {}
5252
}
5353

54-
async fn init(
55-
&mut self,
56-
_handle: &GenServerHandle<Self>,
57-
_state: &mut Self::State,
58-
) -> Result<(), Self::Error> {
59-
Ok(())
60-
}
61-
6254
async fn handle_call(
6355
&mut self,
6456
message: Self::CallMsg,

examples/bank_threads/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,6 @@ impl GenServer for Bank {
4747
Self {}
4848
}
4949

50-
fn init(
51-
&mut self,
52-
_handle: &GenServerHandle<Self>,
53-
_state: &mut Self::State,
54-
) -> Result<(), Self::Error> {
55-
Ok(())
56-
}
57-
5850
fn handle_call(
5951
&mut self,
6052
message: Self::CallMsg,

examples/blocking_genserver/main.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,6 @@ impl GenServer for BadlyBehavedTask {
3030
Self {}
3131
}
3232

33-
async fn init(
34-
&mut self,
35-
_handle: &GenServerHandle<Self>,
36-
_state: &mut Self::State,
37-
) -> Result<(), Self::Error> {
38-
Ok(())
39-
}
40-
4133
async fn handle_call(
4234
&mut self,
4335
_: Self::CallMsg,
@@ -79,14 +71,6 @@ impl GenServer for WellBehavedTask {
7971
Self {}
8072
}
8173

82-
async fn init(
83-
&mut self,
84-
_handle: &GenServerHandle<Self>,
85-
_state: &mut Self::State,
86-
) -> Result<(), Self::Error> {
87-
Ok(())
88-
}
89-
9074
async fn handle_call(
9175
&mut self,
9276
message: Self::CallMsg,

examples/name_server/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,6 @@ impl GenServer for NameServer {
3636
Self {}
3737
}
3838

39-
async fn init(
40-
&mut self,
41-
_handle: &GenServerHandle<Self>,
42-
_state: &mut Self::State,
43-
) -> Result<(), Self::Error> {
44-
Ok(())
45-
}
46-
4739
async fn handle_call(
4840
&mut self,
4941
message: Self::CallMsg,

examples/name_server_with_error/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,6 @@ impl GenServer for NameServer {
3939
NameServer {}
4040
}
4141

42-
async fn init(
43-
&mut self,
44-
_handle: &GenServerHandle<Self>,
45-
_state: &mut Self::State,
46-
) -> Result<(), Self::Error> {
47-
Ok(())
48-
}
49-
5042
async fn handle_call(
5143
&mut self,
5244
message: Self::CallMsg,

examples/updater/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,6 @@ impl GenServer for UpdaterServer {
3535
Self {}
3636
}
3737

38-
async fn init(
39-
&mut self,
40-
_handle: &GenServerHandle<Self>,
41-
_state: &mut Self::State,
42-
) -> Result<(), Self::Error> {
43-
Ok(())
44-
}
45-
4638
async fn handle_call(
4739
&mut self,
4840
_message: Self::CallMsg,

examples/updater_threads/src/server.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,6 @@ impl GenServer for UpdaterServer {
3636
Self {}
3737
}
3838

39-
fn init(
40-
&mut self,
41-
_handle: &GenServerHandle<Self>,
42-
_state: &mut Self::State,
43-
) -> Result<(), Self::Error> {
44-
Ok(())
45-
}
46-
4739
fn handle_call(
4840
&mut self,
4941
_message: Self::CallMsg,

0 commit comments

Comments
 (0)