]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix windows build
authorHector Chu <hectorchu@gmail.com>
Fri, 30 Sep 2011 18:33:13 +0000 (11:33 -0700)
committerRob Pike <r@golang.org>
Fri, 30 Sep 2011 18:33:13 +0000 (11:33 -0700)
Add osyield and usleep as required by recent GC changes.

R=golang-dev, r, dsymonds, rsc, r
CC=golang-dev
https://golang.org/cl/5156042

src/pkg/runtime/windows/386/defs.h
src/pkg/runtime/windows/amd64/defs.h
src/pkg/runtime/windows/defs.c
src/pkg/runtime/windows/thread.c

index 6cc5336a94e8140e495d44aadcae538762a4f505..e64a82fafeeb77d163ffe075eb0212f491149beb 100644 (file)
@@ -31,6 +31,20 @@ enum {
 // Types
 #pragma pack on
 
+typedef struct SystemInfo SystemInfo;
+struct SystemInfo {
+       byte Pad_godefs_0[4];
+       uint32 dwPageSize;
+       void *lpMinimumApplicationAddress;
+       void *lpMaximumApplicationAddress;
+       uint32 dwActiveProcessorMask;
+       uint32 dwNumberOfProcessors;
+       uint32 dwProcessorType;
+       uint32 dwAllocationGranularity;
+       uint16 wProcessorLevel;
+       uint16 wProcessorRevision;
+};
+
 typedef struct ExceptionRecord ExceptionRecord;
 struct ExceptionRecord {
        uint32 ExceptionCode;
index d5191a3d74308a7f583c3674c47836590887156e..da4c19d90b717a54fc1387207ae6d3358a112135 100644 (file)
@@ -31,6 +31,20 @@ enum {
 // Types
 #pragma pack on
 
+typedef struct SystemInfo SystemInfo;
+struct SystemInfo {
+       byte Pad_godefs_0[4];
+       uint32 dwPageSize;
+       void *lpMinimumApplicationAddress;
+       void *lpMaximumApplicationAddress;
+       uint64 dwActiveProcessorMask;
+       uint32 dwNumberOfProcessors;
+       uint32 dwProcessorType;
+       uint32 dwAllocationGranularity;
+       uint16 wProcessorLevel;
+       uint16 wProcessorRevision;
+};
+
 typedef struct ExceptionRecord ExceptionRecord;
 struct ExceptionRecord {
        uint32 ExceptionCode;
index 1b07dfbc1926c976640aaa2b07043bb99e0420f1..7cfd9ad0f71ada48261ffd1414f869a98af349fc 100644 (file)
@@ -38,6 +38,7 @@ enum {
        $EXCEPTION_INT_OVERFLOW = STATUS_INTEGER_OVERFLOW,
 };
 
+typedef SYSTEM_INFO $SystemInfo;
 typedef EXCEPTION_RECORD $ExceptionRecord;
 #ifdef _X86_
 typedef FLOATING_SAVE_AREA $FloatingSaveArea;
index 97a42d73a0f9a15220a3fe6b6511a06ca3d8cf01..ff075b77dcec7206462828c240db5a81792e6671 100644 (file)
@@ -17,6 +17,7 @@
 #pragma dynimport runtime·GetEnvironmentStringsW GetEnvironmentStringsW "kernel32.dll"
 #pragma dynimport runtime·GetProcAddress GetProcAddress "kernel32.dll"
 #pragma dynimport runtime·GetStdHandle GetStdHandle "kernel32.dll"
+#pragma dynimport runtime·GetSystemInfo GetSystemInfo "kernel32.dll"
 #pragma dynimport runtime·GetThreadContext GetThreadContext "kernel32.dll"
 #pragma dynimport runtime·LoadLibraryEx LoadLibraryExA "kernel32.dll"
 #pragma dynimport runtime·QueryPerformanceCounter QueryPerformanceCounter "kernel32.dll"
@@ -26,6 +27,7 @@
 #pragma dynimport runtime·SetEvent SetEvent "kernel32.dll"
 #pragma dynimport runtime·SetThreadPriority SetThreadPriority "kernel32.dll"
 #pragma dynimport runtime·SetWaitableTimer SetWaitableTimer "kernel32.dll"
+#pragma dynimport runtime·Sleep Sleep "kernel32.dll"
 #pragma dynimport runtime·SuspendThread SuspendThread "kernel32.dll"
 #pragma dynimport runtime·timeBeginPeriod timeBeginPeriod "winmm.dll"
 #pragma dynimport runtime·WaitForSingleObject WaitForSingleObject "kernel32.dll"
@@ -41,6 +43,7 @@ extern void *runtime·FreeEnvironmentStringsW;
 extern void *runtime·GetEnvironmentStringsW;
 extern void *runtime·GetProcAddress;
 extern void *runtime·GetStdHandle;
+extern void *runtime·GetSystemInfo;
 extern void *runtime·GetThreadContext;
 extern void *runtime·LoadLibraryEx;
 extern void *runtime·QueryPerformanceCounter;
@@ -50,6 +53,7 @@ extern void *runtime·SetConsoleCtrlHandler;
 extern void *runtime·SetEvent;
 extern void *runtime·SetThreadPriority;
 extern void *runtime·SetWaitableTimer;
+extern void *runtime·Sleep;
 extern void *runtime·SuspendThread;
 extern void *runtime·timeBeginPeriod;
 extern void *runtime·WaitForSingleObject;
@@ -57,6 +61,15 @@ extern void *runtime·WriteFile;
 
 static int64 timerfreq;
 
+static int32
+getproccount(void)
+{
+       SystemInfo info;
+
+       runtime·stdcall(runtime·GetSystemInfo, 1, &info);
+       return info.dwNumberOfProcessors;
+}
+
 void
 runtime·osinit(void)
 {
@@ -67,6 +80,7 @@ runtime·osinit(void)
        runtime·stdcall(runtime·QueryPerformanceFrequency, 1, &timerfreq);
        runtime·stdcall(runtime·SetConsoleCtrlHandler, 2, runtime·ctrlhandler, (uintptr)1);
        runtime·stdcall(runtime·timeBeginPeriod, 1, (uintptr)1);
+       runtime·ncpu = getproccount();
 }
 
 void
@@ -126,6 +140,21 @@ runtime·write(int32 fd, void *buf, int32 n)
        return written;
 }
 
+void
+runtime·osyield(void)
+{
+       runtime·stdcall(runtime·Sleep, 1, (uintptr)0);
+}
+
+void
+runtime·usleep(uint32 us)
+{
+       us /= 1000;
+       if(us == 0)
+               us = 1;
+       runtime·stdcall(runtime·Sleep, 1, (uintptr)us);
+}
+
 // Thread-safe allocation of an event.
 static void
 initevent(void **pevent)