public void service(long dt)
    {
        if(!enabled) return;
        
        time += dt;        
        while(root != null && root.time_start <= time) {
            // fire up the first from the queue:
            Job job = root;
            long next = -1;
            
            if(!job.stop)
                next = job.execute(time - job.time_start);            
            
            boolean stop = job.stop; // save it for now
            // remove it from queue for now
            root = root.next;
            job.next = null;
            
            if(next > 0) {
                job.time_start = Math.max(time + 1, job.time_start + next);
                insert_job(job);
            } else {
                // call onFinish
                job.onFinish();
                
                // insert possible tail
                final Job tail = job.tail;
                
                if(tail != null) {
                    // remember old data
                    final Job tmp = tail.tail;
                    stop |= tail.stop;
                    
                    // add
                    add(tail, tail.time_tail);
                    
                    // re-insert old stuff
                    tail.tail = tmp;
                    tail.stop = stop;
                }
                
                // reset used job
                job.reset();                
                
                // return back to pool?
                if(job.pool != null) 
                    job.pool.put(job);
                
            }            
        }
    }