From 43bc1e7513ca4655a5ad19531adc7f3fa414cc6a Mon Sep 17 00:00:00 2001 From: Pawel Andruszkiewicz Date: Fri, 28 Aug 2015 09:12:58 +0200 Subject: [PATCH] [Common] Invoke callbacks and listeners asynchronously. This change is needed for http://168.219.209.56/gerrit/#/c/77690/ to work correctly, in order to avoid deadlocks. Change-Id: Ie664660da69e4b0b0368b4af9b2e0e7243c41ada Signed-off-by: Pawel Andruszkiewicz --- src/utils/utils_api.js | 46 +++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/utils/utils_api.js b/src/utils/utils_api.js index 8b0a6c67..bdf3fa7c 100755 --- a/src/utils/utils_api.js +++ b/src/utils/utils_api.js @@ -974,7 +974,15 @@ var NativeManager = function(extension) { return; } - this.callbacks_[id](msg); + var f = this.callbacks_[id]; + setTimeout(function() { + try { + f(msg); + } catch (e) { + console.error('########## exception'); + console.error(e); + } + }, 0); delete this.callbacks_[id]; return; @@ -989,7 +997,15 @@ var NativeManager = function(extension) { return; } - this.listeners_[id](msg); + var f = this.listeners_[id]; + setTimeout(function() { + try { + f(msg); + } catch (e) { + console.error('########## exception'); + console.error(e); + } + }, 0); return; } @@ -1208,7 +1224,7 @@ var NativeBridge = (function (extension, debug) { CallbackManager.prototype = { add: function (/*callbacks, cid?*/) { - if (debug) console.log('bridge', 'CallbackManager', 'add'); + if (debug) console.log('bridge.CallbackManager.add'); var args = Array.prototype.slice.call(arguments); var c = args.shift(); var cid = args.pop(); @@ -1225,11 +1241,11 @@ var NativeBridge = (function (extension, debug) { return cid; }, remove: function (cid) { - if (debug) console.log('bridge', 'CallbackManager', 'remove', cid); + if (debug) console.log('bridge.CallbackManager.remove, cid: ' + cid); if (_collection[cid]) delete _collection[cid]; }, call: function (cid, key, args, keep) { - if (debug) console.log('bridge', 'CallbackManager', 'call', cid, key); + if (debug) console.log('bridge.CallbackManager.call, cid: '+ cid + ', key: ' + key); var callbacks = _collection[cid]; keep = !!keep; if (callbacks) { @@ -1261,13 +1277,13 @@ var NativeBridge = (function (extension, debug) { ListenerManager.prototype = { add: function (l) { - if (debug) console.log('bridge', 'ListenerManager', 'add'); + if (debug) console.log('bridge.ListenerManager.add'); var id = _next(); _listeners[id] = l; return id; }, resolve: function (id, action, data, keep) { - if (debug) console.log('bridge', 'ListenerManager', 'resolve', id, action); + if (debug) console.log('bridge.ListenerManager.resolve, id: ' + id + ', action: ' + action); keep = !!keep; var l = _listeners[id]; if (l) { @@ -1277,7 +1293,7 @@ var NativeBridge = (function (extension, debug) { return l; }, remove: function (id) { - if (debug) console.log('bridge', 'ListenerManager', 'remove', id); + if (debug) console.log('bridge.ListenerManager.remove, id: ' + id); var l = _listeners[id]; if (l) { var cm = Callbacks.getInstance(); @@ -1312,12 +1328,12 @@ var NativeBridge = (function (extension, debug) { })(); var Listener = function () { - if (debug) console.log('bridge', 'Listener constructor'); + if (debug) console.log('bridge: Listener constructor'); this.cid = null; }; Listener.prototype = { then: function (c) { - if (debug) console.log('bridge', 'Listener', 'then'); + if (debug) console.log('bridge.Listener.then'); var cm = Callbacks.getInstance(); this.cid = cm.add(c, this.cid); return this; @@ -1331,7 +1347,7 @@ var NativeBridge = (function (extension, debug) { cmd: data.cmd, args: data }); - if (debug) console.log('bridge', 'sync', json); + if (debug) console.log('bridge.sync, json: ' + json); var result = extension.internal.sendSyncMessage(json); var obj = JSON.parse(result); if (obj.error) @@ -1345,7 +1361,7 @@ var NativeBridge = (function (extension, debug) { cmd: data.cmd, args: data }); - if (debug) console.log('bridge', 'async', json); + if (debug) console.log('bridge.async, json: ' + json); setTimeout(function () { extension.postMessage(json); }); @@ -1378,10 +1394,12 @@ var NativeBridge = (function (extension, debug) { *} */ - if (debug) console.log('bridge', 'setMessageListener', json); + if (debug) console.log('bridge.setMessageListener, json: ' + json); var data = JSON.parse(json); if (data.cid && data.action) { - Listeners.getInstance().resolve(data.cid, data.action, data.args, data.keep); + setTimeout(function() { + Listeners.getInstance().resolve(data.cid, data.action, data.args, data.keep); + }, 0); } }); -- 2.34.1