Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement an algorithm to make this crate no_std, take 3 #34

Merged
merged 14 commits into from
Nov 11, 2022
Merged

Conversation

notgull
Copy link
Member

@notgull notgull commented Nov 5, 2022

This PR supersedes #33 and aims to improve on its strategy using a hybrid between its strategy and the strategy that's currently used. Basically, it keeps the master strategy, but replaces the Mutex with another implementation based on the event queue in #33.

To clarify, the current strategy used on the master branch is to use the std::sync::Mutex type to wrap a !Sync linked list built using the Cell type. At its core, event-listener is just a queue of wakers that we wake up whenever we notify the event. On modern operating systems, this is very fast. Mutexes are implemented using futexes, meaning that in the case of no contention there are, at most, two atomic operations involved. One to lock the mutex, and one to unlock. The main disadvantage of this approach is that the Mutex requires libstd to be linked, which forces the library (and anything that depends on it) to not be no_std. One of my goals is to be able to use smol on embedded systems without needed to resort to embassy, an RTOS or something similar. While async-io, blocking and their dependents are not usable on these platforms, it would be nice to at least have an async toolkit for mutexes, et al.

My strategy for #30 and #33 was to reimplement event-listener by replacing this list with a fully atomic list. In #30, I used the concurrent-queue crate to implement the listener queue, and in #33 I used a homegrown singly atomic linked list implementation. The main advantage of these implementations is that they are completely lock-free. Although I didn't test for this, I imagine that in both of these implementations, worst-case contention would be reduced significantly. In addition, since they only used atomics and not locks, they were available on no_std platforms. In fact, by taking advantage of portable-atomic, it could even run on platforms without atomic support.

The primary disadvantage of these approaches was speed. #30 exhibited a slowdown of up to 50%, which was completely unacceptable. Even through certain optimizations, I couldn't get it to break 30%. #33 did better; at best, it only exhibited a 15% slowdown. Still, it's imposing a 15% performance tax on all users, including the admittedly larger pool of use cases that would only ever use libstd. The ideal solution would be to not incur any performance issues over the current system.

A theoretically ideal solution would be to replace the Mutex with a spinlock. It's unlikely to occur much contention anyways, so in the ideal case (and, arguably, the overwhelming majority of usecases) it would be identical to the current system while also being no_std. However, spinlocks are dangerous, and a non-starter anyways.

This solution began with the idea that we could use this theoretical spinlock in the best case and then fall back to the listener queue case when there's too much contention. This "hybrid" approach would allow us to utilize the performance gains of the spinlock while also being able to fall back onto the queue for the worst cases. While this approach is difficult to directly implement in Rust, I've created a modified version of this approach that should be able to emulate it well enough.

This new implementation is based on the idea that, in the ideal use case, the inner Mutex should never be contended. The Mutex in the Event structure is replaced with an optimistic spinlock. In the best case, the crate functions much like it does today It will try to lock the mutex, and if it does, performs the desired operation (e.g. inserting into the listener list, notifying an entry, etc.). However, if the mutex is locked, it pushes a node representing the desired operation onto the backup queue. The operations that can be performed are as follows:

  • Push a listener into the list.
  • Notify listeners.
  • Remove a listener from the list, and optionally propagate its notification if it has one.
  • Wake a waker. There are some operations that I cannot effectively emulate with this system, so the waker just waits for the mutex to be available.

Once whoever holds the mutex lock is about to unlock it, they check this backup queue. If there are any operations, they are popped off of the queue and ran.

There is definitely room for improvement in this system, but speed-wise, I've accomplished my goal. From benchmarks, it's at least on par with the master implementation, and even seems to be faster in certain cases.

Future work would involve making the spinlock fair, as well as implementing portable_atomic and loom features.

Things I need to do before marking this PR as ready to review:

  • Determine semantics.
  • The new event queue needs more testing.
  • Clean up code overall.
  • MIRI is failing, determine why. MIRI seems to be deadlocking? I'm not sure why, maybe it's a MIRI bug? With the new queue implementation this issue appears to have vanished.

@notgull
Copy link
Member Author

notgull commented Nov 6, 2022

MIRI is deadlocking for some reason? I can't tell if it's the code or if it's a MIRI bug. Anyways, I've opened this for review now.

@notgull notgull marked this pull request as ready for review November 6, 2022 00:42
@fogti
Copy link
Member

fogti commented Nov 6, 2022

Cargo hack build does not seem to support --no-dev-dep (anymore?) idk what's up with that, but it makes CI fail.

@notgull
Copy link
Member Author

notgull commented Nov 6, 2022

I just took a look, I typo'd no-dev-deps (with an s at the end), let me fix that.

src/inner.rs Outdated Show resolved Hide resolved
src/queue.rs Show resolved Hide resolved
src/lib.rs Show resolved Hide resolved
src/node.rs Outdated Show resolved Hide resolved
src/node.rs Outdated Show resolved Hide resolved
src/inner.rs Show resolved Hide resolved
src/queue.rs Show resolved Hide resolved
@fogti
Copy link
Member

fogti commented Nov 9, 2022

Suggestion: 9c31ae6 (refactors Node such that the Drop handler is moved to another struct, such that the Node itself can be freely deconstructed, and moves the dealing with the Option to the place where it actually matters)

@notgull
Copy link
Member Author

notgull commented Nov 9, 2022

Suggestion: 9c31ae6 (refactors Node such that the Drop handler is moved to another struct, such that the Node itself can be freely deconstructed, and moves the dealing with the Option to the place where it actually matters)

Great idea! I've merged your commit into this branch.

Copy link
Member

@fogti fogti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe in modules which aren't pub-reachable from the top module, we should replace pub(crate) with pub (which are equivalent in that case), reducing clutter.

src/inner.rs Outdated Show resolved Hide resolved
src/list.rs Outdated Show resolved Hide resolved
src/list.rs Outdated Show resolved Hide resolved
src/list.rs Show resolved Hide resolved
src/list.rs Outdated Show resolved Hide resolved
src/lib.rs Outdated Show resolved Hide resolved
@notgull
Copy link
Member Author

notgull commented Nov 10, 2022

Maybe in modules which aren't pub-reachable from the top module, we should replace pub(crate) with pub (which are equivalent in that case), reducing clutter.

I generally like to make it pub(crate) even if it's not reachable from the outside, for two reasons:

  • Makes it slightly harder to have API leaks.
  • I usually program with warn(clippy::pedantic), which issues a warning if it sees a pub where a pub(crate) would work.

Copy link
Member

@fogti fogti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we get current benchmark stats?

@notgull
Copy link
Member Author

notgull commented Nov 10, 2022

Can we get current benchmark stats?

I took some benchmarks and found that they had regressed.

benchmarks

After some flamegraphing, I found that this regression was because of the introduction of concurrent-queue into the hot path of dropping the ListGuard. I guess the old version is faster because checking if the queue is empty is a single atomic operation, which may be able to be more accurately predicted-on?

Anyways, I restored the old Queue implementation, and performance returned to being roughly on-par with the current implementation.

benchmarks 2

@notgull
Copy link
Member Author

notgull commented Nov 10, 2022

I also fixed the MIRI deadlock... does MIRI not support compare_exchange_weak? Weird.

@fogti
Copy link
Member

fogti commented Nov 10, 2022

As the problem with the previous iterations was a bigger regression, and the current benchmarks indicate that that is no longer the case (the new branch and old branch have comparable iteration time, and the noise is relatively strong in both). Can we squash-merge this?

@fogti
Copy link
Member

fogti commented Nov 10, 2022

Something I'd like to do next is bumping criterion, as this massively reduces the amount of pulled-in crates on dev-builds.

@notgull
Copy link
Member Author

notgull commented Nov 10, 2022

Can we squash-merge this?

Sounds good! Do you mind approving the PR so I can merge it?

@notgull notgull merged commit 16b3d59 into master Nov 11, 2022
@notgull notgull deleted the no_std_3 branch November 11, 2022 15:53
@notgull notgull mentioned this pull request Nov 11, 2022
@notgull notgull mentioned this pull request May 20, 2023
notgull added a commit that referenced this pull request May 4, 2024
Revert "ci: Also add MIRI tests"

This reverts commit 2493d3c.

Revert "ci: Add CI tests for dependent crates"

This reverts commit c56420d.

Revert "v5.3.0"

This reverts commit db5857b.

Revert "feat: Add a loom implementation for event-listener"

This reverts commit f402b7e.

Revert "docs: Make empty listener panic clearer"

This reverts commit 58dbfc8.

Revert "v5.2.0"

This reverts commit 8f11a87.

Revert "feat: Mark StackSlot as Sync"

This reverts commit c9d736a.

Revert "v5.1.0"

This reverts commit 3a49a00.

Revert "StackSlot should be send"

This reverts commit e5464b4.

Revert "v5.0.0"

This reverts commit 4c35680.

Revert "chore: Polish the implementation of the new API"

This reverts commit 6e6202b.

Revert "feat: Move Future impl to forwarding macro"

This reverts commit 6fc00c0.

Revert "ex: Remove unsafe code from mutex example"

This reverts commit e0fefc2.

Revert "feat: Add stack-based listener"

This reverts commit 68be528.

Revert "feat: Create Listener trait"

This reverts commit d9144a8.

Revert "feat: Move EventListener back onto the heap"

This reverts commit 86b7780.

Revert "chore: Fix up some minor bits before release"

This reverts commit ac18bdf.

Revert "feat: Add a way to get the current number of listeners"

This reverts commit a68f5ee.

Revert "Remove RefCell<Option> from PARKER"

This reverts commit 5f5135e.

Revert "Release 4.0.3"

This reverts commit b1d437a.

Revert "Relax MSRV to 1.60"

This reverts commit aade039.

Revert "ci: Use cargo-hack's --rust-version flag for msrv check"

This reverts commit 45272f9.

Revert "Update criterion requirement from 0.4.0 to 0.5.1 (#62)"

This reverts commit 08c7e16.

Revert "v4.0.2"

This reverts commit 9e986e6.

Revert "bugfix: Avoid spinning when waiting for deadline"

This reverts commit e0c8290.

Revert "v4.0.1"

This reverts commit ea0f601.

Revert "bugfix: Remove listener if one already exists"

This reverts commit c2d1ccb.

Revert "Bump MSRV to 1.61 (#102)"

This reverts commit cc33cc5.

Revert "v4.0.0"

This reverts commit 531c106.

Revert "breaking: Fix the EventListener::new() footgun"

This reverts commit 21b34bf.

Revert "v3.1.0"

This reverts commit e6ec597.

Revert "feat: Implement `UnwindSafe` for `EventListener`"

This reverts commit 3f0d516.

Revert "Update futures-lite requirement from 1.12.0 to 2.0.0"

This reverts commit c42dc40.

Revert "v3.0.1"

This reverts commit ca65475.

Revert "m: Update fmt::Debug to produce new info"

This reverts commit 74e8231.

Revert "Fix doctest and nitpick"

This reverts commit 5c11241.

Revert "docs: Document that EventListeners must be listen'd on"

This reverts commit ac3978e.

Revert "Migrate to Rust 2021 (#85)"

This reverts commit ccd2dfe.

Revert "tests: Fix MIRI test errors"

This reverts commit 10bae60.

Revert "v3.0.0"

This reverts commit d2ed2cd.

Revert "Relax memory ordering in AtomicCell::replace (#83)"

This reverts commit 7bbabd0.

Revert "Disable IntoNotification::tag with no_std (#81)"

This reverts commit 450942e.

Revert "Remove extra comma from cfg (#82)"

This reverts commit 4965ddd.

Revert "Update actions/checkout action to v4"

This reverts commit d4c63e9.

Revert "Move event-listener-strategy to its own repository"

This reverts commit cbbe9aa.

Revert "feat: Add explicit web support"

This reverts commit c278371.

Revert "feat: Implement UnwindSafe on core"

This reverts commit 85ca6d3.

Revert "bugfix: Tracking down a deadlock in async-channel"

This reverts commit e408ccd.

Revert "m: Remove tag support from no_std"

This reverts commit 564b84b.

Revert "bugfix: Fix a couple of bugs in the no_std implementation"

This reverts commit 1c95cd2.

Revert "bugfix: Use inline assembly in full_fence"

This reverts commit 7ce2634.

Revert "Update CI config (#72)"

This reverts commit 8c55219.

Revert "m: Remove most of Pin API related unsafe code"

This reverts commit 0ea4641.

Revert "docs: Fix typos"

This reverts commit a1c3570.

Revert "Update minimal version of pin-project-lite to 0.2.12 (#66)"

This reverts commit 779b391.

Revert "feat: Add an is_listening() method to the event listener"

This reverts commit 6b6644a.

Revert "Add smol-rs logo (#63)"

This reverts commit 7c42a41.

Revert "Add a poll_with_strategy method to easy_wrapper! (#60)"

This reverts commit 5180532.

Revert "Make sure Event/EventListener are Send/Sync (#59)"

This reverts commit d6065ed.

Revert "Add documentation of new functionality"

This reverts commit e2e89d2.

Revert "Make the notify() function return notified count"

This reverts commit 6345794.

Revert "Add support for generic types to easy_wrapper (#54)"

