Skip to content

Commit c8c936c

Browse files
remove SharedValue (#322)
1 parent 39864b2 commit c8c936c

File tree

6 files changed

+45
-129
lines changed

6 files changed

+45
-129
lines changed

src/iter.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::mapref::multiple::{RefMulti, RefMutMulti};
22
use crate::lock::{RwLockReadGuard, RwLockWriteGuard};
33
use crate::t::Map;
4-
use crate::util::SharedValue;
54
use crate::{DashMap, HashMap};
65
use core::hash::{BuildHasher, Hash};
76
use core::mem;
@@ -38,7 +37,7 @@ impl<K: Eq + Hash, V, S: BuildHasher + Clone> OwningIter<K, V, S> {
3837
}
3938
}
4039

41-
type GuardOwningIter<K, V> = hashbrown::raw::RawIntoIter<(K, SharedValue<V>)>;
40+
type GuardOwningIter<K, V> = hashbrown::raw::RawIntoIter<(K, V)>;
4241

4342
impl<K: Eq + Hash, V, S: BuildHasher + Clone> Iterator for OwningIter<K, V, S> {
4443
type Item = (K, V);
@@ -47,15 +46,14 @@ impl<K: Eq + Hash, V, S: BuildHasher + Clone> Iterator for OwningIter<K, V, S> {
4746
loop {
4847
if let Some(current) = self.current.as_mut() {
4948
if let Some((k, v)) = current.next() {
50-
return Some((k, v.into_inner()));
49+
return Some((k, v));
5150
}
5251
}
5352

5453
if self.shard_i == self.map._shard_count() {
5554
return None;
5655
}
5756

58-
//let guard = unsafe { self.map._yield_read_shard(self.shard_i) };
5957
let mut shard_wl = unsafe { self.map._yield_write_shard(self.shard_i) };
6058

6159
let map = mem::take(&mut *shard_wl);
@@ -64,7 +62,6 @@ impl<K: Eq + Hash, V, S: BuildHasher + Clone> Iterator for OwningIter<K, V, S> {
6462

6563
let iter = map.into_iter();
6664

67-
//unsafe { ptr::write(&mut self.current, Some((arcee, iter))); }
6865
self.current = Some(iter);
6966

7067
self.shard_i += 1;
@@ -90,12 +87,12 @@ where
9087

9188
type GuardIter<'a, K, V> = (
9289
Arc<RwLockReadGuard<'a, HashMap<K, V>>>,
93-
hashbrown::raw::RawIter<(K, SharedValue<V>)>,
90+
hashbrown::raw::RawIter<(K, V)>,
9491
);
9592

9693
type GuardIterMut<'a, K, V> = (
9794
Arc<RwLockWriteGuard<'a, HashMap<K, V>>>,
98-
hashbrown::raw::RawIter<(K, SharedValue<V>)>,
95+
hashbrown::raw::RawIter<(K, V)>,
9996
);
10097

10198
/// Iterator over a DashMap yielding immutable references.
@@ -163,7 +160,7 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>> Iter
163160
return unsafe {
164161
let (k, v) = b.as_ref();
165162
let guard = current.0.clone();
166-
Some(RefMulti::new(guard, k, v.get()))
163+
Some(RefMulti::new(guard, k, v))
167164
};
168165
}
169166
}
@@ -245,7 +242,7 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>> Iter
245242
return unsafe {
246243
let (k, v) = b.as_mut();
247244
let guard = current.0.clone();
248-
Some(RefMutMulti::new(guard, k, v.get_mut()))
245+
Some(RefMutMulti::new(guard, k, v))
249246
};
250247
}
251248
}

src/lib.rs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,7 @@ use std::collections::hash_map::RandomState;
4646
pub use t::Map;
4747
use try_result::TryResult;
4848

49-
cfg_if! {
50-
if #[cfg(feature = "raw-api")] {
51-
pub use util::SharedValue;
52-
} else {
53-
use util::SharedValue;
54-
}
55-
}
56-
57-
pub(crate) type HashMap<K, V> = hashbrown::raw::RawTable<(K, SharedValue<V>)>;
49+
pub(crate) type HashMap<K, V> = hashbrown::raw::RawTable<(K, V)>;
5850

5951
// Temporary reimplementation of [`std::collections::TryReserveError`]
6052
// util [`std::collections::TryReserveError`] stabilises.
@@ -331,18 +323,17 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
331323
///
332324
/// ```
333325
/// use dashmap::DashMap;
334-
/// use dashmap::SharedValue;
335326
/// use std::hash::{Hash, Hasher, BuildHasher};
336327
///
337328
/// let mut map = DashMap::<i32, &'static str>::new();
338329
/// let shard_ind = map.determine_map(&42);
339330
/// let mut factory = map.hasher().clone();
340-
/// let hasher = |tuple: &(i32, SharedValue<&'static str>)| {
331+
/// let hasher = |tuple: &(i32, &'static str)| {
341332
/// let mut hasher = factory.build_hasher();
342333
/// tuple.0.hash(&mut hasher);
343334
/// hasher.finish()
344335
/// };
345-
/// let data = (42, SharedValue::new("forty two"));
336+
/// let data = (42, "forty two");
346337
/// let hash = hasher(&data);
347338
/// map.shards_mut()[shard_ind].get_mut().insert(hash, data, hasher);
348339
/// assert_eq!(*map.get(&42).unwrap(), "forty two");
@@ -965,7 +956,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
965956

966957
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
967958
let ((k, v), _) = unsafe { shard.remove(bucket) };
968-
Some((k, v.into_inner()))
959+
Some((k, v))
969960
} else {
970961
None
971962
}
@@ -984,9 +975,9 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
984975

985976
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
986977
let (k, v) = unsafe { bucket.as_ref() };
987-
if f(k, v.get()) {
978+
if f(k, v) {
988979
let ((k, v), _) = unsafe { shard.remove(bucket) };
989-
Some((k, v.into_inner()))
980+
Some((k, v))
990981
} else {
991982
None
992983
}
@@ -1008,9 +999,9 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1008999

10091000
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
10101001
let (k, v) = unsafe { bucket.as_mut() };
1011-
if f(k, v.get_mut()) {
1002+
if f(k, v) {
10121003
let ((k, v), _) = unsafe { shard.remove(bucket) };
1013-
Some((k, v.into_inner()))
1004+
Some((k, v))
10141005
} else {
10151006
None
10161007
}
@@ -1041,7 +1032,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
10411032
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
10421033
unsafe {
10431034
let (k, v) = bucket.as_ref();
1044-
Some(Ref::new(shard, k, v.as_ptr()))
1035+
Some(Ref::new(shard, k, v))
10451036
}
10461037
} else {
10471038
None
@@ -1061,8 +1052,8 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
10611052

10621053
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
10631054
unsafe {
1064-
let (k, v) = bucket.as_ref();
1065-
Some(RefMut::new(shard, k, v.as_ptr()))
1055+
let (k, v) = bucket.as_mut();
1056+
Some(RefMut::new(shard, k, v))
10661057
}
10671058
} else {
10681059
None
@@ -1086,7 +1077,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
10861077
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
10871078
unsafe {
10881079
let (k, v) = bucket.as_ref();
1089-
TryResult::Present(Ref::new(shard, k, v.as_ptr()))
1080+
TryResult::Present(Ref::new(shard, k, v))
10901081
}
10911082
} else {
10921083
TryResult::Absent
@@ -1109,8 +1100,8 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
11091100

11101101
if let Some(bucket) = shard.find(hash, |(k, _v)| key == k.borrow()) {
11111102
unsafe {
1112-
let (k, v) = bucket.as_ref();
1113-
TryResult::Present(RefMut::new(shard, k, v.as_ptr()))
1103+
let (k, v) = bucket.as_mut();
1104+
TryResult::Present(RefMut::new(shard, k, v))
11141105
}
11151106
} else {
11161107
TryResult::Absent
@@ -1136,7 +1127,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
11361127
// Here we only use `iter` as a temporary, preventing use-after-free
11371128
for bucket in shard.iter() {
11381129
let (k, v) = bucket.as_mut();
1139-
if !f(&*k, v.get_mut()) {
1130+
if !f(&*k, v) {
11401131
shard.erase(bucket);
11411132
}
11421133
}
@@ -1362,7 +1353,7 @@ where
13621353
let entry_size_iter = iter.map(|bucket| {
13631354
// Safety: The iterator returns buckets with valid pointers to entries
13641355
let (key, value) = unsafe { bucket.as_ref() };
1365-
key.extra_size() + value.get().extra_size()
1356+
key.extra_size() + value.extra_size()
13661357
});
13671358

13681359
core::mem::size_of::<CachePadded<RwLock<HashMap<K, V>>>>()

src/mapref/entry.rs

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::one::RefMut;
22
use crate::lock::RwLockWriteGuard;
3-
use crate::util::SharedValue;
43
use crate::HashMap;
54
use core::hash::Hash;
65
use core::mem;
@@ -138,15 +137,13 @@ impl<'a, K: Eq + Hash, V> VacantEntry<'a, K, V> {
138137

139138
pub fn insert(mut self, value: V) -> RefMut<'a, K, V> {
140139
unsafe {
141-
let occupied = self.shard.insert_in_slot(
142-
self.hash,
143-
self.slot,
144-
(self.key, SharedValue::new(value)),
145-
);
140+
let occupied = self
141+
.shard
142+
.insert_in_slot(self.hash, self.slot, (self.key, value));
146143

147-
let (k, v) = occupied.as_ref();
144+
let (k, v) = occupied.as_mut();
148145

149-
RefMut::new(self.shard, k, v.as_ptr())
146+
RefMut::new(self.shard, k, v)
150147
}
151148
}
152149

@@ -156,11 +153,9 @@ impl<'a, K: Eq + Hash, V> VacantEntry<'a, K, V> {
156153
K: Clone,
157154
{
158155
unsafe {
159-
let bucket = self.shard.insert_in_slot(
160-
self.hash,
161-
self.slot,
162-
(self.key.clone(), SharedValue::new(value)),
163-
);
156+
let bucket = self
157+
.shard
158+
.insert_in_slot(self.hash, self.slot, (self.key.clone(), value));
164159

165160
OccupiedEntry::new(self.shard, self.key, bucket)
166161
}
@@ -177,7 +172,7 @@ impl<'a, K: Eq + Hash, V> VacantEntry<'a, K, V> {
177172

178173
pub struct OccupiedEntry<'a, K, V> {
179174
shard: RwLockWriteGuard<'a, HashMap<K, V>>,
180-
bucket: hashbrown::raw::Bucket<(K, SharedValue<V>)>,
175+
bucket: hashbrown::raw::Bucket<(K, V)>,
181176
key: K,
182177
}
183178

@@ -188,17 +183,17 @@ impl<'a, K: Eq + Hash, V> OccupiedEntry<'a, K, V> {
188183
pub(crate) unsafe fn new(
189184
shard: RwLockWriteGuard<'a, HashMap<K, V>>,
190185
key: K,
191-
bucket: hashbrown::raw::Bucket<(K, SharedValue<V>)>,
186+
bucket: hashbrown::raw::Bucket<(K, V)>,
192187
) -> Self {
193188
Self { shard, bucket, key }
194189
}
195190

196191
pub fn get(&self) -> &V {
197-
unsafe { self.bucket.as_ref().1.get() }
192+
unsafe { &self.bucket.as_ref().1 }
198193
}
199194

200195
pub fn get_mut(&mut self) -> &mut V {
201-
unsafe { self.bucket.as_mut().1.get_mut() }
196+
unsafe { &mut self.bucket.as_mut().1 }
202197
}
203198

204199
pub fn insert(&mut self, value: V) -> V {
@@ -207,8 +202,8 @@ impl<'a, K: Eq + Hash, V> OccupiedEntry<'a, K, V> {
207202

208203
pub fn into_ref(self) -> RefMut<'a, K, V> {
209204
unsafe {
210-
let (k, v) = self.bucket.as_ref();
211-
RefMut::new(self.shard, k, v.as_ptr())
205+
let (k, v) = self.bucket.as_mut();
206+
RefMut::new(self.shard, k, v)
212207
}
213208
}
214209

@@ -222,20 +217,17 @@ impl<'a, K: Eq + Hash, V> OccupiedEntry<'a, K, V> {
222217

223218
pub fn remove(mut self) -> V {
224219
let ((_k, v), _) = unsafe { self.shard.remove(self.bucket) };
225-
v.into_inner()
220+
v
226221
}
227222

228223
pub fn remove_entry(mut self) -> (K, V) {
229224
let ((k, v), _) = unsafe { self.shard.remove(self.bucket) };
230-
(k, v.into_inner())
225+
(k, v)
231226
}
232227

233228
pub fn replace_entry(self, value: V) -> (K, V) {
234-
let (k, v) = mem::replace(
235-
unsafe { self.bucket.as_mut() },
236-
(self.key, SharedValue::new(value)),
237-
);
238-
(k, v.into_inner())
229+
let (k, v) = mem::replace(unsafe { self.bucket.as_mut() }, (self.key, value));
230+
(k, v)
239231
}
240232
}
241233

src/rayon/map.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,7 @@ where
9595
{
9696
Vec::from(self.shards)
9797
.into_par_iter()
98-
.flat_map_iter(|shard| {
99-
shard
100-
.into_inner()
101-
.into_inner()
102-
.into_iter()
103-
.map(|(k, v)| (k, v.into_inner()))
104-
})
98+
.flat_map_iter(|shard| shard.into_inner().into_inner().into_iter())
10599
.drive_unindexed(consumer)
106100
}
107101
}
@@ -145,7 +139,7 @@ where
145139
guard.iter().map(move |b| {
146140
let guard = Arc::clone(&guard);
147141
let (k, v) = b.as_ref();
148-
RefMulti::new(guard, k, v.get())
142+
RefMulti::new(guard, k, v)
149143
})
150144
})
151145
.drive_unindexed(consumer)
@@ -203,7 +197,7 @@ where
203197
guard.iter().map(move |b| {
204198
let guard = Arc::clone(&guard);
205199
let (k, v) = b.as_mut();
206-
RefMutMulti::new(guard, k, v.get_mut())
200+
RefMutMulti::new(guard, k, v)
207201
})
208202
})
209203
.drive_unindexed(consumer)

src/read_only.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> ReadOnlyView<K, V, S>
8888

8989
shard.find(hash, |(k, _v)| key == k.borrow()).map(|b| {
9090
let (k, v) = unsafe { b.as_ref() };
91-
(k, v.get())
91+
(k, v)
9292
})
9393
}
9494

@@ -100,7 +100,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> ReadOnlyView<K, V, S>
100100
.flat_map(|shard| shard.iter())
101101
.map(|b| {
102102
let (k, v) = b.as_ref();
103-
(k, v.get())
103+
(k, v)
104104
})
105105
}
106106
}

0 commit comments

Comments
 (0)