moonpool_sim/storage/
futures.rs1use crate::sim::WeakSimWorld;
8use crate::sim::state::FileId;
9use std::cell::Cell;
10use std::future::Future;
11use std::io;
12use std::pin::Pin;
13use std::task::{Context, Poll};
14
15use super::sim_shutdown_error;
16
17pub struct SyncFuture {
24 sim: WeakSimWorld,
25 file_id: FileId,
26 pending_op: Cell<Option<u64>>,
28}
29
30impl SyncFuture {
31 pub(crate) fn new(sim: WeakSimWorld, file_id: FileId) -> Self {
33 Self {
34 sim,
35 file_id,
36 pending_op: Cell::new(None),
37 }
38 }
39}
40
41impl Future for SyncFuture {
42 type Output = io::Result<()>;
43
44 fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
45 let sim = self.sim.upgrade().map_err(|_| sim_shutdown_error())?;
46
47 if let Some(op_seq) = self.pending_op.get() {
49 if sim.is_storage_op_complete(self.file_id, op_seq) {
51 self.pending_op.set(None);
53
54 if sim.take_sync_failure(self.file_id, op_seq) {
56 return Poll::Ready(Err(io::Error::other("sync failed (simulated I/O error)")));
57 }
58
59 return Poll::Ready(Ok(()));
60 }
61
62 sim.register_storage_waker(self.file_id, op_seq, cx.waker().clone());
64 return Poll::Pending;
65 }
66
67 let op_seq = sim
69 .schedule_sync(self.file_id)
70 .map_err(|e| io::Error::other(e.to_string()))?;
71
72 self.pending_op.set(Some(op_seq));
74
75 sim.register_storage_waker(self.file_id, op_seq, cx.waker().clone());
77
78 Poll::Pending
79 }
80}
81
82pub struct SetLenFuture {
89 sim: WeakSimWorld,
90 file_id: FileId,
91 new_len: u64,
93 pending_op: Cell<Option<u64>>,
95}
96
97impl SetLenFuture {
98 pub(crate) fn new(sim: WeakSimWorld, file_id: FileId, new_len: u64) -> Self {
100 Self {
101 sim,
102 file_id,
103 new_len,
104 pending_op: Cell::new(None),
105 }
106 }
107}
108
109impl Future for SetLenFuture {
110 type Output = io::Result<()>;
111
112 fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
113 let sim = self.sim.upgrade().map_err(|_| sim_shutdown_error())?;
114
115 if let Some(op_seq) = self.pending_op.get() {
117 if sim.is_storage_op_complete(self.file_id, op_seq) {
119 self.pending_op.set(None);
121 return Poll::Ready(Ok(()));
122 }
123
124 sim.register_storage_waker(self.file_id, op_seq, cx.waker().clone());
126 return Poll::Pending;
127 }
128
129 let op_seq = sim
131 .schedule_set_len(self.file_id, self.new_len)
132 .map_err(|e| io::Error::other(e.to_string()))?;
133
134 self.pending_op.set(Some(op_seq));
136
137 sim.register_storage_waker(self.file_id, op_seq, cx.waker().clone());
139
140 Poll::Pending
141 }
142}