* Because it is also called everywhere, we also check if the connection has
* completed negotiation and emit 'secure' from here if it has.
*/
-SecurePair.prototype._cycle = function() {
+SecurePair.prototype._cycle = function(depth) {
+ depth = depth ? depth : 0;
if (this._done) {
return;
}
- // Make this function reentrant.
- if (this._cycleLock) return;
- this._cycleLock = true;
- this._writeCalled = false;
+ if(depth == 0) this._writeCalled = false;
var established = this._secureEstablished;
- this.encrypted._pull();
- this.cleartext._pull();
- this.cleartext._push();
- this.encrypted._push();
+ if (!this._cycleEncryptedPullLock) {
+ this._cycleEncryptedPullLock = true;
+ this.encrypted._pull();
+ this._cycleEncryptedPullLock = false;
+ }
+
+ if (!this._cycleCleartextPullLock) {
+ this._cycleCleartextPullLock = true;
+ this.cleartext._pull();
+ this._cycleCleartextPullLock = false;
+ }
- this._cycleLock = false;
+ if (!this._cycleCleartextPushLock) {
+ this._cycleCleartextPushLock = true;
+ this.cleartext._push();
+ this._cycleCleartextPushLock = false;
+ }
+
+ if (!this._cycleEncryptedPushLock) {
+ this._cycleEncryptedPushLock = true;
+ this.encrypted._push();
+ this._cycleEncryptedPushLock = false;
+ }
if (this._done) {
return;
}
- if ((!established && this._secureEstablished) || this._writeCalled) {
+ if ((!established && this._secureEstablished) ||
+ (depth == 0 && this._writeCalled)) {
// If we were not established but now we are, let's cycle again.
// Or if there is some data to write...
- this._cycle();
+ this._cycle(depth + 1);
}
};