public JobHandle Submit(Group group, ThreadStart job, long initialDelayNanos, long reschedulingDelayNanos) { long now = _clock.nanos(); long nextDeadlineNanos = now + initialDelayNanos; ScheduledJobHandle task = new ScheduledJobHandle(this, group, job, nextDeadlineNanos, reschedulingDelayNanos); EnqueueTask(task); return(task); }
private long ScheduleDueTasks(long now) { if (_delayedTasks.Empty) { // We have no tasks to run. Park until we're woken up by an enqueueTask() call. return(_noTasksPark); } while (!_stopped && !_delayedTasks.Empty && _delayedTasks.peek().nextDeadlineNanos <= now) { ScheduledJobHandle task = _delayedTasks.poll(); task.SubmitIfRunnable(_pools); } return(_delayedTasks.Empty ? _noTasksPark : _delayedTasks.peek().nextDeadlineNanos - now); }
internal void EnqueueTask(ScheduledJobHandle newTasks) { _delayedTasks.offer(newTasks); LockSupport.unpark(_timeKeeper); }