Skip to content

Commit 1279c67

Browse files
committed
refactor(jsruntime): refactoring
1 parent 716d2a7 commit 1279c67

File tree

4 files changed

+84
-74
lines changed

4 files changed

+84
-74
lines changed

libs/jsruntime/src/llvmir/bridge.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#![allow(non_snake_case)]
44
#![allow(non_upper_case_globals)]
55

6-
use crate::tasklet::PromiseId;
6+
use crate::tasklet::Promise;
77
use crate::VoidPtr;
88

99
include!(concat!(env!("OUT_DIR"), "/bridge.rs"));
@@ -93,8 +93,8 @@ impl From<u32> for Value {
9393
}
9494
}
9595

96-
impl From<PromiseId> for Value {
97-
fn from(value: PromiseId) -> Self {
96+
impl From<Promise> for Value {
97+
fn from(value: Promise) -> Self {
9898
Self::promise(value.into())
9999
}
100100
}
@@ -192,13 +192,13 @@ impl Coroutine {
192192
pub fn resume(
193193
runtime: VoidPtr,
194194
coroutine: *mut Coroutine,
195-
promise_id: PromiseId,
195+
promise: Promise,
196196
result: &Value,
197197
error: &Value,
198198
) -> CoroutineStatus {
199199
unsafe {
200200
let lambda = (*(*coroutine).closure).lambda.unwrap();
201-
let mut args = [promise_id.into(), *result, *error];
201+
let mut args = [promise.into(), *result, *error];
202202
let mut retv = Value::NONE;
203203
let status = lambda(
204204
runtime,

libs/jsruntime/src/llvmir/compiler/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2360,8 +2360,8 @@ impl<'r, 's> Compiler<'r, 's> {
23602360
}
23612361

23622362
fn process_resume(&mut self) {
2363-
let promise_id = self.pop_promise();
2364-
self.peer.create_resume(promise_id);
2363+
let promise = self.pop_promise();
2364+
self.peer.create_resume(promise);
23652365
}
23662366

23672367
fn pop_coroutine(&mut self) -> CoroutineIr {

libs/jsruntime/src/llvmir/runtime.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ functions:
6767
type: u32
6868
- name: resume
6969
args:
70-
- name: promise_id
70+
- name: promise
7171
type: u32
7272
- name: emit_promise_resolved
7373
args:

libs/jsruntime/src/tasklet.rs

Lines changed: 76 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::collections::VecDeque;
2-
use std::num::NonZeroU32;
32

43
use rustc_hash::FxHashMap;
54

@@ -20,144 +19,155 @@ impl<X> Runtime<X> {
2019
crate::logger::debug!(event = "handle_message", ?msg);
2120
match msg {
2221
Message::PromiseResolved {
23-
promise_id,
22+
promise,
2423
ref result,
25-
} => self.process_promise(promise_id, result, &Value::NONE),
24+
} => self.process_promise(promise, result, &Value::NONE),
2625
Message::PromiseRejected {
27-
promise_id,
26+
promise,
2827
ref error,
29-
} => self.process_promise(promise_id, &Value::NONE, error),
28+
} => self.process_promise(promise, &Value::NONE, error),
3029
}
3130
}
3231

3332
// promise
3433

35-
pub fn register_promise(&mut self, coroutine: *mut Coroutine) -> PromiseId {
34+
pub fn register_promise(&mut self, coroutine: *mut Coroutine) -> Promise {
3635
crate::logger::debug!(event = "register_promise", ?coroutine);
3736
self.tasklet_system.register_promise(coroutine)
3837
}
3938

40-
pub fn await_promise(&mut self, promise_id: PromiseId, awaiting: PromiseId) {
41-
crate::logger::debug!(event = "await_promise", ?promise_id, ?awaiting);
42-
self.tasklet_system.await_promise(promise_id, awaiting);
39+
pub fn await_promise(&mut self, promise: Promise, awaiting: Promise) {
40+
crate::logger::debug!(event = "await_promise", ?promise, ?awaiting);
41+
self.tasklet_system.await_promise(promise, awaiting);
4342
}
4443

45-
pub fn process_promise(&mut self, promise_id: PromiseId, result: &Value, error: &Value) {
46-
crate::logger::debug!(event = "process_promise", ?promise_id, ?result, ?error);
47-
let coroutine = self.tasklet_system.get_coroutine(promise_id);
48-
match Coroutine::resume(self.as_void_ptr(), coroutine, promise_id, result, error) {
44+
pub fn process_promise(&mut self, promise: Promise, result: &Value, error: &Value) {
45+
crate::logger::debug!(event = "process_promise", ?promise, ?result, ?error);
46+
let coroutine = self.tasklet_system.get_coroutine(promise);
47+
match Coroutine::resume(self.as_void_ptr(), coroutine, promise, result, error) {
4948
CoroutineStatus::Done(result) => {
50-
self.tasklet_system.resolve_promise(promise_id, result)
49+
self.tasklet_system.resolve_promise(promise, result)
5150
}
52-
CoroutineStatus::Error(error) => self.tasklet_system.reject_promise(promise_id, error),
51+
CoroutineStatus::Error(error) => self.tasklet_system.reject_promise(promise, error),
5352
CoroutineStatus::Suspend => (),
5453
}
5554
}
5655

57-
pub fn emit_promise_resolved(&mut self, promise_id: PromiseId, result: Value) {
56+
pub fn emit_promise_resolved(&mut self, promise: Promise, result: Value) {
5857
self.tasklet_system
59-
.emit_promise_resolved(promise_id, result);
58+
.emit_promise_resolved(promise, result);
6059
}
6160
}
6261

6362
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
64-
pub struct PromiseId(NonZeroU32);
63+
pub struct Promise(u32);
6564

66-
impl From<u32> for PromiseId {
65+
impl From<u32> for Promise {
6766
fn from(value: u32) -> Self {
68-
Self(NonZeroU32::new(value).unwrap())
67+
Self(value)
6968
}
7069
}
7170

72-
impl From<PromiseId> for u32 {
73-
fn from(value: PromiseId) -> Self {
74-
value.0.get()
71+
impl From<Promise> for u32 {
72+
fn from(value: Promise) -> Self {
73+
value.0
7574
}
7675
}
7776

7877
pub struct System {
7978
messages: VecDeque<Message>,
80-
promises: FxHashMap<PromiseId, Promise>,
81-
next_promise_id: u32,
79+
promises: FxHashMap<Promise, PromiseDriver>,
80+
next_promise: u32,
8281
}
8382

8483
impl System {
8584
pub fn new() -> Self {
8685
Self {
8786
messages: Default::default(),
8887
promises: Default::default(),
89-
next_promise_id: 1,
88+
next_promise: 0,
9089
}
9190
}
9291

9392
// promises
9493

95-
fn register_promise(&mut self, coroutine: *mut Coroutine) -> PromiseId {
96-
let promise_id = PromiseId(NonZeroU32::new(self.next_promise_id).unwrap());
97-
self.promises.insert(promise_id, Promise::new(coroutine));
98-
self.next_promise_id += 1;
99-
promise_id
94+
fn register_promise(&mut self, coroutine: *mut Coroutine) -> Promise {
95+
let promise = self.new_promise();
96+
self.promises.insert(promise, PromiseDriver::new(coroutine));
97+
promise
10098
}
10199

102-
fn await_promise(&mut self, promise_id: PromiseId, awaiting: PromiseId) {
103-
debug_assert!(self.promises.contains_key(&promise_id));
100+
fn new_promise(&mut self) -> Promise {
101+
assert!(self.promises.len() < u32::MAX as usize);
102+
loop {
103+
let promise = Promise(self.next_promise);
104+
if !self.promises.contains_key(&promise) {
105+
return promise;
106+
}
107+
self.next_promise = self.next_promise.wrapping_add(1);
108+
}
109+
// never reach here
110+
}
111+
112+
fn await_promise(&mut self, promise: Promise, awaiting: Promise) {
113+
debug_assert!(self.promises.contains_key(&promise));
104114
debug_assert!(self.promises.contains_key(&awaiting));
105-
let promise = self.promises.get_mut(&promise_id).unwrap();
106-
debug_assert!(promise.awaiting.is_none());
107-
match promise.state {
108-
PromiseState::Pending => promise.awaiting = Some(awaiting),
115+
let driver = self.promises.get_mut(&promise).unwrap();
116+
debug_assert!(driver.awaiting.is_none());
117+
match driver.state {
118+
PromiseState::Pending => driver.awaiting = Some(awaiting),
109119
PromiseState::Resolved(result) => {
110120
self.emit_promise_resolved(awaiting, result);
111-
self.promises.remove(&promise_id);
121+
self.promises.remove(&promise);
112122
}
113123
PromiseState::Rejected(error) => {
114124
self.emit_promise_rejected(awaiting, error);
115-
self.promises.remove(&promise_id);
125+
self.promises.remove(&promise);
116126
}
117127
}
118128
}
119129

120-
fn get_coroutine(&self, promise_id: PromiseId) -> *mut Coroutine {
121-
self.promises.get(&promise_id).unwrap().coroutine
130+
fn get_coroutine(&self, promise: Promise) -> *mut Coroutine {
131+
self.promises.get(&promise).unwrap().coroutine
122132
}
123133

124-
fn emit_promise_resolved(&mut self, promise_id: PromiseId, result: Value) {
125-
crate::logger::debug!(event = "emit_promise_resolved", ?promise_id, ?result);
134+
fn emit_promise_resolved(&mut self, promise: Promise, result: Value) {
135+
crate::logger::debug!(event = "emit_promise_resolved", ?promise, ?result);
126136
self.messages
127-
.push_back(Message::PromiseResolved { promise_id, result });
137+
.push_back(Message::PromiseResolved { promise, result });
128138
}
129139

130-
fn emit_promise_rejected(&mut self, promise_id: PromiseId, error: Value) {
131-
crate::logger::debug!(event = "emit_promise_rejected", ?promise_id, ?error);
140+
fn emit_promise_rejected(&mut self, promise: Promise, error: Value) {
141+
crate::logger::debug!(event = "emit_promise_rejected", ?promise, ?error);
132142
self.messages
133-
.push_back(Message::PromiseRejected { promise_id, error });
143+
.push_back(Message::PromiseRejected { promise, error });
134144
}
135145

136146
fn next_msg(&mut self) -> Option<Message> {
137147
self.messages.pop_front()
138148
}
139149

140-
fn resolve_promise(&mut self, promise_id: PromiseId, result: Value) {
141-
crate::logger::debug!(event = "resolve_promise", ?promise_id, ?result);
142-
let promise = self.promises.get_mut(&promise_id).unwrap();
143-
debug_assert!(matches!(promise.state, PromiseState::Pending));
144-
if let Some(awaiting) = promise.awaiting {
145-
self.promises.remove(&promise_id);
150+
fn resolve_promise(&mut self, promise: Promise, result: Value) {
151+
crate::logger::debug!(event = "resolve_promise", ?promise, ?result);
152+
let driver = self.promises.get_mut(&promise).unwrap();
153+
debug_assert!(matches!(driver.state, PromiseState::Pending));
154+
if let Some(awaiting) = driver.awaiting {
155+
self.promises.remove(&promise);
146156
self.emit_promise_resolved(awaiting, result);
147157
} else {
148-
promise.state = PromiseState::Resolved(result);
158+
driver.state = PromiseState::Resolved(result);
149159
}
150160
}
151161

152-
fn reject_promise(&mut self, promise_id: PromiseId, error: Value) {
153-
crate::logger::debug!(event = "reject_promise", ?promise_id, ?error);
154-
let promise = self.promises.get_mut(&promise_id).unwrap();
155-
debug_assert!(matches!(promise.state, PromiseState::Pending));
156-
if let Some(awaiting) = promise.awaiting {
157-
self.promises.remove(&promise_id);
162+
fn reject_promise(&mut self, promise: Promise, error: Value) {
163+
crate::logger::debug!(event = "reject_promise", ?promise, ?error);
164+
let driver = self.promises.get_mut(&promise).unwrap();
165+
debug_assert!(matches!(driver.state, PromiseState::Pending));
166+
if let Some(awaiting) = driver.awaiting {
167+
self.promises.remove(&promise);
158168
self.emit_promise_rejected(awaiting, error);
159169
} else {
160-
promise.state = PromiseState::Rejected(error);
170+
driver.state = PromiseState::Rejected(error);
161171
}
162172
}
163173
}
@@ -167,26 +177,26 @@ impl System {
167177
#[derive(Debug)]
168178
enum Message {
169179
PromiseResolved {
170-
promise_id: PromiseId,
180+
promise: Promise,
171181
result: Value,
172182
},
173183
PromiseRejected {
174-
promise_id: PromiseId,
184+
promise: Promise,
175185
error: Value,
176186
},
177187
}
178188

179189
// promise
180190

181191
// TODO: should the coroutine be separated from the promise?
182-
struct Promise {
192+
struct PromiseDriver {
183193
// TODO(issue#237): GcCellRef
184194
coroutine: *mut Coroutine,
185-
awaiting: Option<PromiseId>,
195+
awaiting: Option<Promise>,
186196
state: PromiseState,
187197
}
188198

189-
impl Promise {
199+
impl PromiseDriver {
190200
fn new(coroutine: *mut Coroutine) -> Self {
191201
Self {
192202
coroutine,

0 commit comments

Comments
 (0)