[1] for my part I've been doing it full time for the past 7 years, and also teach Rust at university.
[1] for my part I've been doing it full time for the past 7 years, and also teach Rust at university.
Of course, one's mileage can vary. Most of our system is designed to be stateless at the top level, which helps.
I've run a quick analysis on the 1,145,666 lines of Rust code (excluding comments and blank lines) I have on my computer, which belong to several code bases I've worked on over the past few years (professional proprietary code, side projects and open source projects I just cloned to fiddle with), and here are the results:
- unsafe: 8247 matches, 1 every 138 lines (though keep in mind most of those aren't about mutable aliasing at all, like FFI or SIMD intrinsic)
- RefCell: 252 matches, 1 every 4546 lines
- Arc<Mutex<: 199 matches, 1 every 5757 lines
I think that's fair to say that “The typical Rust program has either no refcells, or a very small number, just as it has either no unsafe code or a very small amount”
For copy types, you can use `Cell` instead. And of course, atomics for primitive types.
Anyway, I haven't seen this type used in the embedded projects I've worked on, do you have an example? Maybe I can suss out the reason from that.
Here's what happens if you leave out the RefCell:
TEST.borrow(cs).replace(Test {});
error[E0596]: cannot borrow data in a `&` reference as mutable
If you use Option on the outside, I'm not sure how to then set or access the variable: static TEST: Mutex<Option<RefCell<Test>>> = Mutex::new(None);
What would you recommend as an alternative? Use case: Sharing state between interrupt handlers and similar.(With hubris the interrupt stuff is abstracted away so you don’t need to access stuff this way, hence at least some of that unfamiliarity.)