Skip to content

Conversation

@pdillinger
Copy link
Contributor

Summary:
LifoSem is an existing synchronization data structure that bit-packs several logical data fields into a single atomic variable. This is a great example to convert over to use the new bit field atomic APIs because it shows the capabilities of the new APIs to minimize fragile boilerplate and maintenance complexity, and to make intention more clear from the code itself.

This data structure uses one performance optimization hack that I was not able to replicate with the bit field atomic abstractions while preserving original performance. So in this case (Ugly-but-optimized) I preserve the hack by dipping into the underlying atomic (with some guardrails against breaking changes elsewhere).

Note that this structure does use seq_cst memory order implicitly in some places that surely could be acq_rel, but I'm leaving that alone in this change.

Differential Revision: D88903968

Summary:

Inspired by work in RocksDB for HyperClockCache and parallel compression revamp, this change includes
* BitFields.h - An API for declaring encapsulated bit field types with guaranteed layout, variant layout capability, and multi-field update capability
* BitFieldsAtomic.h - Provides an extension of AtomicStruct for bit fields types, adding capability for non-CAS atomic updates to multiple fields (when possible).

Together these lower the barriers to entry and maintenance hurdles associated with bit-packing atomic data in data structures and algorithms. Bit-packing data into atomics not only increases the scope of problems that can be solved with lock-free or low-locking usage of atomics, it can greatly simplify the algorithmic complexity. Packing more data fields into a single atomic means fewer overheads and hazards associated with interleaved updates to separate fields. In other words, with lean design and sufficient foresight, bit-packed atomic solutions can often be simpler *and* more efficient than solutions involving more atomics or synchronization primitives.

Also see follow-up diff D88903968 that refactors existing structure LifoSem to use this new API.

Differential Revision: D88903954
Summary:
LifoSem is an existing synchronization data structure that bit-packs several logical data fields into a single atomic variable. This is a great example to convert over to use the new bit field atomic APIs because it shows the capabilities of the new APIs to minimize fragile boilerplate and maintenance complexity, and to make intention more clear from the code itself.

This data structure uses one performance optimization hack that I was not able to replicate with the bit field atomic abstractions while preserving original performance. So in this case (`Ugly-but-optimized`) I preserve the hack by dipping into the underlying atomic (with some guardrails against breaking changes elsewhere).

Note that this structure does use seq_cst memory order implicitly in some places that surely could be acq_rel, but I'm leaving that alone in this change.

Differential Revision: D88903968
@meta-cla meta-cla bot added the CLA Signed label Dec 31, 2025
@meta-codesync
Copy link

meta-codesync bot commented Dec 31, 2025

@pdillinger has exported this pull request. If you are a Meta employee, you can view the originating Diff in D88903968.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant