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

runtime: eliminate Go -> C -> block paths for Solaris

LGTM=aram, r
R=golang-codereviews, aram, r
CC=golang-codereviews, iant, khr
https://golang.org/cl/141180043
This commit is contained in:
Russ Cox 2014-09-06 21:16:35 -04:00
parent b6951bcc0b
commit c01c2c8895
3 changed files with 33 additions and 5 deletions

View File

@ -72,7 +72,7 @@ type pollCache struct {
var pollcache pollCache var pollcache pollCache
func netpollServerInit() { func netpollServerInit() {
netpollinit() onM(netpollinit)
} }
func netpollOpen(fd uintptr) (*pollDesc, int) { func netpollOpen(fd uintptr) (*pollDesc, int) {
@ -93,7 +93,10 @@ func netpollOpen(fd uintptr) (*pollDesc, int) {
pd.wd = 0 pd.wd = 0
unlock(&pd.lock) unlock(&pd.lock)
errno := netpollopen(fd, pd) var errno int32
onM(func() {
errno = netpollopen(fd, pd)
})
return pd, int(errno) return pd, int(errno)
} }
@ -107,7 +110,9 @@ func netpollClose(pd *pollDesc) {
if pd.rg != 0 && pd.rg != pdReady { if pd.rg != 0 && pd.rg != pdReady {
gothrow("netpollClose: blocked read on closing descriptor") gothrow("netpollClose: blocked read on closing descriptor")
} }
onM(func() {
netpollclose(uintptr(pd.fd)) netpollclose(uintptr(pd.fd))
})
pollcache.free(pd) pollcache.free(pd)
} }
@ -138,7 +143,9 @@ func netpollWait(pd *pollDesc, mode int) int {
} }
// As for now only Solaris uses level-triggered IO. // As for now only Solaris uses level-triggered IO.
if GOOS == "solaris" { if GOOS == "solaris" {
onM(func() {
netpollarm(pd, mode) netpollarm(pd, mode)
})
} }
for !netpollblock(pd, int32(mode), false) { for !netpollblock(pd, int32(mode), false) {
err = netpollcheckerr(pd, int32(mode)) err = netpollcheckerr(pd, int32(mode))

View File

@ -386,36 +386,42 @@ runtime·semawakeup(M *mp)
runtime·throw("sem_post"); runtime·throw("sem_post");
} }
#pragma textflag NOSPLIT
int32 int32
runtime·close(int32 fd) runtime·close(int32 fd)
{ {
return runtime·sysvicall1(libc·close, (uintptr)fd); return runtime·sysvicall1(libc·close, (uintptr)fd);
} }
#pragma textflag NOSPLIT
void void
runtime·exit(int32 r) runtime·exit(int32 r)
{ {
runtime·sysvicall1(libc·exit, (uintptr)r); runtime·sysvicall1(libc·exit, (uintptr)r);
} }
#pragma textflag NOSPLIT
/* int32 */ void /* int32 */ void
runtime·getcontext(Ucontext* context) runtime·getcontext(Ucontext* context)
{ {
runtime·sysvicall1(libc·getcontext, (uintptr)context); runtime·sysvicall1(libc·getcontext, (uintptr)context);
} }
#pragma textflag NOSPLIT
int32 int32
runtime·getrlimit(int32 res, Rlimit* rlp) runtime·getrlimit(int32 res, Rlimit* rlp)
{ {
return runtime·sysvicall2(libc·getrlimit, (uintptr)res, (uintptr)rlp); return runtime·sysvicall2(libc·getrlimit, (uintptr)res, (uintptr)rlp);
} }
#pragma textflag NOSPLIT
uint8* uint8*
runtime·mmap(byte* addr, uintptr len, int32 prot, int32 flags, int32 fildes, uint32 off) runtime·mmap(byte* addr, uintptr len, int32 prot, int32 flags, int32 fildes, uint32 off)
{ {
return (uint8*)runtime·sysvicall6(libc·mmap, (uintptr)addr, (uintptr)len, (uintptr)prot, (uintptr)flags, (uintptr)fildes, (uintptr)off); return (uint8*)runtime·sysvicall6(libc·mmap, (uintptr)addr, (uintptr)len, (uintptr)prot, (uintptr)flags, (uintptr)fildes, (uintptr)off);
} }
#pragma textflag NOSPLIT
void void
runtime·munmap(byte* addr, uintptr len) runtime·munmap(byte* addr, uintptr len)
{ {
@ -430,6 +436,7 @@ runtime·nanotime(void)
return runtime·sysvicall0((uintptr)runtime·nanotime1); return runtime·sysvicall0((uintptr)runtime·nanotime1);
} }
#pragma textflag NOSPLIT
void void
time·now(int64 sec, int32 usec) time·now(int64 sec, int32 usec)
{ {
@ -442,6 +449,7 @@ time·now(int64 sec, int32 usec)
FLUSH(&usec); FLUSH(&usec);
} }
#pragma textflag NOSPLIT
int32 int32
runtime·open(int8* path, int32 oflag, int32 mode) runtime·open(int8* path, int32 oflag, int32 mode)
{ {
@ -490,6 +498,7 @@ runtime·raise(int32 sig)
runtime·sysvicall1(libc·raise, (uintptr)sig); runtime·sysvicall1(libc·raise, (uintptr)sig);
} }
#pragma textflag NOSPLIT
int32 int32
runtime·read(int32 fd, void* buf, int32 nbyte) runtime·read(int32 fd, void* buf, int32 nbyte)
{ {
@ -563,6 +572,7 @@ runtime·usleep(uint32 µs)
runtime·usleep1(µs); runtime·usleep1(µs);
} }
#pragma textflag NOSPLIT
int32 int32
runtime·write(uintptr fd, void* buf, int32 nbyte) runtime·write(uintptr fd, void* buf, int32 nbyte)
{ {

View File

@ -138,10 +138,12 @@ func gorecover(argp uintptr) interface{} {
return nil return nil
} }
//go:nosplit
func startpanic() { func startpanic() {
onM(startpanic_m) onM(startpanic_m)
} }
//go:nosplit
func dopanic(unused int) { func dopanic(unused int) {
gp := getg() gp := getg()
mp := acquirem() mp := acquirem()
@ -152,10 +154,19 @@ func dopanic(unused int) {
*(*int)(nil) = 0 *(*int)(nil) = 0
} }
//go:nosplit
func throw(s *byte) { func throw(s *byte) {
gothrow(gostringnocopy(s)) gp := getg()
if gp.m.throwing == 0 {
gp.m.throwing = 1
}
startpanic()
print("fatal error: ", gostringnocopy(s), "\n")
dopanic(0)
*(*int)(nil) = 0 // not reached
} }
//go:nosplit
func gothrow(s string) { func gothrow(s string) {
gp := getg() gp := getg()
if gp.m.throwing == 0 { if gp.m.throwing == 0 {