File tree 3 files changed +27
-37
lines changed
3 files changed +27
-37
lines changed Original file line number Diff line number Diff line change @@ -58,26 +58,20 @@ func additabs(module *moduledata) {
58
58
unlock (& itabLock )
59
59
}
60
60
61
- func removeitab ( inter * interfacetype , typ * _type ) bool {
61
+ func removeitabs ( module * moduledata ) bool {
62
62
lock (& itabLock )
63
63
defer unlock (& itabLock )
64
- mask := itabTable .size - 1
65
- h := itabHashFunc (inter , typ ) & mask
66
- for i := uintptr (1 ); ; i ++ {
67
- p := (* * itab )(add (unsafe .Pointer (& itabTable .entries ), h * PtrSize ))
68
- // Use atomic read here so if we see m != nil, we also see
69
- // the initializations of the fields of m.
70
- // m := *p
64
+ for i := uintptr (0 ); i < itabTable .size ; i ++ {
65
+ p := (* * itab )(add (unsafe .Pointer (& itabTable .entries ), i * PtrSize ))
71
66
m := (* itab )(loadp (unsafe .Pointer (p )))
72
- if m = = nil {
73
- return false
74
- }
75
- if m . inter == inter && m . _type == typ {
76
- atomicstorep (unsafe .Pointer (p ), unsafe .Pointer (nil ))
77
- itabTable .count = itabTable .count - 1
78
- return true
67
+ if m ! = nil {
68
+ inter := uintptr ( unsafe . Pointer ( m . inter ))
69
+ _type := uintptr ( unsafe . Pointer ( m . _type ))
70
+ if ( inter >= module . types && inter <= module . etypes ) || ( _type >= module . types && _type <= module . etypes ) {
71
+ atomicstorep (unsafe .Pointer (p ), unsafe .Pointer (nil ))
72
+ itabTable .count = itabTable .count - 1
73
+ }
79
74
}
80
- h += i
81
- h &= mask
82
75
}
76
+ return true
83
77
}
Original file line number Diff line number Diff line change @@ -55,21 +55,25 @@ func additabs(module *moduledata) {
55
55
unlock (& ifaceLock )
56
56
}
57
57
58
- func removeitab ( inter * interfacetype , typ * _type ) bool {
58
+ func removeitabs ( module * moduledata ) bool {
59
59
lock (& ifaceLock )
60
60
defer unlock (& ifaceLock )
61
- h := itabhash (inter , typ )
62
- var m , last * itab = nil , nil
63
- for m = (* itab )(loadp (unsafe .Pointer (& hash [h ]))); m != nil ; m = m .link {
64
- if m .inter == inter && m ._type == typ {
65
- if last == nil {
66
- atomicstorep (unsafe .Pointer (& hash [h ]), unsafe .Pointer (nil ))
67
- } else {
68
- last .link = m .link
61
+
62
+ //the itab alloc by runtime.persistentalloc, can't free
63
+ for index , h := range & hash {
64
+ last := h
65
+ for m := h ; m != nil ; m = m .link {
66
+ inter := uintptr (unsafe .Pointer (m .inter ))
67
+ _type := uintptr (unsafe .Pointer (m ._type ))
68
+ if (inter >= module .types && inter <= module .etypes ) || (_type >= module .types && _type <= module .etypes ) {
69
+ if m == h {
70
+ hash [index ] = m .link
71
+ } else {
72
+ last .link = m .link
73
+ }
69
74
}
70
- return true
75
+ last = m
71
76
}
72
- last = m
73
77
}
74
- return false
78
+ return true
75
79
}
Original file line number Diff line number Diff line change @@ -21,11 +21,3 @@ func unlock(l *mutex)
21
21
22
22
//go:linkname atomicstorep runtime.atomicstorep
23
23
func atomicstorep (ptr unsafe.Pointer , new unsafe.Pointer )
24
-
25
- func removeitabs (module * moduledata ) {
26
- for i := 0 ; i < len (module .itablinks ); i ++ {
27
- inter := module .itablinks [i ].inter
28
- typ := module .itablinks [i ]._type
29
- removeitab (inter , typ )
30
- }
31
- }
You can’t perform that action at this time.
0 commit comments