diff options
author | 2024-10-02 10:58:20 +0000 | |
---|---|---|
committer | 2024-10-02 10:58:20 +0000 | |
commit | c17abea92162f0ac1ccfff4223e26eac431c1198 (patch) | |
tree | ac9809f327136590a5c239c8f9594c1fea1ad989 /vendor/codeberg.org/gruf/go-structr/index.go | |
parent | [chore]: Bump go.uber.org/automaxprocs from 1.5.3 to 1.6.0 (#3376) (diff) | |
download | gotosocial-c17abea92162f0ac1ccfff4223e26eac431c1198.tar.xz |
update go-structr to v0.8.11 (#3380)
Diffstat (limited to 'vendor/codeberg.org/gruf/go-structr/index.go')
-rw-r--r-- | vendor/codeberg.org/gruf/go-structr/index.go | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/vendor/codeberg.org/gruf/go-structr/index.go b/vendor/codeberg.org/gruf/go-structr/index.go index 127bddb1f..558832da9 100644 --- a/vendor/codeberg.org/gruf/go-structr/index.go +++ b/vendor/codeberg.org/gruf/go-structr/index.go @@ -197,8 +197,13 @@ func (i *Index) get(key string, hook func(*indexed_item)) { return } - // Iterate all entries in list. - l.rangefn(func(elem *list_elem) { + // Iterate the list. + for elem := l.head; // + elem != nil; // + { + // Get next before + // any modification. + next := elem.next // Extract element entry + item. entry := (*index_entry)(elem.data) @@ -206,18 +211,21 @@ func (i *Index) get(key string, hook func(*indexed_item)) { // Pass to hook. hook(item) - }) + + // Set next. + elem = next + } } // key uses hasher to generate Key{} from given raw parts. func (i *Index) key(buf *byteutil.Buffer, parts []unsafe.Pointer) string { + buf.B = buf.B[:0] if len(parts) != len(i.fields) { panicf("incorrect number key parts: want=%d received=%d", len(i.fields), len(parts), ) } - buf.B = buf.B[:0] if !allow_zero(i.flags) { for x, field := range i.fields { before := len(buf.B) @@ -301,8 +309,13 @@ func (i *Index) delete(key string, hook func(*indexed_item)) { // Delete at hash. i.data.Delete(key) - // Iterate entries in list. - l.rangefn(func(elem *list_elem) { + // Iterate the list. + for elem := l.head; // + elem != nil; // + { + // Get next before + // any modification. + next := elem.next // Remove elem. l.remove(elem) @@ -319,7 +332,10 @@ func (i *Index) delete(key string, hook func(*indexed_item)) { // Pass to hook. hook(item) - }) + + // Set next. + elem = next + } // Release list. free_list(l) @@ -375,17 +391,21 @@ var index_entry_pool sync.Pool func new_index_entry() *index_entry { v := index_entry_pool.Get() if v == nil { - v = new(index_entry) + e := new(index_entry) + e.elem.data = unsafe.Pointer(e) + v = e } entry := v.(*index_entry) - ptr := unsafe.Pointer(entry) - entry.elem.data = ptr return entry } // free_index_entry releases the index_entry. func free_index_entry(entry *index_entry) { - entry.elem.data = nil + if entry.elem.next != nil || + entry.elem.prev != nil { + should_not_reach() + return + } entry.key = "" entry.index = nil entry.item = nil |