This reverts commit fb90f08.

Revert "feat: Add an "is_notified" function (#48)"

This reverts commit 6d2a097.

Revert "Replace boxed closure with a vec of tags"

This reverts commit 9275054.

Revert "Minimize GITHUB_TOKEN permissions"

This reverts commit 97865d1.

Revert "Set CARGO_NET_GIT_FETCH_WITH_CLI=true in CI"

This reverts commit 43950ee.

Revert "Remove the pin-utils dependency (#56)"

This reverts commit 0749ab4.

Revert "Wire up the Strategy trait with the new tags"

This reverts commit a8c3aa7.

Revert "Fix doctests"

This reverts commit a7e74b2.

Revert "Seal the Notification and IntoNotification traits"

This reverts commit 15b4ea2.

Revert "Fix various CI errors"

This reverts commit 723c328.

Revert "Add a type parameter T to Event"

This reverts commit e001c7a.

Revert "Change out SingleNotify for GenericNotify"

This reverts commit 266b60d.

Revert "Adjust the Notification logic slightly"

This reverts commit 5f67dd0.

Revert "Add the Notification trait"

This reverts commit d986a5c.

Revert "Add a portable-atomic feature (#53)"

This reverts commit e909945.

Revert "Review comments"

This reverts commit 72bfe07.

Revert "Forgot to adjust length in remove()"

This reverts commit 8208309.

Revert "Fix code review/CI issues"

This reverts commit 17952d6.

Revert "Avoid allocation in the benchmarks"

This reverts commit bc07d43.

Revert "Build tests for no-default-features into C/I"

This reverts commit 2ac3be0.

Revert "Unsplit the 'Incomplete' commit"

This reverts commit 1ec136a.

Revert "Fix tests"

This reverts commit 3fefa6c.

Revert "Add a libstd implementation of the inner list"

This reverts commit 20c69a1.

Revert "EventListener is now used through pinning"

This reverts commit 996ee4d.

Revert "Use a cached Parker/Unparker pair when possible"

This reverts commit c659cf8.

Revert "Replace Listener with Option<sys::Listener>"

This reverts commit 09ded13.

Revert "Split the EventListener struct into a sub-listener structure"

This reverts commit de1f13a.

Revert "High-level module reorganization"

This reverts commit 0c76968.

Revert "Remove the `crossbeam-utils` dependency"

This reverts commit 5c83b86.

Revert "Remove the `slab` dependency"

This reverts commit 1188962.

Revert "Move node.rs and queue.rs to be submodules of list.rs"

This reverts commit 393566a.

Revert "Move the lock method to list.rs and rename it to try_lock"

This reverts commit 2d171ae.

Revert "Trim unnecessary abstractions"

This reverts commit 1a4df18.

Revert "Move listener data into list.rs"

This reverts commit be047ad.

Revert "Move list guard/inner list to list.rs"

This reverts commit 0ddf3d6.

Revert "Move inner data to lib.rs"

This reverts commit 9e32177.

Revert "fix(el-strategy): missing feature='std' on Ready impl"

This reverts commit 690cae5.

Revert "feat: Add the event-listener-strategy crate (#49)"

This reverts commit 52cb4bf.

Revert "Enable dependabot update for Rust"

This reverts commit 673e1fa.

Revert "Clean up CI config"

This reverts commit 097cbae.

Revert "Remove msrv field from .clippy.toml"

This reverts commit 7beefeb.

Revert "Fix build badge and update links (#45)"

This reverts commit 0ea39a6.

Revert "Replace the linked list with a safer and less allocation-heavy alternative (#38)"

This reverts commit 0235e55.

Revert "Bump criterion to 0.4.0 (#35)"

This reverts commit 6496571.

Revert "Implement an algorithm to make this crate no_std, take 3 (#34)"

This reverts commit 16b3d59.

Revert "Add basic benchmarks (#31)"

This reverts commit 5c1ae63.

Revert "Bump rust-version to 1.39 (#29)"

This reverts commit c36d7d5.

Revert "Use the parking crate instead of threading APIs (#27)"

This reverts commit a01518f.
notgull added a commit that referenced this pull request May 4, 2024
Revert "ci: Also add MIRI tests"

This reverts commit 2493d3c.

Revert "ci: Add CI tests for dependent crates"

This reverts commit c56420d.

Revert "v5.3.0"

This reverts commit db5857b.

Revert "feat: Add a loom implementation for event-listener"

This reverts commit f402b7e.

Revert "docs: Make empty listener panic clearer"

