1
0
mirror of https://github.com/golang/go synced 2024-11-18 05:04:47 -07:00

runtime: fix signal handling on Plan 9

Once added to the signal queue, the pointer passed to the
signal handler could no longer be valid. Instead of passing
the pointer to the note string, we recopy the value of the
note string to a static array in the signal queue.

Fixes #10784.

Change-Id: Iddd6837b58a14dfaa16b069308ae28a7b8e0965b
Reviewed-on: https://go-review.googlesource.com/9950
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
David du Colombier 2015-05-12 18:20:04 +02:00
parent 18d98bc9cb
commit f85a05581e

View File

@ -17,21 +17,29 @@ var sig struct {
sleeping bool
}
type noteData struct {
s [_ERRMAX]byte
n int // n bytes of s are valid
}
type noteQueue struct {
lock mutex
data [qsize]*byte
data [qsize]noteData
ri int
wi int
full bool
}
// It is not allowed to allocate memory in the signal handler.
func (q *noteQueue) push(item *byte) bool {
lock(&q.lock)
if q.full {
unlock(&q.lock)
return false
}
q.data[q.wi] = item
s := gostringnocopy(item)
copy(q.data[q.wi].s[:], s)
q.data[q.wi].n = len(s)
q.wi++
if q.wi == qsize {
q.wi = 0
@ -43,14 +51,15 @@ func (q *noteQueue) push(item *byte) bool {
return true
}
func (q *noteQueue) pop() *byte {
func (q *noteQueue) pop() string {
lock(&q.lock)
q.full = false
if q.ri == q.wi {
unlock(&q.lock)
return nil
return ""
}
item := q.data[q.ri]
note := &q.data[q.ri]
item := string(note.s[:note.n])
q.ri++
if q.ri == qsize {
q.ri = 0
@ -86,8 +95,8 @@ func sendNote(s *byte) bool {
func signal_recv() string {
for {
note := sig.q.pop()
if note != nil {
return gostring(note)
if note != "" {
return note
}
lock(&sig.lock)