forked from p9c/pod-archive
-
Notifications
You must be signed in to change notification settings - Fork 0
/
quit.go
152 lines (136 loc) · 2.8 KB
/
quit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package qu
import (
"sync"
"github.com/l0k18/pod/pkg/util/logi"
)
type C chan struct{}
var createdList []string
var createdChannels []C
var mx sync.Mutex
func T() C {
// PrintChanState()
// occ := GetOpenChanCount()
mx.Lock()
defer mx.Unlock()
createdList = append(createdList, logi.Caller("chan from", 1))
o := make(C)
createdChannels = append(createdChannels, o)
// Trace("open channels:", len(createdList), len(createdChannels), occ)
return o
}
func Ts(n int) C {
// PrintChanState()
// occ := GetOpenChanCount()
mx.Lock()
defer mx.Unlock()
createdList = append(createdList, logi.Caller("buffered chan at", 1))
o := make(C, n)
createdChannels = append(createdChannels, o)
// Trace("open channels:", len(createdList), len(createdChannels), occ)
return o
}
func (c C) Q() {
loc := GetLocForChan(c)
mx.Lock()
if !testChanIsClosed(c) {
Trace("closing chan from "+loc, logi.Caller("from", 1))
close(c)
} else {
Trace("#### channel", loc, "was already closed")
}
mx.Unlock()
// PrintChanState()
}
func (c C) Wait() <-chan struct{} {
Trace(logi.Caller(">>> waiting on quit channel at", 1))
return c
}
func testChanIsClosed(ch C) (o bool) {
if ch == nil {
return true
}
select {
case <-ch:
// Debug("chan is closed")
o = true
default:
}
// Debug("chan is not closed")
return
}
func GetLocForChan(c C) (s string) {
s = "not found"
mx.Lock()
for i := range createdList {
if i >= len(createdChannels) {
break
}
if createdChannels[i] == c {
s = createdList[i]
}
}
mx.Unlock()
return
}
func RemoveClosedChans() {
Debug("cleaning up closed channels (more than 50 now closed)")
var c []C
var l []string
// Debug(">>>>>>>>>>>")
for i := range createdChannels {
if i >= len(createdList) {
break
}
if testChanIsClosed(createdChannels[i]) {
// Trace(">>> closed", createdList[i])
// createdChannels[i].Q()
} else {
c = append(c, createdChannels[i])
l = append(l, createdList[i])
// Trace("<<< open", createdList[i])
}
// Debug(">>>>>>>>>>>")
}
createdChannels = c
createdList = l
}
func PrintChanState() {
// Debug(">>>>>>>>>>>")
for i := range createdChannels {
if i >= len(createdList) {
break
}
if testChanIsClosed(createdChannels[i]) {
Trace(">>> closed", createdList[i])
// createdChannels[i].Q()
} else {
Trace("<<< open", createdList[i])
}
// Debug(">>>>>>>>>>>")
}
}
func GetOpenChanCount() (o int) {
mx.Lock()
// Debug(">>>>>>>>>>>")
var c int
for i := range createdChannels {
if i >= len(createdChannels) {
break
}
if testChanIsClosed(createdChannels[i]) {
// Debug("still open", createdList[i])
// createdChannels[i].Q()
c++
} else {
o++
// Debug(">>>> ",createdList[i])
}
// Debug(">>>>>>>>>>>")
}
if c > 50 {
RemoveClosedChans()
}
mx.Unlock()
// o -= len(createdChannels)
return
}