This reverts commit 58dbfc8.

Revert "v5.2.0"

This reverts commit 8f11a87.

Revert "feat: Mark StackSlot as Sync"

This reverts commit c9d736a.

Revert "v5.1.0"

This reverts commit 3a49a00.

Revert "StackSlot should be send"

This reverts commit e5464b4.

Revert "v5.0.0"

This reverts commit 4c35680.

Revert "chore: Polish the implementation of the new API"

This reverts commit 6e6202b.

Revert "feat: Move Future impl to forwarding macro"

This reverts commit 6fc00c0.

Revert "ex: Remove unsafe code from mutex example"

This reverts commit e0fefc2.

Revert "feat: Add stack-based listener"

This reverts commit 68be528.

Revert "feat: Create Listener trait"

This reverts commit d9144a8.

Revert "feat: Move EventListener back onto the heap"

This reverts commit 86b7780.

Revert "chore: Fix up some minor bits before release"

This reverts commit ac18bdf.

Revert "feat: Add a way to get the current number of listeners"

This reverts commit a68f5ee.

Revert "Remove RefCell<Option> from PARKER"

This reverts commit 5f5135e.

Revert "Release 4.0.3"

This reverts commit b1d437a.

Revert "Relax MSRV to 1.60"

This reverts commit aade039.

Revert "ci: Use cargo-hack's --rust-version flag for msrv check"

This reverts commit 45272f9.

Revert "Update criterion requirement from 0.4.0 to 0.5.1 (#62)"

This reverts commit 08c7e16.

Revert "v4.0.2"

This reverts commit 9e986e6.

Revert "bugfix: Avoid spinning when waiting for deadline"

This reverts commit e0c8290.

Revert "v4.0.1"

This reverts commit ea0f601.

Revert "bugfix: Remove listener if one already exists"

This reverts commit c2d1ccb.

Revert "Bump MSRV to 1.61 (#102)"

This reverts commit cc33cc5.

Revert "v4.0.0"

This reverts commit 531c106.

Revert "breaking: Fix the EventListener::new() footgun"

This reverts commit 21b34bf.

Revert "v3.1.0"

This reverts commit e6ec597.

Revert "feat: Implement `UnwindSafe` for `EventListener`"

This reverts commit 3f0d516.

Revert "Update futures-lite requirement from 1.12.0 to 2.0.0"

This reverts commit c42dc40.

Revert "v3.0.1"

This reverts commit ca65475.

Revert "m: Update fmt::Debug to produce new info"

This reverts commit 74e8231.

Revert "Fix doctest and nitpick"

This reverts commit 5c11241.

Revert "docs: Document that EventListeners must be listen'd on"

This reverts commit ac3978e.

Revert "Migrate to Rust 2021 (#85)"

This reverts commit ccd2dfe.

Revert "tests: Fix MIRI test errors"

This reverts commit 10bae60.

Revert "v3.0.0"

This reverts commit d2ed2cd.

Revert "Relax memory ordering in AtomicCell::replace (#83)"

This reverts commit 7bbabd0.

Revert "Disable IntoNotification::tag with no_std (#81)"

This reverts commit 450942e.

Revert "Remove extra comma from cfg (#82)"

This reverts commit 4965ddd.

Revert "Update actions/checkout action to v4"

This reverts commit d4c63e9.

Revert "Move event-listener-strategy to its own repository"

This reverts commit cbbe9aa.

Revert "feat: Add explicit web support"

This reverts commit c278371.

Revert "feat: Implement UnwindSafe on core"

This reverts commit 85ca6d3.

Revert "bugfix: Tracking down a deadlock in async-channel"

This reverts commit e408ccd.

Revert "m: Remove tag support from no_std"

This reverts commit 564b84b.

Revert "bugfix: Fix a couple of bugs in the no_std implementation"

This reverts commit 1c95cd2.

Revert "bugfix: Use inline assembly in full_fence"

This reverts commit 7ce2634.

Revert "Update CI config (#72)"

This reverts commit 8c55219.

Revert "m: Remove most of Pin API related unsafe code"

This reverts commit 0ea4641.

Revert "docs: Fix typos"

This reverts commit a1c3570.

Revert "Update minimal version of pin-project-lite to 0.2.12 (#66)"

This reverts commit 779b391.

Revert "feat: Add an is_listening() method to the event listener"

This reverts commit 6b6644a.

Revert "Add smol-rs logo (#63)"

This reverts commit 7c42a41.

