aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2013-03-25 20:57:36 +0400
committerDmitriy Vyukov <dvyukov@google.com>2013-03-25 20:57:36 +0400
commitea151041102692e52fbce353f12ca73bdc48cad7 (patch)
tree9d767fcb0834c9513e476020cae8fc4eb80e880b /src/pkg/runtime
parent4ad1a87f8573b355b814589c63b75a7657df4069 (diff)
downloadgo-ea151041102692e52fbce353f12ca73bdc48cad7.tar.xz
net: band-aid for windows network poller
Fixes performance of the current windows network poller with the new scheduler. Gives runtime a hint when GetQueuedCompletionStatus() will block. Fixes #5068. benchmark old ns/op new ns/op delta BenchmarkTCP4Persistent 4004000 33906 -99.15% BenchmarkTCP4Persistent-2 21790 17513 -19.63% BenchmarkTCP4Persistent-4 44760 34270 -23.44% BenchmarkTCP4Persistent-6 45280 43000 -5.04% R=golang-dev, alex.brainman, coocood, rsc CC=golang-dev https://golang.org/cl/7612045
Diffstat (limited to 'src/pkg/runtime')
-rw-r--r--src/pkg/runtime/cgocall.c15
-rw-r--r--src/pkg/runtime/runtime.h1
2 files changed, 15 insertions, 1 deletions
diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c
index 0c96187495..b829665462 100644
--- a/src/pkg/runtime/cgocall.c
+++ b/src/pkg/runtime/cgocall.c
@@ -98,6 +98,15 @@ static void unwindm(void);
static void endcgo(void);
static FuncVal endcgoV = { endcgo };
+// Gives a hint that the next syscall
+// executed by the current goroutine will block.
+// Currently used only on windows.
+void
+net·runtime_blockingSyscallHint(void)
+{
+ g->blockingsyscall = true;
+}
+
void
runtime·cgocall(void (*fn)(void*), void *arg)
{
@@ -145,7 +154,11 @@ runtime·cgocall(void (*fn)(void*), void *arg)
* so it is safe to call while "in a system call", outside
* the $GOMAXPROCS accounting.
*/
- runtime·entersyscall();
+ if(g->blockingsyscall) {
+ g->blockingsyscall = false;
+ runtime·entersyscallblock();
+ } else
+ runtime·entersyscall();
runtime·asmcgocall(fn, arg);
runtime·exitsyscall();
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index 46c77e3fd5..638acd4740 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -238,6 +238,7 @@ struct G
bool ispanic;
bool issystem; // do not output in stack dump
bool isbackground; // ignore in deadlock detector
+ bool blockingsyscall; // hint that the next syscall will block
int8 raceignore; // ignore race detection events
M* m; // for debuggers, but offset not hard-coded
M* lockedm;