diff options
| author | Alex Brainman <alex.brainman@gmail.com> | 2010-09-12 11:45:16 +1000 |
|---|---|---|
| committer | Alex Brainman <alex.brainman@gmail.com> | 2010-09-12 11:45:16 +1000 |
| commit | f95a2f2b971411d0abef2c2534d70761dde117b6 (patch) | |
| tree | 893b1f56c4c22a16274f787415304f86cd01900f /src/pkg/runtime/windows/thread.c | |
| parent | 0acb63769c900aad6e8d7d4380f248ef40829c0b (diff) | |
| download | go-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.c | 47 |
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, ¶m, 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(); } |
