diff options
| author | Alex Brainman <alex.brainman@gmail.com> | 2011-08-18 12:17:09 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-08-18 12:17:09 -0400 |
| commit | 72e83483a7d2594c9f5072e420a1c8cb9f88c409 (patch) | |
| tree | 6b57f537a899d3762c4eb402530058ceddc5b080 /src/pkg/runtime/proc.c | |
| parent | 4cf630da0feea55844ac26356bcefbd95ceb665b (diff) | |
| download | go-72e83483a7d2594c9f5072e420a1c8cb9f88c409.tar.xz | |
runtime: speed up cgo calls
Allocate Defer on stack during cgo calls, as suggested
by dvyukov. Also includes some comment corrections.
benchmark old,ns/op new,ns/op
BenchmarkCgoCall 669 330
(Intel Xeon CPU 1.80GHz * 4, Linux 386)
R=dvyukov, rsc
CC=golang-dev
https://golang.org/cl/4910041
Diffstat (limited to 'src/pkg/runtime/proc.c')
| -rw-r--r-- | src/pkg/runtime/proc.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 5f396b49f3..f71491dd24 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -1153,7 +1153,8 @@ runtime·deferreturn(uintptr arg0) runtime·memmove(argp, d->args, d->siz); g->defer = d->link; fn = d->fn; - runtime·free(d); + if(!d->nofree) + runtime·free(d); runtime·jmpdefer(fn, argp); } @@ -1165,7 +1166,8 @@ rundefer(void) while((d = g->defer) != nil) { g->defer = d->link; reflect·call(d->fn, d->args, d->siz); - runtime·free(d); + if(!d->nofree) + runtime·free(d); } } @@ -1245,7 +1247,8 @@ runtime·panic(Eface e) runtime·mcall(recovery); runtime·throw("recovery failed"); // mcall should not return } - runtime·free(d); + if(!d->nofree) + runtime·free(d); } // ran out of deferred calls - old-school panic now @@ -1280,7 +1283,8 @@ recovery(G *gp) else gp->sched.sp = (byte*)d->argp - 2*sizeof(uintptr); gp->sched.pc = d->pc; - runtime·free(d); + if(!d->nofree) + runtime·free(d); runtime·gogo(&gp->sched, 1); } |
