aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/windows/thread.c
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2010-09-12 11:45:16 +1000
committerAlex Brainman <alex.brainman@gmail.com>2010-09-12 11:45:16 +1000
commitf95a2f2b971411d0abef2c2534d70761dde117b6 (patch)
tree893b1f56c4c22a16274f787415304f86cd01900f /src/pkg/runtime/windows/thread.c
parent0acb63769c900aad6e8d7d4380f248ef40829c0b (diff)
downloadgo-f95a2f2b971411d0abef2c2534d70761dde117b6.tar.xz
runtime(windows): make sure scheduler runs on os stack and new stdcall implementation
R=rsc CC=golang-dev https://golang.org/cl/2009045
Diffstat (limited to 'src/pkg/runtime/windows/thread.c')
-rw-r--r--src/pkg/runtime/windows/thread.c47
1 files changed, 18 insertions, 29 deletions
diff --git a/src/pkg/runtime/windows/thread.c b/src/pkg/runtime/windows/thread.c
index a9062250dc..82d1fa84e5 100644
--- a/src/pkg/runtime/windows/thread.c
+++ b/src/pkg/runtime/windows/thread.c
@@ -77,8 +77,8 @@ get_proc_addr(void *library, void *name)
{
void *base;
- base = stdcall_raw(LoadLibraryEx, library, 0, 0);
- return stdcall_raw(GetProcAddress, base, name);
+ base = stdcall(LoadLibraryEx, 3, library, 0, 0);
+ return stdcall(GetProcAddress, 2, base, name);
}
void
@@ -251,17 +251,11 @@ notesleep(Note *n)
void
newosproc(M *m, G *g, void *stk, void (*fn)(void))
{
- struct {
- void *args;
- void *event_handle;
- } param = { &m };
- extern uint32 threadstart(void *p);
+ USED(stk);
+ USED(g); // assuming g = m->g0
+ USED(fn); // assuming fn = mstart
- USED(g, stk, fn);
- param.event_handle = stdcall(CreateEvent, 4, 0, 0, 0, 0);
- stdcall(CreateThread, 6, 0, 0, threadstart, &param, 0, 0);
- stdcall(WaitForSingleObject, 2, param.event_handle, -1);
- stdcall(CloseHandle, 1, param.event_handle);
+ stdcall(CreateThread, 6, 0, 0, tstart_stdcall, m, 0, 0);
}
// Called to initialize a new m (including the bootstrap m).
@@ -275,25 +269,20 @@ minit(void)
void *
stdcall(void *fn, int32 count, ...)
{
- uintptr *a;
- StdcallParams p;
-
- p.fn = fn;
- a = (uintptr*)(&count + 1);
- while(count > 0) {
- count--;
- p.args[count] = a[count];
- }
- syscall(&p);
- return (void*)(p.r);
+ return stdcall_raw(fn, count, (uintptr*)(&count + 1));
}
void
-call_syscall(void *args)
+syscall(StdcallParams *p)
{
- StdcallParams *p = (StdcallParams*)args;
- stdcall_raw(SetLastError, 0);
- p->r = (uintptr)stdcall_raw((void*)p->fn, p->args[0], p->args[1], p->args[2], p->args[3], p->args[4], p->args[5], p->args[6], p->args[7], p->args[8], p->args[9], p->args[10], p->args[11]);
- p->err = (uintptr)stdcall_raw(GetLastError);
- return;
+ uintptr a;
+
+ ·entersyscall();
+ // TODO(brainman): Move calls to SetLastError and GetLastError
+ // to stdcall_raw to speed up syscall.
+ a = 0;
+ stdcall_raw(SetLastError, 1, &a);
+ p->r = (uintptr)stdcall_raw((void*)p->fn, p->n, p->args);
+ p->err = (uintptr)stdcall_raw(GetLastError, 0, &a);
+ ·exitsyscall();
}