2013-09-25 02:08:25 +04:00
|
|
|
/**********************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Deferred worker API
|
|
|
|
|
*
|
|
|
|
|
* NOTE: at this point this only contains a worker queue...
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
|
|
|
// object to register all the worker queues...
|
|
|
|
|
var WORKERS = {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-23 08:15:45 +04:00
|
|
|
/**************************************************** Progress bar ***/
|
2013-09-25 02:08:25 +04:00
|
|
|
|
2014-01-23 09:13:59 +04:00
|
|
|
// NOTE: if the progress widget gets removed without removing the worker
|
|
|
|
|
// this will result in dangling handlers for the previous widget...
|
|
|
|
|
// i.e. handlers that still reverence the original widget...
|
|
|
|
|
//
|
|
|
|
|
// XXX add a clean removal scheme...
|
|
|
|
|
// XXX should this have a pause button???
|
2014-01-24 21:11:56 +04:00
|
|
|
// XXX make this understand deferred workers...
|
2014-01-23 09:13:59 +04:00
|
|
|
function getWorkerProgressBar(name, worker, container){
|
|
|
|
|
container = container == null
|
2014-01-25 00:50:21 +04:00
|
|
|
? getProgressContainer()
|
2014-01-23 09:13:59 +04:00
|
|
|
: container
|
|
|
|
|
|
2014-01-25 00:50:21 +04:00
|
|
|
var widget = getProgressBar(name)
|
|
|
|
|
|
|
|
|
|
if(widget.length == 0){
|
2014-01-25 02:07:21 +04:00
|
|
|
widget = progressBar(
|
|
|
|
|
name,
|
|
|
|
|
container,
|
|
|
|
|
function(){
|
2014-01-25 00:50:21 +04:00
|
|
|
WORKERS[name].dropQueue()
|
2014-02-13 05:46:46 +04:00
|
|
|
},
|
|
|
|
|
null,
|
|
|
|
|
true)
|
2014-01-23 08:15:45 +04:00
|
|
|
|
2014-01-25 00:50:21 +04:00
|
|
|
worker
|
|
|
|
|
.progress(function(done, total){
|
|
|
|
|
widget.trigger('progressUpdate', [done, total])
|
2014-01-23 07:26:45 +04:00
|
|
|
})
|
2014-01-25 00:50:21 +04:00
|
|
|
.depleted(function(done){
|
|
|
|
|
widget.trigger('progressDone', [done])
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
resetProgressBar(widget)
|
|
|
|
|
}
|
2014-01-23 08:15:45 +04:00
|
|
|
|
|
|
|
|
return worker
|
|
|
|
|
}
|
2014-01-23 06:56:17 +04:00
|
|
|
|
2014-01-23 08:15:45 +04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************* Workers ***/
|
|
|
|
|
|
|
|
|
|
// get/create a named worker queue...
|
|
|
|
|
//
|
|
|
|
|
// XXX rename this to something task-related.... (???)
|
2014-02-13 05:46:46 +04:00
|
|
|
function getWorkerQueue(name, pool_size, container, no_auto_start, no_progress, auto_clear){
|
2014-01-23 08:15:45 +04:00
|
|
|
pool_size = pool_size == null ? 1 : pool_size
|
2014-01-23 06:56:17 +04:00
|
|
|
|
2013-09-25 02:08:25 +04:00
|
|
|
// create a new worker queue...
|
|
|
|
|
if(WORKERS[name] == null){
|
2014-01-22 03:01:13 +04:00
|
|
|
var queue = makeDeferredPool(pool_size, no_auto_start)
|
2013-09-25 02:08:25 +04:00
|
|
|
WORKERS[name] = queue
|
|
|
|
|
|
|
|
|
|
// return existing worker queue...
|
|
|
|
|
} else {
|
|
|
|
|
var queue = WORKERS[name]
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-23 08:15:45 +04:00
|
|
|
if(!no_progress){
|
2014-01-24 06:48:10 +04:00
|
|
|
getWorkerProgressBar(name, queue, container)
|
2014-01-23 08:15:45 +04:00
|
|
|
}
|
|
|
|
|
|
2013-09-25 02:08:25 +04:00
|
|
|
return queue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2014-01-23 06:56:17 +04:00
|
|
|
// Kill all worker queues...
|
|
|
|
|
//
|
2014-01-23 07:04:17 +04:00
|
|
|
// Returns a deffered that will get resolved when all workers are
|
2014-01-23 06:56:17 +04:00
|
|
|
// actually stopped...
|
2014-01-23 07:04:17 +04:00
|
|
|
//
|
|
|
|
|
// NOTE: this will not stop the already started tasks, just drop all
|
|
|
|
|
// worker queues, thus it may take some time for workers to
|
|
|
|
|
// actually stop...
|
|
|
|
|
// NOTE: if no workers are loaded or all are already done, the deferred
|
|
|
|
|
// returned will be resolved...
|
2014-01-23 08:15:45 +04:00
|
|
|
// NOTE: this will also kill paused workers...
|
2013-09-25 02:08:25 +04:00
|
|
|
function killAllWorkers(){
|
2014-01-23 06:56:17 +04:00
|
|
|
var res = $.Deferred()
|
|
|
|
|
var w = []
|
2014-01-23 07:04:17 +04:00
|
|
|
|
2014-01-23 06:56:17 +04:00
|
|
|
Object.keys(WORKERS).forEach(function(k){
|
2014-01-22 03:01:13 +04:00
|
|
|
if(WORKERS[k].isRunning()){
|
2014-01-23 06:56:17 +04:00
|
|
|
var wd = $.Deferred()
|
|
|
|
|
w.push(wd)
|
|
|
|
|
WORKERS[k]
|
|
|
|
|
.depleted(function(){
|
|
|
|
|
console.log('Worker: Stopped:', k)
|
|
|
|
|
wd.resolve()
|
|
|
|
|
})
|
2013-09-25 02:08:25 +04:00
|
|
|
}
|
2014-01-23 06:56:17 +04:00
|
|
|
WORKERS[k]
|
|
|
|
|
.dropQueue()
|
|
|
|
|
})
|
2013-09-25 02:08:25 +04:00
|
|
|
WORKERS = {}
|
2014-01-23 06:56:17 +04:00
|
|
|
|
2014-01-23 07:04:17 +04:00
|
|
|
// resolve the deferred as soon as ALL the workers are done...
|
2014-01-23 06:56:17 +04:00
|
|
|
$.when.apply(null, w)
|
|
|
|
|
.done(function(){
|
|
|
|
|
console.log('Worker: All workers stopped.')
|
|
|
|
|
res.resolve()
|
2014-01-29 07:27:07 +04:00
|
|
|
// XXX do we need this???
|
|
|
|
|
//$('.progress-bar').remove()
|
2014-01-23 06:56:17 +04:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return res
|
2013-09-25 02:08:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-22 03:01:13 +04:00
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-09-25 02:08:25 +04:00
|
|
|
/**********************************************************************
|
|
|
|
|
* vim:set ts=4 sw=4 : */
|