From 1d1e821a74734c101640af569ab3998ab5263037 Mon Sep 17 00:00:00 2001 From: whitequark Date: Mon, 21 Nov 2016 19:47:56 +0000 Subject: [PATCH] runtime: replace a (deliberate) memory leak with an interner. --- artiq/runtime.rs/src/session.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/artiq/runtime.rs/src/session.rs b/artiq/runtime.rs/src/session.rs index 8589971a0..78eba0faa 100644 --- a/artiq/runtime.rs/src/session.rs +++ b/artiq/runtime.rs/src/session.rs @@ -2,6 +2,7 @@ use std::prelude::v1::*; use std::{mem, str}; use std::cell::RefCell; use std::io::{self, Read, Write, BufWriter}; +use std::btree_set::BTreeSet; use {config, rtio_crg, clock, mailbox, rpc_queue, kernel}; use logger::BufferLogger; use cache::Cache; @@ -57,7 +58,8 @@ struct Session<'a> { congress: &'a mut Congress, kernel_state: KernelState, watchdog_set: clock::WatchdogSet, - log_buffer: String + log_buffer: String, + interner: BTreeSet } impl<'a> Session<'a> { @@ -66,7 +68,8 @@ impl<'a> Session<'a> { congress: congress, kernel_state: KernelState::Absent, watchdog_set: clock::WatchdogSet::new(), - log_buffer: String::new() + log_buffer: String::new(), + interner: BTreeSet::new() } } @@ -309,20 +312,20 @@ fn process_host_message(waiter: Waiter, })); // FIXME: gross. - fn into_c_str(s: String) -> *const u8 { + fn into_c_str(interner: &mut BTreeSet, s: String) -> *const u8 { let s = s + "\0"; - let p = s.as_bytes().as_ptr(); - mem::forget(s); + interner.insert(s.clone()); + let p = interner.get(&s).unwrap().as_bytes().as_ptr(); p } let exn = kern::Exception { - name: into_c_str(name), - message: into_c_str(message), + name: into_c_str(&mut session.interner, name), + message: into_c_str(&mut session.interner, message), param: param, - file: into_c_str(file), + file: into_c_str(&mut session.interner, file), line: line, column: column, - function: into_c_str(function), + function: into_c_str(&mut session.interner, function), phantom: ::core::marker::PhantomData }; try!(kern_send(waiter, &kern::RpcRecvReply(Err(exn))));