about summary refs log tree commit diff stats
path: root/html/edit/012-editor-undo.mu.html
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-09-16 14:37:52 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-09-16 14:57:39 -0700
commitaa2fd725c0e5129bd4a750261f97ababa8af9a12 (patch)
treee377fee8de5509e9d1c0d4f595af2edfba7adf12 /html/edit/012-editor-undo.mu.html
parent02abf5d1140090bd34badebeefed3c9dc5e02f5b (diff)
downloadmu-aa2fd725c0e5129bd4a750261f97ababa8af9a12.tar.gz
3370
Fix CI.

Figuring out this memory leak was an epic story. I was able to quickly
track down that it was caused by commit 3365, in particular the
overloading of to-text to support characters. But beyond that I was
stumped. Why were layer 3's trace_stream::curr_stream objects being
leaked in layer 81 by a change in layer 59?!

Triaging through the layers, I found the following:

  layer 81 - leaks 2 blocks (in clear-line-erases-printed-characters)
  layer 83 - leaks 4 additional blocks (in clear-line-erases-printed-characters-2)

I also figured out that the leaks were happening because of the call to
'trace' on a character inside print:character (that's the 'print'
function called with a character argument)

  trace 90, [print-character], c

So I tried to create a simple scenario:

  scenario trace-on-character-leaks [
    1:character <- copy 111/o
    trace 90, [print-character], 1:character
  ]

But that triggered no leaks. Which made sense because there were plenty
of calls to that 'trace' instruction in print:character. The leak only
happened when print:character was called from clear-line. Oh, it happens
only when tracing 0/nul characters. Tracing a Mu string with a nul
character creates an empty C++ string, which is weird. But why should it
leak memory?!

Anyway, I tried a new scenario at layer 62 (when 'trace' starts
auto-converting characters to text)

  scenario stashing-nul-character-leaks [
    1:character <- copy 0/nul
    trace 90, [dbg], 1:character
  ]

But still, no leak! I played around with running layers until 70, 80.
But then it didn't leak even at layer 82 where I'd seen it leak before.
What had I done?

Turns out it was only leaking if I used names for variables and not
numeric addresses. Eventually I was able to get layer 59 to leak:

  scenario stashing-nul-character-leaks [
    c:character <- copy 0/nul
    x:text <- to-text c
    trace 90, [dbg], x
  ]

At that point I finally went to look at layer 3 (I'd been thinking about
it before, but hadn't bothered to *actually go look*!) And the leak was
obvious.

In the end, all the information I needed was right there in the leak
report. The reason this was hard to find was that I wasn't ready to
believe there could be a bug in layer 3 after all these months. I had to
go through the five stages of grief before I was ready for that
realization.

Final mystery: why was the memory leak not triggered by numeric
variables? Because the transform to auto-convert ingredients to text
only operated on named variables. Manually performing the transform did
leak:

  scenario stashing-text-containing-nul-character-leaks [
    1:text <- new character:type, 1/capacity
    put-index *1:text, 0, 0/nul
    trace 90, [dbg], 1:text
  ]
Diffstat (limited to 'html/edit/012-editor-undo.mu.html')
0 files changed, 0 insertions, 0 deletions
19:12:37 +0100 committer James Booth <boothj5@gmail.com> 2014-08-09 19:12:37 +0100 Updates to install-all.sh' href='/danisanti/profani-tty/commit/install-all.sh?id=192656e5b8ce71afc21702934a7e1593f8b72142'>192656e5 ^
6e28df66 ^
b2cb4662 ^

f736a248 ^








6e28df66 ^
f736a248 ^

24a60449 ^





ee8ec99e ^
0a1e8d9c ^
6e28df66 ^
0a1e8d9c ^
6e28df66 ^
59c9e23b ^
0a1e8d9c ^
24a60449 ^

2b88e2f1 ^
76fe37ef ^

2b88e2f1 ^
76fe37ef ^
80b2aa0f ^
2b88e2f1 ^
76fe37ef ^
99fc7c5e ^
76fe37ef ^










bdb8ea3f ^


76fe37ef ^




ee8ec99e ^











2b88e2f1 ^
8f0bc28b ^

2b88e2f1 ^
8f0bc28b ^
80b2aa0f ^
2b88e2f1 ^
8f0bc28b ^

192656e5 ^
8f0bc28b ^










bdb8ea3f ^


8f0bc28b ^




76fe37ef ^





2b88e2f1 ^

76fe37ef ^







0a1e8d9c ^






7f962895 ^
76fe37ef ^

7f962895 ^


04605a5f ^
7f962895 ^
f736a248 ^

fceec61a ^

7f962895 ^
24a60449 ^




76fe37ef ^


7f962895 ^

76fe37ef ^

24a60449 ^
2b88e2f1 ^
8f0bc28b ^
24a60449 ^

2b88e2f1 ^
8f0bc28b ^
76fe37ef ^
b2cb4662 ^
2b88e2f1 ^
3c5d5e2e ^
b2cb4662 ^

f736a248 ^
2b88e2f1 ^
f736a248 ^


24a60449 ^
2b88e2f1 ^
8f0bc28b ^
76fe37ef ^


76fe37ef ^
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216