aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--funcs.go6
-rw-r--r--tx.go7
-rw-r--r--var.go11
3 files changed, 14 insertions, 10 deletions
diff --git a/funcs.go b/funcs.go
index 3d89cc5..bd7f0e9 100644
--- a/funcs.go
+++ b/funcs.go
@@ -69,9 +69,9 @@ func AtomicGet(v *Var) interface{} {
// AtomicSet is a helper function that atomically writes a value.
func AtomicSet(v *Var, val interface{}) {
- Atomically(func(tx *Tx) {
- tx.Set(v, val)
- })
+ v.mu.Lock()
+ v.changeValue(val)
+ v.mu.Unlock()
}
// Compose is a helper function that composes multiple transactions into a
diff --git a/tx.go b/tx.go
index beb4cbb..4b6edf8 100644
--- a/tx.go
+++ b/tx.go
@@ -30,13 +30,6 @@ func (tx *Tx) verify() bool {
func (tx *Tx) commit() {
for v, val := range tx.writes {
v.changeValue(val)
- v.watchers.Range(func(k, _ interface{}) bool {
- tx := k.(*Tx)
- tx.mu.Lock()
- tx.cond.Broadcast()
- tx.mu.Unlock()
- return true
- })
}
}
diff --git a/var.go b/var.go
index 4859643..facad56 100644
--- a/var.go
+++ b/var.go
@@ -19,6 +19,17 @@ func (v *Var) loadState() varSnapshot {
func (v *Var) changeValue(new interface{}) {
version := v.loadState().version
v.state.Store(varSnapshot{version: version + 1, val: new})
+ v.wakeWatchers()
+}
+
+func (v *Var) wakeWatchers() {
+ v.watchers.Range(func(k, _ interface{}) bool {
+ tx := k.(*Tx)
+ tx.mu.Lock()
+ tx.cond.Broadcast()
+ tx.mu.Unlock()
+ return true
+ })
}
type varSnapshot struct {