diff options
author | Matt Joiner <anacrolix@gmail.com> | 2021-03-11 10:16:25 +1100 |
---|---|---|
committer | Matt Joiner <anacrolix@gmail.com> | 2021-03-11 10:16:25 +1100 |
commit | 45c211559de69c973e4c751be4ea6cc148c8ee90 (patch) | |
tree | 2ea7ac5ccb1c653baed992611205f859569f3dd1 /funcs.go | |
parent | Only wake Tx if they're still reading a modified value (diff) | |
download | stm-45c211559de69c973e4c751be4ea6cc148c8ee90.tar.gz stm-45c211559de69c973e4c751be4ea6cc148c8ee90.tar.xz |
Add AtomicModify
Diffstat (limited to 'funcs.go')
-rw-r--r-- | funcs.go | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -2,6 +2,7 @@ package stm import ( "math/rand" + "reflect" "runtime/pprof" "sync" "time" @@ -162,3 +163,15 @@ func VoidOperation(f func(*Tx)) Operation { return nil } } + +func AtomicModify(v *Var, f interface{}) { + r := reflect.ValueOf(f) + Atomically(VoidOperation(func(tx *Tx) { + cur := reflect.ValueOf(tx.Get(v)) + out := r.Call([]reflect.Value{cur}) + if lenOut := len(out); lenOut != 1 { + panic(lenOut) + } + tx.Set(v, out[0].Interface()) + })) +} |