Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1015)

Delta Between Two Patch Sets: src/runtime/panic.go

Issue 141490043: code review 141490043: runtime: use traceback to traverse defer structures (Closed)
Left Patch Set: diff -r c655137b930c3f839cc08f01f759ac5eb35d766f https://code.google.com/p/go/ Created 9 years, 6 months ago
Right Patch Set: diff -r 86735ca806e08b2ee073776fdddd0f7712dd788a https://code.google.com/p/go/ Created 9 years, 6 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « src/runtime/panic.c ('k') | src/runtime/proc.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 // Copyright 2014 The Go Authors. All rights reserved. 1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style 2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file. 3 // license that can be found in the LICENSE file.
4 4
5 package runtime 5 package runtime
6 6
7 import "unsafe" 7 import "unsafe"
8 8
9 var indexError = error(errorString("index out of range")) 9 var indexError = error(errorString("index out of range"))
10 10
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 if m[defersc] != int32(siz) { 138 if m[defersc] != int32(siz) {
139 print("bad defer size class: i=", i, " siz=", siz, " def ersc=", defersc, "\n") 139 print("bad defer size class: i=", i, " siz=", siz, " def ersc=", defersc, "\n")
140 gothrow("bad defer size class") 140 gothrow("bad defer size class")
141 } 141 }
142 } 142 }
143 } 143 }
144 144
145 // The arguments associated with a deferred call are stored 145 // The arguments associated with a deferred call are stored
146 // immediately after the _defer header in memory. 146 // immediately after the _defer header in memory.
147 //go:nosplit
147 func deferArgs(d *_defer) unsafe.Pointer { 148 func deferArgs(d *_defer) unsafe.Pointer {
khr 2014/09/15 19:23:00 Mark this as nosplit.
rsc 2014/09/16 14:28:37 Done.
148 return add(unsafe.Pointer(d), unsafe.Sizeof(*d)) 149 return add(unsafe.Pointer(d), unsafe.Sizeof(*d))
149 } 150 }
150 151
151 var deferType *_type // type of _defer struct 152 var deferType *_type // type of _defer struct
152 153
153 func init() { 154 func init() {
154 var x interface{} 155 var x interface{}
155 x = (*_defer)(nil) 156 x = (*_defer)(nil)
156 deferType = (*(**ptrtype)(unsafe.Pointer(&x))).elem 157 deferType = (*(**ptrtype)(unsafe.Pointer(&x))).elem
157 } 158 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 p.link = gp._panic 285 p.link = gp._panic
285 gp._panic = (*_panic)(noescape(unsafe.Pointer(&p))) 286 gp._panic = (*_panic)(noescape(unsafe.Pointer(&p)))
286 287
287 for { 288 for {
288 d := gp._defer 289 d := gp._defer
289 if d == nil { 290 if d == nil {
290 break 291 break
291 } 292 }
292 293
293 // If defer was started by earlier panic or Goexit (and, since w e're back here, that triggered a new panic), 294 // If defer was started by earlier panic or Goexit (and, since w e're back here, that triggered a new panic),
294 » » // take defer off list. The earlier panic or Goeixt will not con tinue running. 295 » » // take defer off list. The earlier panic or Goexit will not con tinue running.
khr 2014/09/15 19:23:00 s/Goeixt/Goexit/
rsc 2014/09/16 14:28:37 Done.
295 if d.started { 296 if d.started {
296 if d._panic != nil { 297 if d._panic != nil {
297 d._panic.aborted = true 298 d._panic.aborted = true
298 } 299 }
299 gp._defer = d.link 300 gp._defer = d.link
300 freedefer(d) 301 freedefer(d)
301 continue 302 continue
302 } 303 }
303 304
304 // Mark defer as started, but keep on list, so that traceback 305 // Mark defer as started, but keep on list, so that traceback
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 } 453 }
453 if gp.m.locks != 0 { 454 if gp.m.locks != 0 {
454 print("panic: ", s, "\n") 455 print("panic: ", s, "\n")
455 gothrow("panic holding locks") 456 gothrow("panic holding locks")
456 } 457 }
457 458
458 var err interface{} 459 var err interface{}
459 newErrorCString(unsafe.Pointer(s), &err) 460 newErrorCString(unsafe.Pointer(s), &err)
460 gopanic(err) 461 gopanic(err)
461 } 462 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b