mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 08:46:37 -04:00
Anki is a smart spaced repetition flashcard program
![]() The previous implementation had some slightly questionable memory safety properties (older versions of PyO3 didn't uphold the Rust aliasing rules and would thus create multiple &mut references to #[pyclass] objects). This explains why Backend has internal Mutex<T>s even though all of its methods took &mut self. The solution is to simply make all methods take &self, which luckily doesn't pose too make issues -- most of the code inside Backend already has sufficient locking. The only two things which needed to be explicitly handled where: 1. "self.runtime" which was fairly easy to handle. All usages of the Runtime only require an immutable reference to create a new Handle, so we could switch to OnceCell which provides lazy-initialisation semantics without needing a more heavy-handed Mutex<tokio::runtime::Handle>. 2. "self.sync_abort" was simply wrapped in a Mutex<>, though some of the odd semantics of sync_abort (not being able to handle multiple processes synchronising at the same time) become pretty obvious with this change (for now we just log a warning in that case). In addition, switch to an RAII-style guard to make sure we don't forget to clear the abort_handle. As a result, we now no longer break Rust's aliasing rules and we can build with newer versions of PyO3 which have runtime checks for these things (and build on stable Rust). Signed-off-by: Aleksa Sarai <cyphar@cyphar.com> |
||
---|---|---|
.github | ||
meta | ||
proto | ||
pylib | ||
qt | ||
rslib | ||
rspy | ||
scripts | ||
ts | ||
.gitattributes | ||
.gitignore | ||
CONTRIBUTORS | ||
LICENSE | ||
Makefile | ||
pkgkey.asc | ||
README.contributing | ||
README.development | ||
README.md | ||
run |
This repo contains all the code for the computer version of Anki.
If you'd like to try development builds of Anki but don't feel comfortable building the code, please see https://betas.ankiweb.net/#/
For more information on building, please see README.development.
If you'd like to contribute code, please see README.contributing.