Viewing file: bigstack_windows.c (1.2 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.
// This test source is used by both TestBigStackCallbackCgo (linked // directly into the Go binary) and TestBigStackCallbackSyscall // (compiled into a DLL).
#include <windows.h> #include <stdio.h>
#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION #define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 #endif
typedef void callback(char*);
// Allocate a stack that's much larger than the default. static const int STACK_SIZE = 16<<20;
static callback *bigStackCallback;
static void useStack(int bytes) { // Windows doesn't like huge frames, so we grow the stack 64k at a time. char x[64<<10]; if (bytes < sizeof x) { bigStackCallback(x); } else { useStack(bytes - sizeof x); } }
static DWORD WINAPI threadEntry(LPVOID lpParam) { useStack(STACK_SIZE - (128<<10)); return 0; }
void bigStack(callback *cb) { bigStackCallback = cb; HANDLE hThread = CreateThread(NULL, STACK_SIZE, threadEntry, NULL, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL); if (hThread == NULL) { fprintf(stderr, "CreateThread failed\n"); exit(1); } WaitForSingleObject(hThread, INFINITE); }
|