From a045eabbfae7944b02d0aa5d7026f57d5e5d8853 Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 17 May 2021 14:15:24 -0700 Subject: [PATCH] Invoke BlazeSyncPlugin.updateInMemoryState w/o a read lock BlazeSyncPlugin.updateInMemoryState is invoked while a read lock is held. This makes it harder for the implementations of that extension point to run long running actions, parts of which may not need the read lock. This CL moves the acquisition of the read locks to be done inside the implementations, allowing them to further customize when read locks are acquired in the future. PiperOrigin-RevId: 374278077 --- .../android/sync/BlazeAndroidSyncPlugin.java | 19 ++++++----- .../blaze/base/sync/SyncPhaseCoordinator.java | 32 ++++++++----------- .../idea/blaze/cpp/BlazeCSyncPlugin.java | 11 +++++-- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java index bfeba4dc47b..0ed8613e382 100644 --- a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java +++ b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java @@ -226,14 +226,17 @@ public void updateInMemoryState( BlazeProjectData blazeProjectData, Module workspaceModule, SyncMode syncMode) { - BlazeAndroidProjectStructureSyncer.updateInMemoryState( - project, - context, - workspaceRoot, - projectViewSet, - blazeProjectData, - workspaceModule, - isAndroidWorkspace(blazeProjectData.getWorkspaceLanguageSettings())); + ApplicationManager.getApplication() + .runReadAction( + () -> + BlazeAndroidProjectStructureSyncer.updateInMemoryState( + project, + context, + workspaceRoot, + projectViewSet, + blazeProjectData, + workspaceModule, + isAndroidWorkspace(blazeProjectData.getWorkspaceLanguageSettings()))); } @Nullable diff --git a/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java b/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java index 8b2e0ec13c3..81500ad2e4e 100644 --- a/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java +++ b/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java @@ -70,7 +70,6 @@ import com.google.idea.blaze.base.util.SaveUtil; import com.google.idea.common.experiments.BoolExperiment; import com.google.idea.common.util.ConcurrencyUtil; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; @@ -694,24 +693,19 @@ private static List updateInMemoryState( new TimingScope("UpdateInMemoryState", EventType.Other) .addScopeListener((events, duration) -> timedEvents.addAll(events))); context.output(new StatusOutput("Updating in-memory state...")); - ApplicationManager.getApplication() - .runReadAction( - () -> { - Module workspaceModule = - ModuleFinder.getInstance(project) - .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME); - for (BlazeSyncPlugin blazeSyncPlugin : - BlazeSyncPlugin.EP_NAME.getExtensions()) { - blazeSyncPlugin.updateInMemoryState( - project, - context, - WorkspaceRoot.fromProject(project), - projectViewSet, - blazeProjectData, - workspaceModule, - syncMode); - } - }); + Module workspaceModule = + ModuleFinder.getInstance(project) + .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME); + for (BlazeSyncPlugin blazeSyncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) { + blazeSyncPlugin.updateInMemoryState( + project, + context, + WorkspaceRoot.fromProject(project), + projectViewSet, + blazeProjectData, + workspaceModule, + syncMode); + } }); return timedEvents; } diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java index 7956531381c..267cb0e1af5 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java @@ -27,6 +27,7 @@ import com.google.idea.blaze.base.scope.scopes.TimingScope.EventType; import com.google.idea.blaze.base.sync.BlazeSyncPlugin; import com.google.idea.blaze.base.sync.SyncMode; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import java.util.Set; @@ -58,9 +59,13 @@ public void updateInMemoryState( childContext -> { childContext.push(new TimingScope("Setup C Workspace", EventType.Other)); - BlazeCWorkspace blazeCWorkspace = BlazeCWorkspace.getInstance(project); - blazeCWorkspace.update( - childContext, workspaceRoot, projectViewSet, blazeProjectData, syncMode); + ApplicationManager.getApplication() + .runReadAction( + () -> { + BlazeCWorkspace blazeCWorkspace = BlazeCWorkspace.getInstance(project); + blazeCWorkspace.update( + childContext, workspaceRoot, projectViewSet, blazeProjectData, syncMode); + }); }); }