From 47e5cc608cded44f87c3120fd76fa31a9b8a8867 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Wed, 30 Sep 2020 18:12:44 +1000 Subject: Don't sleep and only wake watchers if the variable value has changed --- var.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'var.go') diff --git a/var.go b/var.go index cdf9667..7e50cac 100644 --- a/var.go +++ b/var.go @@ -13,13 +13,20 @@ type Var struct { } func (v *Var) changeValue(new interface{}) { - v.value.Store(v.value.Load().(VarValue).Set(new)) - v.wakeWatchers() + old := v.value.Load().(VarValue) + newVarValue := old.Set(new) + v.value.Store(newVarValue) + if old.Changed(newVarValue) { + v.wakeWatchers() + } } func (v *Var) wakeWatchers() { v.watchers.Range(func(k, _ interface{}) bool { tx := k.(*Tx) + + // We have to lock here to ensure that the Tx is waiting before we signal it. Otherwise we + // could signal it before it goes to sleep and it will miss the notification. tx.mu.Lock() tx.cond.Broadcast() tx.mu.Unlock() -- cgit v1.2.3