61 lines
1.3 KiB
GDScript3
61 lines
1.3 KiB
GDScript3
|
|
class_name Trampoline
|
||
|
|
|
||
|
|
var _idle : bool
|
||
|
|
var _queue : PriorityQueue
|
||
|
|
var _lock : Lock
|
||
|
|
var _condition : ConditionalVariable
|
||
|
|
|
||
|
|
func _init():
|
||
|
|
self._idle = true
|
||
|
|
self._queue = PriorityQueue.new()
|
||
|
|
self._lock = Lock.new()
|
||
|
|
self._condition = ConditionalVariable.new()
|
||
|
|
|
||
|
|
func idle() -> bool:
|
||
|
|
var __ = LockGuard.new(self._lock)
|
||
|
|
return self._idle
|
||
|
|
|
||
|
|
func run(item : ScheduledItem):
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self._lock)
|
||
|
|
self._queue.enqueue(item)
|
||
|
|
if self._idle:
|
||
|
|
self._idle = false
|
||
|
|
else:
|
||
|
|
self._condition.notify()
|
||
|
|
return
|
||
|
|
|
||
|
|
GDRx.try(self._run).end_try_catch()
|
||
|
|
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self._lock)
|
||
|
|
self._idle = true
|
||
|
|
self._queue.clear()
|
||
|
|
|
||
|
|
func _run():
|
||
|
|
var ready : Array[ScheduledItem] = []
|
||
|
|
while true:
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self._lock)
|
||
|
|
while(self._queue.size() > 0):
|
||
|
|
var item : ScheduledItem = self._queue.peek()
|
||
|
|
if item.duetime <= item.scheduler.now():
|
||
|
|
self._queue.dequeue()
|
||
|
|
ready.append(item)
|
||
|
|
else:
|
||
|
|
break
|
||
|
|
|
||
|
|
while ready.size() > 0:
|
||
|
|
var item : ScheduledItem = ready.pop_front()
|
||
|
|
if not item.is_cancelled():
|
||
|
|
item.invoke()
|
||
|
|
|
||
|
|
if true:
|
||
|
|
var __ = LockGuard.new(self._lock)
|
||
|
|
if self._queue.size() == 0:
|
||
|
|
break
|
||
|
|
var item : ScheduledItem = self._queue.peek()
|
||
|
|
var seconds = item.duetime - item.scheduler.now()
|
||
|
|
if seconds > 0.0:
|
||
|
|
self._condition.wait_for(self._lock, seconds)
|