99 "reflect"
1010 "sync"
1111 "sync/atomic"
12+ "unsafe"
1213)
1314
1415// ----------------------------------------------------------------------------
@@ -51,11 +52,15 @@ func (l *decRefList) add(obj *C.PyObject) {
5152 l .mu .Unlock ()
5253}
5354
54- func (l * decRefList ) decRefAll () {
55- var list []* C.PyObject
55+ func (l * decRefList ) len () int {
56+ l .mu .Lock ()
57+ defer l .mu .Unlock ()
58+ return len (l .objects )
59+ }
5660
61+ func (l * decRefList ) decRefAll () {
5762 l .mu .Lock ()
58- list = l .objects
63+ list : = l .objects
5964 l .objects = make ([]* C.PyObject , 0 , maxPyObjects * 2 )
6065 l .mu .Unlock ()
6166
@@ -67,12 +72,11 @@ func (l *decRefList) decRefAll() {
6772// ----------------------------------------------------------------------------
6873
6974type globalData struct {
70- typeMetas map [* C.PyObject ]* typeMeta
71- pyTypes map [reflect.Type ]* C.PyObject
72- holders holderList
73- decRefList decRefList
74- disableDecRef bool
75- finished int32
75+ typeMetas map [* C.PyObject ]* typeMeta
76+ pyTypes map [reflect.Type ]* C.PyObject
77+ holders holderList
78+ decRefList decRefList
79+ finished int32
7680}
7781
7882var (
@@ -84,17 +88,16 @@ func getGlobalData() *globalData {
8488}
8589
8690func (gd * globalData ) addDecRef (obj * C.PyObject ) {
87- if gd .disableDecRef {
88- return
89- }
9091 if atomic .LoadInt32 (& gd .finished ) != 0 {
9192 return
9293 }
9394 gd .decRefList .add (obj )
9495}
9596
9697func (gd * globalData ) decRefObjectsIfNeeded () {
97- gd .decRefList .decRefAll ()
98+ if gd .decRefList .len () >= maxPyObjects {
99+ gd .decRefList .decRefAll ()
100+ }
98101}
99102
100103// ----------------------------------------------------------------------------
@@ -111,5 +114,15 @@ func markFinished() {
111114}
112115
113116func cleanupGlobal () {
117+ for _ , meta := range global .typeMetas {
118+ for _ , method := range meta .methods {
119+ def := method .def
120+ if def != nil {
121+ C .free (unsafe .Pointer (def .ml_name ))
122+ C .free (unsafe .Pointer (def .ml_doc ))
123+ C .free (unsafe .Pointer (def ))
124+ }
125+ }
126+ }
114127 global = nil
115128}
0 commit comments