mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 03:27:48 +00:00
runtime: avoid an allocation in (*time.Timer).Reset
This commit is contained in:
@@ -39,20 +39,17 @@ func timerQueueAdd(tn *timerNode) {
|
||||
*q = tn
|
||||
}
|
||||
|
||||
func timerQueueRemove(t *timer) bool {
|
||||
removedTimer := false
|
||||
func timerQueueRemove(t *timer) *timerNode {
|
||||
for q := &timerQueue; *q != nil; q = &(*q).next {
|
||||
if (*q).timer == t {
|
||||
scheduleLog("removed timer")
|
||||
n := *q
|
||||
*q = (*q).next
|
||||
removedTimer = true
|
||||
break
|
||||
return n
|
||||
}
|
||||
}
|
||||
if !removedTimer {
|
||||
scheduleLog("did not remove timer")
|
||||
}
|
||||
return removedTimer
|
||||
scheduleLog("did not remove timer")
|
||||
return nil
|
||||
}
|
||||
|
||||
// Goexit terminates the currently running goroutine. No other goroutines are affected.
|
||||
|
||||
@@ -117,11 +117,11 @@ func addTimer(tim *timerNode) {
|
||||
|
||||
// removeTimer is the implementation of time.stopTimer. It removes a timer from
|
||||
// the timer queue, returning true if the timer is present in the timer queue.
|
||||
func removeTimer(tim *timer) bool {
|
||||
func removeTimer(tim *timer) *timerNode {
|
||||
mask := interrupt.Disable()
|
||||
removedTimer := timerQueueRemove(tim)
|
||||
n := timerQueueRemove(tim)
|
||||
interrupt.Restore(mask)
|
||||
return removedTimer
|
||||
return n
|
||||
}
|
||||
|
||||
func schedulerRunQueue() *task.Queue {
|
||||
|
||||
@@ -56,9 +56,9 @@ func addTimer(tim *timerNode) {
|
||||
runtimePanic("timers not supported without a scheduler")
|
||||
}
|
||||
|
||||
func removeTimer(tim *timer) bool {
|
||||
func removeTimer(tim *timer) *timerNode {
|
||||
runtimePanic("timers not supported without a scheduler")
|
||||
return false
|
||||
return nil
|
||||
}
|
||||
|
||||
func schedulerRunQueue() *task.Queue {
|
||||
|
||||
@@ -110,11 +110,11 @@ func addTimer(tim *timerNode) {
|
||||
timerQueueLock.Unlock()
|
||||
}
|
||||
|
||||
func removeTimer(tim *timer) bool {
|
||||
func removeTimer(tim *timer) *timerNode {
|
||||
timerQueueLock.Lock()
|
||||
removed := timerQueueRemove(tim)
|
||||
n := timerQueueRemove(tim)
|
||||
timerQueueLock.Unlock()
|
||||
return removed
|
||||
return n
|
||||
}
|
||||
|
||||
func schedulerRunQueue() *task.Queue {
|
||||
|
||||
@@ -53,13 +53,13 @@ func startTimer(tim *timer) {
|
||||
|
||||
//go:linkname stopTimer time.stopTimer
|
||||
func stopTimer(tim *timer) bool {
|
||||
return removeTimer(tim)
|
||||
return removeTimer(tim) != nil
|
||||
}
|
||||
|
||||
//go:linkname resetTimer time.resetTimer
|
||||
func resetTimer(tim *timer, when int64) bool {
|
||||
tim.when = when
|
||||
removed := removeTimer(tim)
|
||||
n := removeTimer(tim)
|
||||
startTimer(tim)
|
||||
return removed
|
||||
return n != nil
|
||||
}
|
||||
|
||||
@@ -52,17 +52,20 @@ func newTimer(when, period int64, f func(arg any, seq uintptr, delta int64), arg
|
||||
|
||||
//go:linkname stopTimer time.stopTimer
|
||||
func stopTimer(tim *timeTimer) bool {
|
||||
return removeTimer(&tim.timer)
|
||||
return removeTimer(&tim.timer) != nil
|
||||
}
|
||||
|
||||
//go:linkname resetTimer time.resetTimer
|
||||
func resetTimer(t *timeTimer, when, period int64) bool {
|
||||
t.timer.when = when
|
||||
t.timer.period = period
|
||||
removed := removeTimer(&t.timer)
|
||||
addTimer(&timerNode{
|
||||
timer: &t.timer,
|
||||
callback: timerCallback,
|
||||
})
|
||||
n := removeTimer(&t.timer)
|
||||
removed := n != nil
|
||||
if n == nil {
|
||||
n = new(timerNode)
|
||||
}
|
||||
n.timer = &t.timer
|
||||
n.callback = timerCallback
|
||||
addTimer(n)
|
||||
return removed
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user