map.mx raw

   1  package sync
   2  
   3  import "internal/task"
   4  
   5  // This file implements just enough of sync.Map to get packages to compile. It
   6  // is no more efficient than a map with a lock.
   7  
   8  type Map struct {
   9  	lock task.PMutex
  10  	m    map[interface{}]interface{}
  11  }
  12  
  13  func (m *Map) Delete(key interface{}) {
  14  	m.lock.Lock()
  15  	defer m.lock.Unlock()
  16  	delete(m.m, key)
  17  }
  18  
  19  func (m *Map) Load(key interface{}) (value interface{}, ok bool) {
  20  	m.lock.Lock()
  21  	defer m.lock.Unlock()
  22  	value, ok = m.m[key]
  23  	return
  24  }
  25  
  26  func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) {
  27  	m.lock.Lock()
  28  	defer m.lock.Unlock()
  29  	if m.m == nil {
  30  		m.m = map[interface{}]interface{}{}
  31  	}
  32  	if existing, ok := m.m[key]; ok {
  33  		return existing, true
  34  	}
  35  	m.m[key] = value
  36  	return value, false
  37  }
  38  
  39  func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) {
  40  	m.lock.Lock()
  41  	defer m.lock.Unlock()
  42  	value, ok := m.m[key]
  43  	if !ok {
  44  		return nil, false
  45  	}
  46  	delete(m.m, key)
  47  	return value, true
  48  }
  49  
  50  func (m *Map) Store(key, value interface{}) {
  51  	m.lock.Lock()
  52  	defer m.lock.Unlock()
  53  	if m.m == nil {
  54  		m.m = map[interface{}]interface{}{}
  55  	}
  56  	m.m[key] = value
  57  }
  58  
  59  func (m *Map) Range(f func(key, value interface{}) bool) {
  60  	m.lock.Lock()
  61  	defer m.lock.Unlock()
  62  
  63  	if m.m == nil {
  64  		return
  65  	}
  66  
  67  	for k, v := range m.m {
  68  		if !f(k, v) {
  69  			break
  70  		}
  71  	}
  72  }
  73  
  74  // Swap replaces the value for the given key, and returns the old value if any.
  75  func (m *Map) Swap(key, value any) (previous any, loaded bool) {
  76  	m.lock.Lock()
  77  	defer m.lock.Unlock()
  78  	if m.m == nil {
  79  		m.m = map[interface{}]interface{}{}
  80  	}
  81  	previous, loaded = m.m[key]
  82  	m.m[key] = value
  83  	return
  84  }
  85