Track which packages are in the process of activating

This fixes a race condition where a package's activation promise resolves asynchronously
after it has been deactivated, causing it to stay in the package manager's @activePackages
object.
This commit is contained in:
Max Brunsfeld 2015-12-08 11:09:52 -08:00
parent 03a2846eb5
commit 314a1234f4

View File

@ -47,6 +47,7 @@ class PackageManager
@packagesCache = require('../package.json')?._atomPackages ? {}
@loadedPackages = {}
@activePackages = {}
@activatingPackages = {}
@packageStates = {}
@serviceHub = new ServiceHub
@ -437,7 +438,10 @@ class PackageManager
if pack = @getActivePackage(name)
Promise.resolve(pack)
else if pack = @loadPackage(name)
@activatingPackages[pack.name] = pack
pack.activate().then =>
if @activatingPackages[pack.name]?
delete @activatingPackages[pack.name]
@activePackages[pack.name] = pack
@emitter.emit 'did-activate-package', pack
pack
@ -475,6 +479,7 @@ class PackageManager
@setPackageState(pack.name, state) if state = pack.serialize?()
pack.deactivate()
delete @activePackages[pack.name]
delete @activatingPackages[pack.name]
@emitter.emit 'did-deactivate-package', pack
handleMetadataError: (error, packagePath) ->