Add LayoutInterner to LayoutCache

Adds a thread-local interner of layouts to LayoutCache, and updates all
references appropriately.

This is a bit suboptimal for single-threaded workloads that will look at
creating layout caches again, like the REPL, but I think that's okay for
now - since the global interner will be uncontested for those workloads, it
should still be plenty fast to access the interner, even behind a lock.
This commit is contained in:
Ayaz Hafiz 2022-08-31 12:03:30 -05:00
parent 9d170be5c7
commit c5466810a4
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
19 changed files with 177 additions and 86 deletions

View file

@ -117,9 +117,9 @@ impl<'a> ReplApp<'a> for WasmReplApp<'a> {
/// Size of the return value is statically determined from its Rust type
/// The `transform` callback takes the app's memory and the returned value
/// _main_fn_name is always the same and we don't use it here
fn call_function<Return, F>(&mut self, _main_fn_name: &str, transform: F) -> Expr<'a>
fn call_function<Return, F>(&mut self, _main_fn_name: &str, mut transform: F) -> Expr<'a>
where
F: Fn(&'a Self::Memory, Return) -> Expr<'a>,
F: FnMut(&'a Self::Memory, Return) -> Expr<'a>,
Self::Memory: 'a,
{
let app_final_memory_size: usize = js_run_app();
@ -147,10 +147,10 @@ impl<'a> ReplApp<'a> for WasmReplApp<'a> {
&mut self,
_main_fn_name: &str,
_ret_bytes: usize,
transform: F,
mut transform: F,
) -> T
where
F: Fn(&'a Self::Memory, usize) -> T,
F: FnMut(&'a Self::Memory, usize) -> T,
Self::Memory: 'a,
{
let app_final_memory_size: usize = js_run_app();
@ -186,6 +186,7 @@ pub async fn entrypoint_from_js(src: String) -> Result<String, String> {
mut interns,
mut subs,
exposed_to_host,
layout_interner,
..
} = mono;
@ -264,6 +265,7 @@ pub async fn entrypoint_from_js(src: String) -> Result<String, String> {
content,
&subs,
&interns,
layout_interner.into_global().fork(),
target_info,
);