]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: change Windows M.thread from void* to uintptr
authorRuss Cox <rsc@golang.org>
Wed, 8 Oct 2014 03:27:25 +0000 (23:27 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 8 Oct 2014 03:27:25 +0000 (23:27 -0400)
It appears to be an opaque bit pattern more than a pointer.
The Go garbage collector has discovered that for m0
it is set to 0x4c.

Should fix Windows build.

TBR=brainman
CC=golang-codereviews
https://golang.org/cl/149640043

src/runtime/asm_386.s
src/runtime/asm_amd64.s
src/runtime/asm_amd64p32.s
src/runtime/asm_arm.s
src/runtime/os_windows.c
src/runtime/runtime.h

index 1495246a25e419aafb6a6e3639c56c7d7c218f86..c401741ef909ad2ffa350d22b0ebf2c50e16b298 100644 (file)
@@ -479,6 +479,9 @@ TEXT runtime·atomicloaduintptr(SB), NOSPLIT, $0-8
 TEXT runtime·atomicloaduint(SB), NOSPLIT, $0-8
        JMP     runtime·atomicload(SB)
 
+TEXT runtime·atomicstoreuintptr(SB), NOSPLIT, $0-8
+       JMP     runtime·atomicstore(SB)
+
 // bool runtime·cas64(uint64 *val, uint64 old, uint64 new)
 // Atomically:
 //     if(*val == *old){
index 3f7f6084101decc8798d1d1a0be269c8d3b85d01..e21270d8cc452af45963f41aa7e6c033edbaae5f 100644 (file)
@@ -491,6 +491,9 @@ TEXT runtime·atomicloaduintptr(SB), NOSPLIT, $0-16
 TEXT runtime·atomicloaduint(SB), NOSPLIT, $0-16
        JMP     runtime·atomicload64(SB)
 
+TEXT runtime·atomicstoreuintptr(SB), NOSPLIT, $0-16
+       JMP     runtime·atomicstore64(SB)
+
 // bool casp(void **val, void *old, void *new)
 // Atomically:
 //     if(*val == old){
index 13a16425680fa449aea8e1686b415a2a2618a207..c2bc91a3f5a02ecaae26e0990faefa0f8df204ec 100644 (file)
@@ -440,6 +440,9 @@ TEXT runtime·atomicloaduintptr(SB), NOSPLIT, $0-12
 TEXT runtime·atomicloaduint(SB), NOSPLIT, $0-12
        JMP     runtime·atomicload(SB)
 
+TEXT runtime·atomicstoreuintptr(SB), NOSPLIT, $0-12
+       JMP     runtime·atomicstore(SB)
+
 // bool        runtime·cas64(uint64 *val, uint64 old, uint64 new)
 // Atomically:
 //     if(*val == *old){
index 36fb022f9518e1269fa7a9709061f8272171ad35..a1535aeec348ca41c588ad45bf1764e55dfd91ba 100644 (file)
@@ -724,6 +724,9 @@ TEXT runtime·atomicloaduintptr(SB),NOSPLIT,$0-8
 TEXT runtime·atomicloaduint(SB),NOSPLIT,$0-8
        B       runtime·atomicload(SB)
 
+TEXT runtime·atomicstoreuintptr(SB),NOSPLIT,$0-8
+       B       runtime·atomicstore(SB)
+
 // AES hashing not implemented for ARM
 TEXT runtime·aeshash(SB),NOSPLIT,$-4-0
        MOVW    $0, R0
index 77f99062cf3e1508a879ef679ab4febe2a99007d..6337dde2af8d8bd0a12e5522d3ceed031ecf0b13 100644 (file)
@@ -268,19 +268,19 @@ runtime·mpreinit(M *mp)
 void
 runtime·minit(void)
 {
-       void *thandle;
+       uintptr thandle;
 
        // -1 = current process, -2 = current thread
        runtime·stdcall7(runtime·DuplicateHandle, -1, -2, -1, (uintptr)&thandle, 0, 0, DUPLICATE_SAME_ACCESS);
-       runtime·atomicstorep(&g->m->thread, thandle);
+       runtime·atomicstoreuintptr(&g->m->thread, thandle);
 }
 
 // Called from dropm to undo the effect of an minit.
 void
 runtime·unminit(void)
 {
-       runtime·stdcall1(runtime·CloseHandle, (uintptr)g->m->thread);
-       g->m->thread = nil;
+       runtime·stdcall1(runtime·CloseHandle, g->m->thread);
+       g->m->thread = 0;
 }
 
 // Described in http://www.dcl.hpi.uni-potsdam.de/research/WRK/2007/08/getting-os-information-the-kuser_shared_data-structure/
@@ -532,7 +532,7 @@ void
 runtime·profileloop1(void)
 {
        M *mp, *allm;
-       void *thread;
+       uintptr thread;
 
        runtime·stdcall2(runtime·SetThreadPriority, -2, THREAD_PRIORITY_HIGHEST);
 
@@ -540,11 +540,11 @@ runtime·profileloop1(void)
                runtime·stdcall2(runtime·WaitForSingleObject, (uintptr)profiletimer, -1);
                allm = runtime·atomicloadp(&runtime·allm);
                for(mp = allm; mp != nil; mp = mp->alllink) {
-                       thread = runtime·atomicloadp(&mp->thread);
+                       thread = runtime·atomicloaduintptr(&mp->thread);
                        // Do not profile threads blocked on Notes,
                        // this includes idle worker threads,
                        // idle timer thread, idle heap scavenger, etc.
-                       if(thread == nil || mp->profilehz == 0 || mp->blocked)
+                       if(thread == 0 || mp->profilehz == 0 || mp->blocked)
                                continue;
                        runtime·stdcall1(runtime·SuspendThread, (uintptr)thread);
                        if(mp->profilehz != 0 && !mp->blocked)
index c4d878608941a6a46b3afd92c2251225bfc480c1..27a809a07eda41110a397246163dfad8d3e859aa 100644 (file)
@@ -371,7 +371,7 @@ struct      M
        uintptr scalararg[4];   // scalar argument/return for mcall
        void*   ptrarg[4];      // pointer argument/return for mcall
 #ifdef GOOS_windows
-       void*   thread;         // thread handle
+       uintptr thread;         // thread handle
        // these are here because they are too large to be on the stack
        // of low-level NOSPLIT functions.
        LibCall libcall;
@@ -885,7 +885,9 @@ void        runtime·atomicstore(uint32 volatile*, uint32);
 void   runtime·atomicstore64(uint64 volatile*, uint64);
 uint64 runtime·atomicload64(uint64 volatile*);
 void*  runtime·atomicloadp(void* volatile*);
+uintptr        runtime·atomicloaduintptr(uintptr volatile*);
 void   runtime·atomicstorep(void* volatile*, void*);
+void   runtime·atomicstoreuintptr(uintptr volatile*, uintptr);
 void   runtime·atomicor8(byte volatile*, byte);
 
 void   runtime·setg(G*);