Skip to content

Commit de64fd9

Browse files
committed
Refactor Condvar.
1 parent 6686577 commit de64fd9

File tree

2 files changed

+35
-32
lines changed

2 files changed

+35
-32
lines changed

library/std/src/sys/unix/condvar.rs

-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ impl Condvar {
3030
target_os = "ios",
3131
target_os = "l4re",
3232
target_os = "android",
33-
target_os = "freertos",
3433
target_os = "redox"
3534
))]
3635
pub unsafe fn init(&mut self) {}
@@ -40,7 +39,6 @@ impl Condvar {
4039
target_os = "ios",
4140
target_os = "l4re",
4241
target_os = "android",
43-
target_os = "freertos",
4442
target_os = "redox"
4543
)))]
4644
pub unsafe fn init(&mut self) {

library/std/src/sys/unix/freertos/condvar.rs

+35-30
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,27 @@ unsafe impl Sync for Condvar {}
1717

1818
impl Condvar {
1919
pub const fn new() -> Condvar {
20-
// Might be moved and address is changing it is better to avoid
21-
// initialization of potentially opaque OS data before it landed
2220
Condvar {
2321
lock: unsafe { ReentrantMutex::uninitialized() },
2422
waiter_list: UnsafeCell::new(None),
2523
}
2624
}
2725

2826
#[inline]
29-
pub unsafe fn init(&mut self) {}
30-
31-
#[inline]
32-
unsafe fn init_waiter_list(&self) {
33-
if (*self.waiter_list.get()).is_none() {
34-
(*self.waiter_list.get()) = Some(VecDeque::new());
35-
}
27+
pub unsafe fn init(&mut self) {
28+
self.waiter_list.get_mut().replace(VecDeque::new());
3629
}
3730

3831
#[inline]
3932
pub unsafe fn notify_one(&self) {
4033
self.lock.lock();
4134

42-
self.init_waiter_list();
43-
let waiter_list = (&*self.waiter_list.get()).as_ref().unwrap();
44-
if let Some(&waiter) = waiter_list.front() {
45-
xSemaphoreGive(waiter);
35+
if let Some(waiter_list) = (&*self.waiter_list.get()).as_ref() {
36+
if let Some(&waiter) = waiter_list.front() {
37+
xSemaphoreGive(waiter);
38+
}
39+
} else {
40+
core::hint::unreachable_unchecked();
4641
}
4742

4843
self.lock.unlock();
@@ -52,10 +47,12 @@ impl Condvar {
5247
pub unsafe fn notify_all(&self) {
5348
self.lock.lock();
5449

55-
self.init_waiter_list();
56-
let waiter_list = (&*self.waiter_list.get()).as_ref().unwrap();
57-
for &waiter in waiter_list {
58-
xSemaphoreGive(waiter);
50+
if let Some(waiter_list) = (&*self.waiter_list.get()).as_ref() {
51+
for &waiter in waiter_list {
52+
xSemaphoreGive(waiter);
53+
}
54+
} else {
55+
core::hint::unreachable_unchecked();
5956
}
6057

6158
self.lock.unlock();
@@ -88,9 +85,11 @@ impl Condvar {
8885

8986
self.lock.lock();
9087

91-
self.init_waiter_list();
92-
let waiter_list = (&mut *self.waiter_list.get()).as_mut().unwrap();
93-
waiter_list.push_back(waiter);
88+
if let Some(waiter_list) = (&mut *self.waiter_list.get()).as_mut() {
89+
waiter_list.push_back(waiter);
90+
} else {
91+
core::hint::unreachable_unchecked();
92+
}
9493

9594
self.lock.unlock();
9695

@@ -104,18 +103,19 @@ impl Condvar {
104103

105104
self.lock.lock();
106105

107-
let waiter_list = (&mut *self.waiter_list.get()).as_mut().unwrap();
108-
let deleted_waiter = if let Some(index) = waiter_list.iter().position(|&w| w == waiter) {
109-
waiter_list.remove(index)
106+
if let Some(waiter_list) = (&mut *self.waiter_list.get()).as_mut() {
107+
if let Some(index) = waiter_list.iter().position(|&w| w == waiter) {
108+
waiter_list.remove(index);
109+
} else {
110+
core::hint::unreachable_unchecked();
111+
}
110112
} else {
111-
None
112-
};
113+
core::hint::unreachable_unchecked();
114+
}
113115

114116
self.lock.unlock();
115117

116-
if let Some(deleted_waiter) = deleted_waiter {
117-
vSemaphoreDelete(deleted_waiter);
118-
}
118+
vSemaphoreDelete(waiter);
119119

120120
mutex.lock();
121121

@@ -128,12 +128,17 @@ impl Condvar {
128128

129129
#[inline]
130130
pub unsafe fn destroy(&self) {
131+
#[cfg(debug)]
132+
{
131133
self.lock.lock();
132134

133-
if let Some(waiter_list) = (&*self.waiter_list.get()).as_ref() {
134-
assert!(waiter_list.is_empty());
135+
if let Some(waiter_list) = (&*self.waiter_list.get()).as_mut() {
136+
debug_assert!(waiter_list.is_empty());
137+
} else {
138+
core::hint::unreachable_unchecked();
135139
}
136140

137141
self.lock.unlock();
142+
}
138143
}
139144
}

0 commit comments

Comments
 (0)