47 lines
1.2 KiB
C
47 lines
1.2 KiB
C
|
// 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);
|
||
|
}
|