aboutsummaryrefslogtreecommitdiff
path: root/includes/js/dojox/timing/ThreadPool.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/timing/ThreadPool.js')
-rw-r--r--includes/js/dojox/timing/ThreadPool.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/includes/js/dojox/timing/ThreadPool.js b/includes/js/dojox/timing/ThreadPool.js
new file mode 100644
index 0000000..2166a7d
--- /dev/null
+++ b/includes/js/dojox/timing/ThreadPool.js
@@ -0,0 +1,157 @@
+if(!dojo._hasResource["dojox.timing.ThreadPool"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.timing.ThreadPool"] = true;
+dojo.provide("dojox.timing.ThreadPool");
+dojo.require("dojox.timing");
+
+dojo.experimental("dojox.timing.ThreadPool");
+
+// dojox.timing.Timer is included as part of _base
+/********************************************************************
+ This is a port of the original System.Threading.ThreadPool from
+ the f(m) class library.
+
+ Donated to the Dojo toolkit by the author :)
+*********************************************************************/
+(function(){
+ var t=dojox.timing;
+ t.threadStates={
+ UNSTARTED:"unstarted",
+ STOPPED:"stopped",
+ PENDING:"pending",
+ RUNNING:"running",
+ SUSPENDED:"suspended",
+ WAITING:"waiting",
+ COMPLETE:"complete",
+ ERROR:"error"
+ };
+
+ // Before rar says a word, we actually *use* these numbers for a purpose :)
+ t.threadPriorities={
+ LOWEST:1,
+ BELOWNORMAL:2,
+ NORMAL:3,
+ ABOVENORMAL:4,
+ HIGHEST:5
+ };
+
+ t.Thread=function(/* Function */fn, /* dojox.timing.threadPriorities? */priority){
+ var self=this;
+ this.state=t.threadStates.UNSTARTED;
+ this.priority=priority||t.threadPriorities.NORMAL;
+ this.lastError=null;
+ this.func=fn; // for lookup purposes.
+ this.invoke=function(){
+ self.state=t.threadStates.RUNNING;
+ try{
+ fn(this);
+ self.state=t.threadStates.COMPLETE;
+ }catch(e){
+ self.lastError=e;
+ self.state=t.threadStates.ERROR;
+ }
+ };
+ };
+
+ // TODO: allow for changing of maxThreads and tick interval
+ t.ThreadPool=new (function(/* Number */mxthrs, /* Number */intvl){
+ var self=this;
+ var maxThreads=mxthrs;
+ var availableThreads=maxThreads;
+ var interval=intvl;
+ var fireInterval=Math.floor((interval/2)/maxThreads);
+ var queue=[];
+ var timers=new Array(maxThreads+1);
+ var timer=new dojox.timing.Timer();
+ var invoke=function(){
+ var tracker=timers[0]={};
+ for(var i=0; i<timers.length; i++){
+ window.clearTimeout(timers[i]);
+ var thread=queue.shift();
+ if(typeof(thread)=="undefined"){ break; }
+ tracker["thread-"+i]=thread;
+ timers[i]=window.setTimeout(thread.invoke,(fireInterval*i));
+ }
+ availableThreads=maxThreads-(i-1);
+ };
+
+ // public methods
+ this.getMaxThreads=function(){ return maxThreads; };
+ this.getAvailableThreads=function(){ return availableThreads; };
+ this.getTickInterval=function(){ return interval; };
+ this.queueUserWorkItem=function(/* Function || dojox.timing.Thread */fn){
+ var item=fn;
+ if(item instanceof Function){
+ item=new t.Thread(item);
+ }
+ var idx=queue.length;
+ for(var i=0; i<queue.length; i++){
+ if(queue[i].priority<item.priority){
+ idx=i;
+ break;
+ }
+ }
+ if(idx<queue.length){
+ queue.splice(idx, 0, item);
+ } else {
+ queue.push(item);
+ }
+ return true;
+ };
+ this.removeQueuedUserWorkItem=function(/* Function || dojox.timing.Thread */item){
+ if(item instanceof Function){
+ var idx=-1;
+ for(var i=0; i<queue.length; i++){
+ if(queue[i].func==item){
+ idx=i;
+ break;
+ }
+ }
+ if(idx>-1){
+ queue.splice(idx,1);
+ return true;
+ }
+ return false;
+ }
+
+ var idx=-1;
+ for(var i=0; i<queue.length; i++){
+ if(queue[i]==item){
+ idx=i;
+ break;
+ }
+ }
+ if(idx>-1){
+ queue.splice(idx,1);
+ return true;
+ }
+ return false;
+ };
+ this.start=function(){ timer.start(); };
+ this.stop=function(){ timer.stop(); };
+ this.abort=function(){
+ this.stop();
+ for(var i=1; i<timers.length; i++){
+ if(timers[i]){
+ window.clearTimeout(timers[i]);
+ }
+ }
+ for(var thread in timers[0]){
+ this.queueUserWorkItem(thread);
+ }
+ timers[0]={};
+ };
+ this.reset=function(){
+ this.abort();
+ queue=[];
+ };
+ this.sleep=function(/* Number */nSleep){
+ timer.stop();
+ window.setTimeout(timer.start, nSleep);
+ };
+
+ // dedicate the timer to us.
+ timer.onTick=self.invoke;
+ })(16, 5000);
+})();
+
+}