* Expose the query ID and the last provisional value to the cycle recovery function
* Mark cycle as converged if fallback value is the same as the last provisional
* Make `cycle_fn` optional
* Fix race condition between releasing a transferred query's lock and the
same query blocking on the outer head in `provisional_retry`
* Fix infinite loop in `provisional_retry
* Run nested cycles in a single fixpoint iteration
Fix serde attribute
* Remove inline from `validate_same_iteration`
* Nits
* Move locking into sync table
* More trying
* More in progress work
* More progress
* Fix most parallel tests
* More bugfixes
* Short circuit in some cases
* Short circuit in drop
* Delete some unused code
* A working solution
* Simplify more
* Avoid repeated query lookups in `transfer_lock`
* Use recursion for unblocking
* Fix hang in `maybe_changed_after`
* Move claiming of transferred memos into a separate function
* More aggressive use of attributes
* Make re-entrant a const parameter
* Smaller clean-ups
* Only collect cycle heads one level deep
* More cleanups
* More docs
* More comments
* More documentation, cleanups
* More documentation, cleanups
* Remove inline attribute
* Fix failing tracked structs test
* Fix panic
* Fix persistence test
* Add test for panic in nested cycle
* Allow cycle initial values same-stack
* Try inlining fetch
* Remove some inline attributes
* Add safety comment
* Clippy
* Panic if `provisional_retry` runs too many times
* Better handling of panics in cycles
* Don't use const-generic for `REENTRANT`
* More nit improvements
* Remove `IterationCount::panicked`
* Prefer outer most cycles in `outer_cycle`
* Code review feedback
* Iterate only once in panic test when running with miri
* use `inventory` for static ingredient registration
* remove unnecessary synchronization from memo tables
* use global ingredient caches for database-independent ingredients
* add manual ingredient registration API
* remove static ingredient index optimization when manual registration is in use
* fix atomic imports
* simplify ingredient caches
* Set `validate_final` in `execute` after removing the last cycle head
* Add runaway query repro
* Add tracing
* Fix part 1
* Fix `cycle_head_kinds` to always return provisional for memos that aren't verified final (They should be validated by `validate_same_iteration` or wait for the cycle head
* Fix cycle error
* Documentation
* Fix await for queries depending on initial value
* correctly initialize queued
* Cleanup
* Short circuit if entire query runs on single thread
* Move parallel code into its own method
* Rename method, add self_key to queued
* Revert self-key changes
* Move check *after* `deep_verify_memo`
* Add a test for a cycle with changing cycle heads
* Short circuit more often
* Consider iteration in `validate_provisional`
* Only yield if all heads result in a cycle. Retry if even just one inner cycle made progress (in which case there's a probably a new memo)
* Fix hangs
* Cargo fmt
* clippy
* Fix hang if cycle initial panics
* Rename `cycle_head_kind` enable `cycle_a_t1_b_t2_fallback` shuttle test
* Cleanup
* Docs
That is, directly set a value for all queries that have fallbacks, and ignore all other queries in the cycle.
Unlike old Salsa, we still need all cycle heads to be marked, and we still execute the queries to completion, but we throw their result.
Under this design, *all* databases are a
`DatabaseImpl<U>`, where the `U` implements
`UserData` (you can use `()` if there is none).
Code would default to `&dyn salsa::Database` but
if you want to give access to the userdata, you
can define a custom database trait
`MyDatabase: salsa::Databse` so long as you
* annotate `MyDatabase` trait definition of
impls of `MyDatabase` with `#[salsa::db]`
* implement `MyDatabase` for `DatabaseImpl<U>`
where `U` is your userdata (this could be a
blanket impl, if you don't know the precise
userdata type).
The `tests/common/mod.rs` shows the pattern.