Skip to content

Commit 74014ab

Browse files
committed
perf: avoid cross-thread environment extension state synchronization for now
1 parent a4e9b5c commit 74014ab

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

src/Lean/Environment.lean

+11-9
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,9 @@ def ofKernelEnv (env : Kernel.Environment) : Environment :=
448448

449449
@[export lean_elab_environment_to_kernel_env]
450450
def toKernelEnv (env : Environment) : Kernel.Environment :=
451-
env.checked.get
451+
-- TODO: should just be the following when we store extension data in `checked`
452+
--env.checked.get
453+
{ env.checked.get with extensions := env.checkedWithoutAsync.extensions }
452454

453455
/-- Consistently updates synchronous and asynchronous parts of the environment without blocking. -/
454456
private def modifyCheckedAsync (env : Environment) (f : Kernel.Environment → Kernel.Environment) : Environment :=
@@ -495,7 +497,7 @@ def const2ModIdx (env : Environment) : Std.HashMap Name ModuleIdx :=
495497
-- only needed for the lakefile.lean cache
496498
@[export lake_environment_add]
497499
private def lakeAdd (env : Environment) (cinfo : ConstantInfo) : Environment :=
498-
{ env with checked := .pure <| env.checked.get.add cinfo }
500+
env.setCheckedSync <| env.checked.get.add cinfo
499501

500502
/--
501503
Save an extra constant name that is used to populate `const2ModIdx` when we import
@@ -864,22 +866,22 @@ opaque EnvExtensionInterfaceImp : EnvExtensionInterface
864866
def EnvExtension (σ : Type) : Type := EnvExtensionInterfaceImp.ext σ
865867

866868
private def ensureExtensionsArraySize (env : Environment) : IO Environment := do
867-
let exts ← EnvExtensionInterfaceImp.ensureExtensionsSize env.checked.get.extensions
869+
let exts ← EnvExtensionInterfaceImp.ensureExtensionsSize env.checkedWithoutAsync.extensions
868870
return env.modifyCheckedAsync ({ · with extensions := exts })
869871

870872
namespace EnvExtension
871873
instance {σ} [s : Inhabited σ] : Inhabited (EnvExtension σ) := EnvExtensionInterfaceImp.inhabitedExt s
872874

875+
-- TODO: store extension state in `checked`
876+
873877
def setState {σ : Type} (ext : EnvExtension σ) (env : Environment) (s : σ) : Environment :=
874-
let checked := env.checked.get
875-
env.setCheckedSync { checked with extensions := EnvExtensionInterfaceImp.setState ext checked.extensions s }
878+
{ env with checkedWithoutAsync.extensions := EnvExtensionInterfaceImp.setState ext env.checkedWithoutAsync.extensions s }
876879

877880
def modifyState {σ : Type} (ext : EnvExtension σ) (env : Environment) (f : σ → σ) : Environment :=
878-
let checked := env.checked.get
879-
env.setCheckedSync { checked with extensions := EnvExtensionInterfaceImp.modifyState ext checked.extensions f }
881+
{ env with checkedWithoutAsync.extensions := EnvExtensionInterfaceImp.modifyState ext env.checkedWithoutAsync.extensions f }
880882

881883
def getState {σ : Type} [Inhabited σ] (ext : EnvExtension σ) (env : Environment) : σ :=
882-
EnvExtensionInterfaceImp.getState ext env.checked.get.extensions
884+
EnvExtensionInterfaceImp.getState ext env.checkedWithoutAsync.extensions
883885

884886
end EnvExtension
885887

@@ -1466,7 +1468,7 @@ def getNamespaceSet (env : Environment) : NameSSet :=
14661468

14671469
@[export lean_elab_environment_update_base_after_kernel_add]
14681470
private def updateBaseAfterKernelAdd (env : Environment) (kernel : Kernel.Environment) : Environment :=
1469-
env.setCheckedSync kernel
1471+
env.setCheckedSync { kernel with extensions := env.checkedWithoutAsync.extensions }
14701472

14711473
@[export lean_display_stats]
14721474
def displayStats (env : Environment) : IO Unit := do

0 commit comments

Comments
 (0)