mirror of
https://github.com/golang/go
synced 2024-11-11 18:21:40 -07:00
runtime: send android stderr to /dev/log/main
I tried to submit this in Go 1.4 as cl/107540044 but tripped over the changes for getting C off the G stack. This is a rewritten version that avoids cgo and works directly with the underlying log device. Change-Id: I14c227dbb4202690c2c67c5a613d6c6689a6662a Reviewed-on: https://go-review.googlesource.com/1285 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
6820be25da
commit
bee8ae1185
@ -75,7 +75,7 @@ func gwrite(b []byte) {
|
||||
}
|
||||
gp := getg()
|
||||
if gp == nil || gp.writebuf == nil {
|
||||
write(2, unsafe.Pointer(&b[0]), int32(len(b)))
|
||||
writeErr(b)
|
||||
return
|
||||
}
|
||||
|
||||
|
9
src/runtime/print1_write.go
Normal file
9
src/runtime/print1_write.go
Normal file
@ -0,0 +1,9 @@
|
||||
// +build !android
|
||||
|
||||
package runtime
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func writeErr(b []byte) {
|
||||
write(2, unsafe.Pointer(&b[0]), int32(len(b)))
|
||||
}
|
44
src/runtime/print1_write_android.go
Normal file
44
src/runtime/print1_write_android.go
Normal file
@ -0,0 +1,44 @@
|
||||
package runtime
|
||||
|
||||
import "unsafe"
|
||||
|
||||
var (
|
||||
writeHeader = []byte{6 /* ANDROID_LOG_ERROR */, 'G', 'o', 0}
|
||||
writePath = []byte("/dev/log/main\x00")
|
||||
writeFD uintptr
|
||||
writeBuf [1024]byte
|
||||
writePos int
|
||||
)
|
||||
|
||||
func writeErr(b []byte) {
|
||||
// Log format: "<priority 1 byte><tag n bytes>\x00<message m bytes>\x00"
|
||||
// The entire log needs to be delivered in a single syscall (the NDK
|
||||
// does this with writev). Each log is its own line, so we need to
|
||||
// buffer writes until we see a newline.
|
||||
if writeFD == 0 {
|
||||
writeFD = uintptr(open(&writePath[0], 0x1 /* O_WRONLY */, 0))
|
||||
if writeFD == 0 {
|
||||
// It is hard to do anything here. Write to stderr just
|
||||
// in case user has root on device and has run
|
||||
// adb shell setprop log.redirect-stdio true
|
||||
msg := []byte("runtime: cannot open /dev/log/main\x00")
|
||||
write(2, unsafe.Pointer(&msg[0]), int32(len(msg)))
|
||||
exit(2)
|
||||
}
|
||||
copy(writeBuf[:], writeHeader)
|
||||
}
|
||||
dst := writeBuf[len(writeHeader):]
|
||||
for _, v := range b {
|
||||
if v == 0 { // android logging won't print a zero byte
|
||||
v = '0'
|
||||
}
|
||||
dst[writePos] = v
|
||||
writePos++
|
||||
if v == '\n' || writePos == len(dst)-1 {
|
||||
dst[writePos] = 0
|
||||
write(writeFD, unsafe.Pointer(&writeBuf[0]), int32(len(writeHeader)+writePos))
|
||||
memclrBytes(dst)
|
||||
writePos = 0
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user