| 
									
										
										
										
											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 :                                                */ |