A map using a lock-free concurrency using left-right algo, written in Go

k, v -> key, value

authored by

Johannes Kohnen and committed by joh.dev 9e50f29f aac2b9f9

+25 -25
+25 -25
lrmap.go
··· 42 42 return m 43 43 } 44 44 45 - func (m *LRMap) Set(k Key, v Value) { 45 + func (m *LRMap) Set(key Key, value Value) { 46 46 m.mu.Lock() 47 47 defer m.mu.Unlock() 48 48 49 - (*(m.writeMap))[k] = v 49 + (*(m.writeMap))[key] = value 50 50 51 - m.redoLog = append(m.redoLog, operation{typ: opSet, key: k, value: &v}) 51 + m.redoLog = append(m.redoLog, operation{typ: opSet, key: key, value: &value}) 52 52 } 53 53 54 - func (m *LRMap) Delete(k Key) { 54 + func (m *LRMap) Delete(key Key) { 55 55 m.mu.Lock() 56 56 defer m.mu.Unlock() 57 57 58 - delete(*(m.writeMap), k) 58 + delete(*(m.writeMap), key) 59 59 60 60 // nolint:exhaustivestruct 61 - m.redoLog = append(m.redoLog, operation{typ: opDelete, key: k}) 61 + m.redoLog = append(m.redoLog, operation{typ: opDelete, key: key}) 62 62 } 63 63 64 - func (m *LRMap) Get(k Key) Value { 65 - v, _ := m.GetOK(k) 64 + func (m *LRMap) Get(key Key) Value { 65 + value, _ := m.GetOK(key) 66 66 67 - return v 67 + return value 68 68 } 69 69 70 - func (m *LRMap) GetOK(k Key) (Value, bool) { 70 + func (m *LRMap) GetOK(key Key) (Value, bool) { 71 71 m.mu.Lock() 72 72 defer m.mu.Unlock() 73 73 74 - v, ok := (*m.writeMap)[k] 74 + value, ok := (*m.writeMap)[key] 75 75 76 - return v, ok 76 + return value, ok 77 77 } 78 78 79 79 func (m *LRMap) Flush() { ··· 218 218 ready bool 219 219 } 220 220 221 - func (rh *ReadHandler) Enter() { rh.assertReady(); rh.inner.enter() } 222 - func (rh *ReadHandler) Leave() { rh.assertReady(); rh.inner.leave() } 223 - func (rh *ReadHandler) Get(k Key) Value { rh.assertReady(); return rh.inner.get(k) } 224 - func (rh *ReadHandler) GetOK(k Key) (Value, bool) { rh.assertReady(); return rh.inner.getOK(k) } 225 - func (rh *ReadHandler) Len() int { rh.assertReady(); return rh.inner.len() } 221 + func (rh *ReadHandler) Enter() { rh.assertReady(); rh.inner.enter() } 222 + func (rh *ReadHandler) Leave() { rh.assertReady(); rh.inner.leave() } 223 + func (rh *ReadHandler) Get(key Key) Value { rh.assertReady(); return rh.inner.get(key) } 224 + func (rh *ReadHandler) GetOK(key Key) (Value, bool) { rh.assertReady(); return rh.inner.getOK(key) } 225 + func (rh *ReadHandler) Len() int { rh.assertReady(); return rh.inner.len() } 226 226 227 227 func (rh *ReadHandler) Iterate(fn func(k Key, v Value) bool) { 228 228 rh.assertReady() ··· 231 231 panic("reader illegal state: must call Enter() before iterating") 232 232 } 233 233 234 - for k, v := range rh.inner.live { 235 - if ok := fn(k, v); !ok { 234 + for key, value := range rh.inner.live { 235 + if ok := fn(key, value); !ok { 236 236 return 237 237 } 238 238 } ··· 293 293 atomic.AddUint64(&r.epoch, 1) 294 294 } 295 295 296 - func (r *readHandlerInner) get(k Key) Value { 297 - v, _ := r.getOK(k) 296 + func (r *readHandlerInner) get(key Key) Value { 297 + value, _ := r.getOK(key) 298 298 299 - return v 299 + return value 300 300 } 301 301 302 - func (r *readHandlerInner) getOK(k Key) (Value, bool) { 302 + func (r *readHandlerInner) getOK(key Key) (Value, bool) { 303 303 if !r.entered() { 304 304 panic("reader illegal state: must Enter() before operating on data") 305 305 } 306 306 307 - v, ok := r.live[k] 307 + value, ok := r.live[key] 308 308 309 - return v, ok 309 + return value, ok 310 310 } 311 311 312 312 func (r *readHandlerInner) len() int {