Revert "Add a poll_with_strategy method to easy_wrapper! (#60)"

This reverts commit 5180532.

Revert "Make sure Event/EventListener are Send/Sync (#59)"

This reverts commit d6065ed.

Revert "Add documentation of new functionality"

This reverts commit e2e89d2.

Revert "Make the notify() function return notified count"

This reverts commit 6345794.

Revert "Add support for generic types to easy_wrapper (#54)"

This reverts commit fb90f08.

Revert "feat: Add an "is_notified" function (#48)"

This reverts commit 6d2a097.

Revert "Replace boxed closure with a vec of tags"

This reverts commit 9275054.

Revert "Minimize GITHUB_TOKEN permissions"

This reverts commit 97865d1.

Revert "Set CARGO_NET_GIT_FETCH_WITH_CLI=true in CI"

This reverts commit 43950ee.

Revert "Remove the pin-utils dependency (#56)"

This reverts commit 0749ab4.

Revert "Wire up the Strategy trait with the new tags"

This reverts commit a8c3aa7.

Revert "Fix doctests"

This reverts commit a7e74b2.

Revert "Seal the Notification and IntoNotification traits"

This reverts commit 15b4ea2.

Revert "Fix various CI errors"

This reverts commit 723c328.

Revert "Add a type parameter T to Event"

This reverts commit e001c7a.

Revert "Change out SingleNotify for GenericNotify"

This reverts commit 266b60d.

Revert "Adjust the Notification logic slightly"

This reverts commit 5f67dd0.

Revert "Add the Notification trait"

This reverts commit d986a5c.

Revert "Add a portable-atomic feature (#53)"

This reverts commit e909945.

Revert "Review comments"

This reverts commit 72bfe07.

Revert "Forgot to adjust length in remove()"

This reverts commit 8208309.

Revert "Fix code review/CI issues"

This reverts commit 17952d6.

Revert "Avoid allocation in the benchmarks"

This reverts commit bc07d43.

Revert "Build tests for no-default-features into C/I"

This reverts commit 2ac3be0.

Revert "Unsplit the 'Incomplete' commit"

This reverts commit 1ec136a.

Revert "Fix tests"

This reverts commit 3fefa6c.

Revert "Add a libstd implementation of the inner list"

This reverts commit 20c69a1.

Revert "EventListener is now used through pinning"

This reverts commit 996ee4d.

Revert "Use a cached Parker/Unparker pair when possible"

This reverts commit c659cf8.

Revert "Replace Listener with Option<sys::Listener>"

This reverts commit 09ded13.

Revert "Split the EventListener struct into a sub-listener structure"

This reverts commit de1f13a.

Revert "High-level module reorganization"

This reverts commit 0c76968.

Revert "Remove the `crossbeam-utils` dependency"

This reverts commit 5c83b86.

Revert "Remove the `slab` dependency"

This reverts commit 1188962.

Revert "Move node.rs and queue.rs to be submodules of list.rs"

This reverts commit 393566a.

Revert "Move the lock method to list.rs and rename it to try_lock"

This reverts commit 2d171ae.

Revert "Trim unnecessary abstractions"

This reverts commit 1a4df18.

Revert "Move listener data into list.rs"

This reverts commit be047ad.

Revert "Move list guard/inner list to list.rs"

This reverts commit 0ddf3d6.

Revert "Move inner data to lib.rs"

This reverts commit 9e32177.

Revert "fix(el-strategy): missing feature='std' on Ready impl"

This reverts commit 690cae5.

Revert "feat: Add the event-listener-strategy crate (#49)"

This reverts commit 52cb4bf.

Revert "Enable dependabot update for Rust"

This reverts commit 673e1fa.

Revert "Clean up CI config"

This reverts commit 097cbae.

Revert "Remove msrv field from .clippy.toml"

This reverts commit 7beefeb.

Revert "Fix build badge and update links (#45)"

This reverts commit 0ea39a6.

Revert "Replace the linked list with a safer and less allocation-heavy alternative (#38)"

This reverts commit 0235e55.

Revert "Bump criterion to 0.4.0 (#35)"

This reverts commit 6496571.

Revert "Implement an algorithm to make this crate no_std, take 3 (#34)"

This reverts commit 16b3d59.

Revert "Add basic benchmarks (#31)"

This reverts commit 5c1ae63.

Revert "Bump rust-version to 1.39 (#29)"

This reverts commit c36d7d5.

Revert "Use the parking crate instead of threading APIs (#27)"

This reverts commit a01518f.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants