Skip to content

Commit 720f545

Browse files
christollidaymeta-codesync[bot]
authored andcommitted
Implement Pagable for some leaf types
Summary: Implement/derive pagable for some external types and simple types that buck2 types depend on. Reviewed By: cjhopman Differential Revision: D89434554 fbshipit-source-id: 4c2991e46cd790bb9d8ba63020021c41085da47a
1 parent ce4465a commit 720f545

File tree

17 files changed

+287
-8
lines changed

17 files changed

+287
-8
lines changed

Cargo.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
members = [
33
"allocative/allocative",
44
"allocative/allocative_derive",
5+
"gazebo/gazebo",
56
"gazebo/display_container",
67
"gazebo/dupe",
78
"gazebo/strong_hash",
89
"gazebo/strong_hash_derive",
10+
"pagable",
11+
"pagable_derive",
912
"starlark",
1013
"starlark_bin",
1114
"starlark_derive",
@@ -26,6 +29,7 @@ allocative_derive = { version = "0.3.3", path = "allocative/allocative_derive" }
2629
cmp_any = { version = "0.8.1", path = "gazebo/cmp_any" }
2730
display_container = { version = "0.9.0", path = "gazebo/display_container" }
2831
dupe = { version = "0.9.1", path = "gazebo/dupe" }
32+
gazebo = { path = "gazebo/gazebo" }
2933
strong_hash = { path = "gazebo/strong_hash" }
3034
strong_hash_derive = { path = "gazebo/strong_hash_derive" }
3135

@@ -44,4 +48,20 @@ memchr = "2.4.1"
4448
proc-macro2 = "1.0"
4549
quote = "1.0.3"
4650
ref-cast = "1.0.0"
51+
relative-path = { version = "1.7.0", features = ["serde"] }
4752
syn = "2"
53+
54+
pagable = { path = "pagable" }
55+
pagable_derive = { path = "pagable_derive" }
56+
# dependencies of pagable
57+
async-trait = "0.1.24"
58+
blake3 = { version = "1.3.1", features = ["default", "rayon", "std", "traits-preview"] }
59+
bytemuck = { version = "1.24", features = ["const_zeroed", "derive", "min_const_generics", "must_cast", "nightly_stdsimd"] }
60+
parking_lot = { version = "0.11.2", features = ["send_guard"] }
61+
postcard = { version = "1.0.8", features = ["use-crc", "use-std"] }
62+
serde = { version = "1.0", features = ["derive", "rc"] }
63+
serde_json = { version = "1.0.48", features = ["raw_value"] }
64+
static_assertions = "1.1.0"
65+
take_mut = "0.2.2"
66+
tokio = { version = "1.25.0", features = ["full", "test-util", "tracing"] }
67+
triomphe = "0.1.11"

pagable/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ bytemuck = { workspace = true }
1414
dupe = { workspace = true }
1515
either = { workspace = true }
1616
gazebo = { workspace = true }
17-
pagable_derive = { workspace = true }
17+
pagable_derive = { path = "../pagable_derive" }
1818
parking_lot = { workspace = true }
1919
postcard = { workspace = true }
20+
relative-path = { workspace = true }
2021
serde = { workspace = true }
2122
serde_json = { workspace = true }
2223
static_assertions = { workspace = true }

pagable/src/impls.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,28 @@ mod collections;
1313
mod serde;
1414
mod std;
1515
mod tuples;
16+
17+
use relative_path::RelativePathBuf;
18+
19+
use crate::__internal::serde::Deserialize;
20+
use crate::__internal::serde::Serializer;
21+
use crate::PagableDeserialize;
22+
use crate::PagableDeserializer;
23+
use crate::PagableSerialize;
24+
use crate::PagableSerializer;
25+
26+
impl PagableSerialize for RelativePathBuf {
27+
fn pagable_serialize<S: PagableSerializer>(&self, serializer: &mut S) -> crate::Result<()> {
28+
Ok(serializer.serde().serialize_str(self.as_str())?)
29+
}
30+
}
31+
32+
impl<'de> PagableDeserialize<'de> for RelativePathBuf {
33+
fn pagable_deserialize<D: PagableDeserializer<'de>>(
34+
deserializer: &mut D,
35+
) -> crate::Result<Self> {
36+
Ok(RelativePathBuf::from(String::deserialize(
37+
deserializer.serde(),
38+
)?))
39+
}
40+
}

pagable/src/impls/std.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
* above-listed licenses.
99
*/
1010

11+
use core::sync::atomic::AtomicI64;
12+
1113
use ::serde::Deserialize;
1214
use ::serde::ser::Serialize;
1315

@@ -114,3 +116,21 @@ impl<'de, T: PagableDeserialize<'de>> PagableDeserialize<'de> for Box<[T]> {
114116
Ok(v.into_boxed_slice())
115117
}
116118
}
119+
120+
impl PagableSerialize for AtomicI64 {
121+
fn pagable_serialize<S: PagableSerializer>(&self, serializer: &mut S) -> crate::Result<()> {
122+
Ok(i64::serialize(
123+
&self.load(core::sync::atomic::Ordering::Relaxed),
124+
serializer.serde(),
125+
)?)
126+
}
127+
}
128+
129+
impl<'de> PagableDeserialize<'de> for AtomicI64 {
130+
fn pagable_deserialize<D: PagableDeserializer<'de>>(
131+
deserializer: &mut D,
132+
) -> crate::Result<Self> {
133+
let val = i64::deserialize(deserializer.serde())?;
134+
Ok(AtomicI64::new(val))
135+
}
136+
}

pagable/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
//! Implementations can use the derive macros `#[derive(Pagable)]` (which will derive both serialize and deserialize), `#[derive(PagableSerialize)]`,
1919
//! and `#[derive(PagableDeserialize)]` for automatic implementations.
2020
21-
#![feature(const_type_name)]
22-
2321
pub use pagable_arc::PagableArc;
2422
pub use pagable_arc::PinnedPagableArc;
2523
pub use pagable_arc::PinnedPagableArcBorrow;

starlark_map/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ name = "starlark_map"
1010
repository = "https://github.com/facebook/starlark-rust"
1111
version = "0.13.0"
1212

13+
[features]
14+
default = []
15+
pagable = ["dep:pagable", "dep:pagable_derive"]
16+
1317
[dependencies]
1418
allocative = { workspace = true, features = ["hashbrown"] }
1519
dupe = { workspace = true }
@@ -18,6 +22,9 @@ equivalent = { workspace = true }
1822
fxhash = "0.2.1"
1923
hashbrown = { version = "0.14.3", features = ["raw"] }
2024
serde = { version = "1.0", features = ["derive"] }
25+
26+
pagable = { workspace = true, optional = true }
27+
pagable_derive = { workspace = true, optional = true }
2128
strong_hash = { workspace = true }
2229

2330
[dev-dependencies]

starlark_map/src/hash_value.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,28 @@ use std::hash::Hash;
2020

2121
use allocative::Allocative;
2222
use dupe::Dupe;
23+
#[cfg(feature = "pagable")]
24+
use pagable::Pagable;
25+
use serde::Deserialize;
26+
use serde::Serialize;
2327

2428
use crate::hasher::StarlarkHasher;
2529
use crate::mix_u32::mix_u32;
2630

2731
/// A hash value.
28-
#[derive(Clone, Copy, Dupe, PartialEq, Eq, Hash, Debug, Allocative)]
32+
#[derive(
33+
Clone,
34+
Copy,
35+
Dupe,
36+
PartialEq,
37+
Eq,
38+
Hash,
39+
Debug,
40+
Allocative,
41+
Serialize,
42+
Deserialize
43+
)]
44+
#[cfg_attr(feature = "pagable", derive(Pagable))]
2945
pub struct StarlarkHashValue(u32);
3046

3147
impl StarlarkHashValue {

starlark_map/src/hashed.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,28 @@ use std::ops::Deref;
2424
use allocative::Allocative;
2525
use dupe::Dupe;
2626
use equivalent::Equivalent;
27+
#[cfg(feature = "pagable")]
28+
use pagable::Pagable;
29+
use serde::Deserialize;
30+
use serde::Serialize;
2731
use strong_hash::StrongHash;
2832

2933
use crate::hash_value::StarlarkHashValue;
3034

3135
/// A key and its hash.
32-
#[derive(PartialEq, Eq, Debug, Clone, Copy, Dupe, Allocative)]
36+
#[derive(
37+
PartialEq,
38+
Eq,
39+
Debug,
40+
Clone,
41+
Copy,
42+
Dupe,
43+
Allocative,
44+
Serialize,
45+
Deserialize
46+
)]
47+
#[cfg_attr(feature = "pagable", derive(Pagable))]
48+
#[cfg_attr(feature = "pagable", pagable(bound = "K: Pagable + 'static"))]
3349
pub struct Hashed<K> {
3450
hash: StarlarkHashValue,
3551
key: K,

starlark_map/src/ordered_map.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ use std::cmp::Ordering;
2121
use std::hash::Hash;
2222

2323
use allocative::Allocative;
24+
#[cfg(feature = "pagable")]
25+
use pagable::Pagable;
2426
use serde::Deserialize;
2527
use serde::Serialize;
2628
use strong_hash::StrongHash;
@@ -31,6 +33,7 @@ use crate::small_map::SmallMap;
3133

3234
/// Wrapper for `SmallMap` which considers map equal if iteration order is equal.
3335
#[derive(Debug, Clone, Allocative)]
36+
#[cfg_attr(feature = "pagable", derive(Pagable))]
3437
pub struct OrderedMap<K, V>(SmallMap<K, V>);
3538

3639
impl<K, V> OrderedMap<K, V> {

starlark_map/src/ordered_set.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,20 @@ use std::cmp::Ordering;
2121
use std::hash::Hash;
2222

2323
use allocative::Allocative;
24+
#[cfg(feature = "pagable")]
25+
use pagable::Pagable;
26+
use serde::Deserialize;
27+
use serde::Serialize;
2428

2529
use crate::Equivalent;
2630
use crate::Hashed;
2731
use crate::small_set;
2832
use crate::small_set::SmallSet;
2933

3034
/// `SmallSet` wrapper, but equality and hash of self depends on iteration order.
31-
#[derive(Debug, Clone, Allocative)]
35+
#[derive(Debug, Clone, Allocative, Serialize, Deserialize)]
36+
#[cfg_attr(feature = "pagable", derive(Pagable))]
37+
#[serde(bound(deserialize = "T: Deserialize<'de> + Hash + Eq"))]
3238
pub struct OrderedSet<T>(SmallSet<T>);
3339

3440
/// Error returned by `try_insert`.

0 commit comments

Comments
 (0)