From 83a42271ad03901f18f16515c6f9e1953c2a9226 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Wed, 23 Mar 2016 14:33:51 +0100 Subject: [PATCH] fix remaining memory leaks --- README.md | 10 +++++++++- package.json | 2 +- src/Connector.js | 10 +++++++--- src/SpecHelper.js | 4 ++++ src/Transaction.js | 33 +++++++++++---------------------- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 7c79014d..44bfba75 100644 --- a/README.md +++ b/README.md @@ -177,8 +177,16 @@ If you want to see an issue fixed, please subscribe to the thread (or remind me ## Changelog +### 10.0.0 + +* Support for more complex types (a type can be a composition of several types) +* Fixes several memory leaks + ### 9.0.0 -There were several rolling updates from 0.6 to 0.8. We'll now follow the semver versioning scheme. This is all what this jump from 0.8 to 9.0 is about. +There were several rolling updates from 0.6 to 0.8. We consider Yjs stable since a long time, +and intend to continue stable releases. From this release forward y-* modules will implement peer-dependencies for npm, and dependencies for bower. +Furthermore, incompatible yjs instances will now throw errors when syncing - this feature was influenced by #48. The versioning jump was influenced by react (see [here](https://facebook.github.io/react/blog/2016/02/19/new-versioning-scheme.html)) + ### 0.6.0 This is a complete rewrite of the 0.5 version of Yjs. Since Yjs 0.6.0 it is possible to work asynchronously on a persistent database, which enables offline support. diff --git a/package.json b/package.json index 919ad4b6..f64c4085 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yjs", - "version": "9.1.0", + "version": "10.0.0", "description": "A framework for real-time p2p shared editing on arbitrary complex data types", "main": "./src/y.js", "scripts": { diff --git a/src/Connector.js b/src/Connector.js index 00c74e89..a8fb9a40 100644 --- a/src/Connector.js +++ b/src/Connector.js @@ -19,6 +19,8 @@ module.exports = function (Y/* :any */) { userId: UserId; send: Function; broadcast: Function; + broadcastOpBuffer: Array; + protocolVersion: number; */ /* opts contains the following information: @@ -51,7 +53,7 @@ module.exports = function (Y/* :any */) { this.broadcastedHB = false this.syncStep2 = Promise.resolve() this.broadcastOpBuffer = [] - this.protocolVersion = 8 + this.protocolVersion = 10 } reconnect () { } @@ -150,7 +152,8 @@ module.exports = function (Y/* :any */) { conn.send(syncUser, { type: 'sync step 1', stateSet: stateSet, - deleteSet: deleteSet + deleteSet: deleteSet, + protocolVersion: conn.protocolVersion }) }) } else { @@ -234,7 +237,8 @@ module.exports = function (Y/* :any */) { type: 'sync step 2', os: ops, stateSet: currentStateSet, - deleteSet: ds + deleteSet: ds, + protocolVersion: this.protocolVersion }) if (this.forwardToSyncingClients) { conn.syncingClients.push(sender) diff --git a/src/SpecHelper.js b/src/SpecHelper.js index 72435424..02f4e32d 100644 --- a/src/SpecHelper.js +++ b/src/SpecHelper.js @@ -182,6 +182,10 @@ g.compareAllUsers = async(function * compareAllUsers (users) { for (var uid = 0; uid < users.length; uid++) { var u = users[uid] u.db.requestTransaction(function * () { + var sv = yield* this.getStateVector() + for (var s of sv) { + yield* this.updateState(s.user) + } // compare deleted ops against deleteStore yield* this.os.iterate(this, null, null, function * (o) { if (o.deleted === true) { diff --git a/src/Transaction.js b/src/Transaction.js index b8ef6a46..3a5344a7 100644 --- a/src/Transaction.js +++ b/src/Transaction.js @@ -156,30 +156,19 @@ module.exports = function (Y/* :any */) { * deleteList (start) { while (start != null) { start = yield* this.getOperation(start) - if (start.gc) { - break - } else { + if (!start.gc) { start.gc = true start.deleted = true yield* this.setOperation(start) yield* this.markDeleted(start.id, 1) if (start.opContent != null) { yield* this.deleteOperation(start.opContent) - /* - yield* this.deleteOperation(start.opContent) - var opContent = yield* this.getOperation(start.opContent) - opContent.gc = true - yield* this.setOperation(opContent) - if (this.store.y.connector.isSynced) { - this.store.gc1.push(opContent.id) - } - */ } if (this.store.y.connector.isSynced){ this.store.gc1.push(start.id) } - start = start.right } + start = start.right } } @@ -561,15 +550,15 @@ module.exports = function (Y/* :any */) { // so we have to set right here yield* this.setOperation(right) } - // o may originate in another operation. - // Since o is deleted, we have to reset o.origin's `originOf` property - if (o.origin != null) { - var origin = yield* this.getOperation(o.origin) - origin.originOf = origin.originOf.filter(function (_id) { - return !Y.utils.compareIds(id, _id) - }) - yield* this.setOperation(origin) - } + } + // o may originate in another operation. + // Since o is deleted, we have to reset o.origin's `originOf` property + if (o.origin != null) { + var origin = yield* this.getOperation(o.origin) + origin.originOf = origin.originOf.filter(function (_id) { + return !Y.utils.compareIds(id, _id) + }) + yield* this.setOperation(origin) } var parent if (o.parent != null){