summaryrefslogtreecommitdiff
path: root/js/src/Ice/ConnectionMonitor.js
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2014-03-19 12:45:55 -0700
committerMark Spruiell <mes@zeroc.com>2014-03-19 12:45:55 -0700
commitcdcffbcc3c3c052afdeb772ff0167e7a90b525bb (patch)
tree4f16ee41ef7d33394c44e9db81e4d6cd89908250 /js/src/Ice/ConnectionMonitor.js
parentfixing testicedist.py for 5487 (diff)
downloadice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.tar.bz2
ice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.tar.xz
ice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.zip
merging javascript branch
Diffstat (limited to 'js/src/Ice/ConnectionMonitor.js')
-rw-r--r--js/src/Ice/ConnectionMonitor.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/js/src/Ice/ConnectionMonitor.js b/js/src/Ice/ConnectionMonitor.js
new file mode 100644
index 00000000000..dffe8f945a8
--- /dev/null
+++ b/js/src/Ice/ConnectionMonitor.js
@@ -0,0 +1,114 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+(function(global){
+ require("Ice/Class");
+ require("Ice/Debug");
+ require("Ice/ExUtil");
+
+ var Ice = global.Ice || {};
+
+ var Debug = Ice.Debug;
+ var ExUtil = Ice.ExUtil;
+
+ var ConnectionMonitor = Ice.Class({
+ __init__: function(instance, interval)
+ {
+ this._instance = instance;
+ this._interval = interval;
+ this._scheduledInterval = 0;
+ this._timerToken = -1;
+ this._connections = [];
+ },
+ destroy: function()
+ {
+ Debug.assert(this._instance !== null);
+ this._instance.timer().cancel(this._timerToken);
+ this._instance = null;
+ this._connections = null;
+ },
+ checkIntervalForACM: function(acmTimeout)
+ {
+ if(acmTimeout <= 0)
+ {
+ return;
+ }
+
+ //
+ // If Ice.MonitorConnections isn't set (_interval == 0), the given ACM is used
+ // to determine the check interval: 1/10 of the ACM timeout with a minmal value
+ // of 5 seconds and a maximum value of 5 minutes.
+ //
+ // Note: if Ice.MonitorConnections is set, the timer is scheduled only if ACM
+ // is configured for the communicator or some object adapters.
+ //
+ var interval;
+ if(this._interval === 0)
+ {
+ interval = Math.floor(Math.min(300, Math.max(5, acmTimeout / 10)));
+ }
+ else if(this._scheduledInterval === this._interval)
+ {
+ return; // Nothing to do, the timer is already scheduled.
+ }
+ else
+ {
+ interval = this._interval;
+ }
+
+ //
+ // If no timer is scheduled yet or if the given ACM requires a smaller interval,
+ // we re-schedule the timer.
+ //
+ if(this._scheduledInterval === 0 || this._scheduledInterval > interval)
+ {
+ this._scheduledInterval = interval;
+ this._instance.timer().cancel(this._timerToken);
+ var self = this;
+ this._timerToken = this._instance.timer().scheduleRepeated(
+ function() { self.runTimerTask(); }, interval * 1000);
+ }
+ },
+ add: function(connection)
+ {
+ Debug.assert(this._instance !== null);
+ this._connections.push(connection);
+ },
+ remove: function(connection)
+ {
+ Debug.assert(this._instance !== null);
+ var pos = this._connections.indexOf(connection);
+ Debug.assert(pos !== -1);
+ this._connections.splice(pos, 1);
+ },
+ runTimerTask: function()
+ {
+ var now = Date.now();
+ for(var i = 0; i < this._connections.length; ++i)
+ {
+ try
+ {
+ this._connections[i].monitor(now);
+ }
+ catch(ex)
+ {
+ if(this._instance === null)
+ {
+ return;
+ }
+ var msg = "exception in connection monitor:\n" + ExUtil.toString(ex);
+ this._instance.initializationData().logger.error(msg);
+ }
+ }
+ }
+ });
+
+ Ice.ConnectionMonitor = ConnectionMonitor;
+ global.Ice = Ice;
+}(typeof (global) === "undefined" ? window : global));