From 2bd43860902f1464ef4c65e8affbe0631602961e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki & Nathan Sobo Date: Wed, 28 Aug 2013 18:37:40 -0700 Subject: [PATCH] Destroy unretained buffers when serializing project Previously buffers could linger indefinitely if an error occurred during startup between the deserialization of the project and the original retaining edit session. --- spec/project-spec.coffee | 7 +++++++ src/project.coffee | 5 +++++ src/text-buffer.coffee | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 8e54c8860..2b9b96bba 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -8,6 +8,13 @@ describe "Project", -> beforeEach -> project.setPath(project.resolve('dir')) + describe "serialization", -> + it "destroys unretained buffers and does not include them in the serialized state", -> + project.bufferForPath('a') + expect(project.getBuffers().length).toBe 1 + expect(deserialize(project.serialize()).getBuffers().length).toBe 0 + expect(project.getBuffers().length).toBe 0 + describe "when an edit session is destroyed", -> it "removes edit session and calls destroy on buffer (if buffer is not referenced by other edit sessions)", -> editSession = project.open("a") diff --git a/src/project.coffee b/src/project.coffee index d1a4be979..f66bfe964 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -91,9 +91,14 @@ class Project serialize: -> state = @state.clone() state.set('path', @getPath()) + @destroyUnretainedBuffers() state.set('buffers', buffer.serialize() for buffer in @getBuffers()) state + # Private: + destroyUnretainedBuffers: -> + buffer.destroy() for buffer in @getBuffers() when not buffer.isRetained() + # Public: ? getState: -> @state diff --git a/src/text-buffer.coffee b/src/text-buffer.coffee index b2bb2807f..f206e2746 100644 --- a/src/text-buffer.coffee +++ b/src/text-buffer.coffee @@ -81,13 +81,15 @@ class TextBuffer @destroyed = true @project?.removeBuffer(this) + isRetained: -> @refcount > 0 + retain: -> @refcount++ this release: -> @refcount-- - @destroy() if @refcount <= 0 + @destroy() unless @isRetained() this serialize: ->