| 
									
										
										
										
											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 08:15:45 +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...
 | 
					
						
							| 
									
										
										
										
											2014-01-22 03:01:13 +04:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | // XXX add a clean removal scheme...
 | 
					
						
							|  |  |  | // XXX should this have a pause button???
 | 
					
						
							|  |  |  | function makeWorkerProgressBar(name, worker, parent){ | 
					
						
							|  |  |  | 	parent = parent == null ? $('.viewer') : parent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// widget container...
 | 
					
						
							|  |  |  | 	var container = parent.find('.progress-container') | 
					
						
							|  |  |  | 	if(container.length == 0){ | 
					
						
							|  |  |  | 		container = $('<div class="progress-container"/>') | 
					
						
							|  |  |  | 			.appendTo(parent) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-09-25 02:08:25 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 	var widget = $('.progress-bar[name="'+name+'"]') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// a progress bar already exists, reset it and return...
 | 
					
						
							|  |  |  | 	if(widget.length > 0){ | 
					
						
							|  |  |  | 		widget | 
					
						
							|  |  |  | 			.css('display', '') | 
					
						
							|  |  |  | 			.find('.close') | 
					
						
							|  |  |  | 				.css('display', '') | 
					
						
							|  |  |  | 		widget.find('progress') | 
					
						
							|  |  |  | 			.attr({ | 
					
						
							|  |  |  | 				value: '', | 
					
						
							| 
									
										
										
										
											2014-01-23 08:21:34 +04:00
										 |  |  | 				max: '', | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		return worker | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// fields we'll need to update...
 | 
					
						
							|  |  |  | 	var state = $('<span class="state"/>') | 
					
						
							|  |  |  | 	var bar = $('<progress/>') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// the progress bar widget...
 | 
					
						
							|  |  |  | 	var widget = $('<div class="progress-bar" name="'+name+'">'+name+'</div>') | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 		// progress state...
 | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 		.append(state) | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 		// the close button...
 | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 		.append($('<span class="close">×</span>') | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 			.click(function(){ | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 				$(this).hide() | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 				WORKERS[name] | 
					
						
							|  |  |  | 					.dropQueue() | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 			})) | 
					
						
							|  |  |  | 		.append(bar) | 
					
						
							|  |  |  | 		.appendTo(container) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// re get the fields...
 | 
					
						
							|  |  |  | 	bar = $(bar[0]) | 
					
						
							|  |  |  | 	state = $(state[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	worker | 
					
						
							|  |  |  | 		.progress(function(done, total){ | 
					
						
							|  |  |  | 			bar.attr({ | 
					
						
							|  |  |  | 				value: done, | 
					
						
							|  |  |  | 				max: total | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 			state.text(' ('+done+' of '+total+')') | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.depleted(function(done){ | 
					
						
							|  |  |  | 			bar.attr('value', done) | 
					
						
							|  |  |  | 			state.text(' (done)') | 
					
						
							| 
									
										
										
										
											2014-01-23 07:26:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 08:15:45 +04:00
										 |  |  | 			setTimeout(function(){ | 
					
						
							|  |  |  | 				widget.hide() | 
					
						
							|  |  |  | 			}, 1500) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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.... (???)
 | 
					
						
							|  |  |  | function getWorkerQueue(name, pool_size, no_auto_start, no_progress){ | 
					
						
							|  |  |  | 	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){ | 
					
						
							|  |  |  | 		makeWorkerProgressBar(name, queue) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-23 08:15:45 +04:00
										 |  |  | 			$('.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 :                                                */ |