fix: update state function

updatestate should not change the order of workers in the tmpPool
 remove code repeatation

fix: actual concurrent tasks running was concurrency-1. fixed by placing cb after returnTOPool at $doWork_ functions
This commit is contained in:
2014-09-24 12:37:59 +05:30
parent acccb703fd
commit bee25f17f2
+17 -17
View File
@@ -10,7 +10,7 @@ function JobManager(opts){
this.notifyAt = opts.notifyAt|| 3; this.notifyAt = opts.notifyAt|| 3;
this.concurrency = opts.concurrency || 20; this.concurrency = opts.concurrency || 20;
this.minConcurrency = opts.minConcurrency != null ? opts.minConcurrency : 2; this.minConcurrency = opts.minConcurrency != null ? opts.minConcurrency : 2;
// state // state
this.state = STATE.NOT_RUNNING; this.state = STATE.NOT_RUNNING;
@@ -22,6 +22,8 @@ function JobManager(opts){
this.isLoadingTakingPlace = false; this.isLoadingTakingPlace = false;
this.endReached = false; this.endReached = false;
this.runningTasks = 0; this.runningTasks = 0;
this.tmpPoolLen=0;
this.tmpPool = [];
} }
/* /*
* JobManager.prototype.__defineSetter__( 'workers', function(workers){ * JobManager.prototype.__defineSetter__( 'workers', function(workers){
@@ -31,26 +33,24 @@ function JobManager(opts){
*/ */
JobManager.prototype.updateState = function(){ JobManager.prototype.updateState = function(){
var workers = this.workers; this.updateTmpPool( this.concurrency );
var tmpPoolBlock = workers.length && Math.ceil( this.concurrency/workers.length ) , i; };
var tmpPool = [];
for( i=0; i < tmpPoolBlock; i++){ JobManager.prototype.updateTmpPool = function(newVal){
tmpPool = tmpPool.concat( this.workers ); if( newVal > this.tmpPoolLen ){
var tmpPool = this.tmpPool;
var additionalPoolBlocks = Math.ceil( ( newVal - this.tmpPoolLen )/this.workers.length ), i;
for( i=0; i < additionalPoolBlocks; i++){
tmpPool = tmpPool.concat( this.workers );
}
this.tmpPoolLen += additionalPoolBlocks * this.workers.length ;
this.tmpPool = tmpPool;
} }
this.tmpPool = tmpPool;
this.tmpPoolLen = tmpPoolBlock * this.workers.length ;
}; };
JobManager.prototype.setConcurrency = function( newVal ){ JobManager.prototype.setConcurrency = function( newVal ){
if( newVal > this.minConcurrency ){ if( newVal > this.minConcurrency ){
if( newVal > this.tmpPoolLen ){ this.updateTmpPool(newVal);
var tmpPool = this.tmpPool;
var additionalPoolBlocks = Math.ceil( ( newVal - this.tmpPoolLen )/this.workers.length ), i;
for( i=0; i < additionalPoolBlocks; i++){
tmpPool = tmpPool.concat( this.workers );
}
this.tmpPoolLen += additionalPoolBlocks * this.workers.length ;
}
this.concurrency = newVal; this.concurrency = newVal;
} }
}; };
@@ -90,11 +90,11 @@ JobManager.prototype.$doWork_ = function( cb ){
self.$onLoadMore(); self.$onLoadMore();
} }
} }
cb();
if( self.state == STATE.NOT_RUNNING ){ if( self.state == STATE.NOT_RUNNING ){
if( ( self.runningTasks == 1 ) && self.onStopped ) { self.onStopped(); } if( ( self.runningTasks == 1 ) && self.onStopped ) { self.onStopped(); }
} }
self.returnToPool( worker ); self.returnToPool( worker );
cb();
}); });
}; };