I am trying to use Rocket to build a server that has certain state shareable between endpoints.
So ideally, I should use state. Problem is some of the state involves String, like for example, I read a token from a json file:
#[derive(Debug)]
pub struct SaveData {
pub token: AtomicPtr<&'static str>,
}
impl SaveData {
pub fn new() -> Result<SaveData>{
let path = "./temporary/save_data.json";
let file = File::open(path)?;
let reader = BufReader::new(file);
let u:SaveDataJson = serde_json::from_reader(reader)?;
let mut token_string = u.token;
let token_ptr = AtomicPtr::new(token_string.as_mut_ptr() as *mut &str);
let sd = SaveData{ token: token_ptr };
Ok(sd)
}
pub fn get_token(&self) -> String {
let mstr = self.token.load(Ordering::Relaxed);
let str = unsafe {*mstr};
str.to_string()
}
pub fn set_token(&self, mut new_token: String) {
self.token.store(new_token.as_mut_ptr() as *mut &str, Ordering::Relaxed)
}
}
Yeah does not work. I got STATUS_STACK_BUFFER_OVERRUN
on get_token
.
So how to do Atomic for String? (Or if needs to be more percise, how to share state involving a String in Rocket?)
Thank you.
Also, does it matter if I use Ordering::Relaxed
versus something like Ordering::AcqRel
or Ordering::SeqCst