diff options
Diffstat (limited to 'misc/cgo/testasan/main.go')
-rw-r--r-- | misc/cgo/testasan/main.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/misc/cgo/testasan/main.go b/misc/cgo/testasan/main.go new file mode 100644 index 0000000..bc77678 --- /dev/null +++ b/misc/cgo/testasan/main.go @@ -0,0 +1,56 @@ +// Copyright 2013 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. + +package main + +/* +#include <sys/mman.h> +#include <pthread.h> +#include <unistd.h> + +void ctor(void) __attribute__((constructor)); +static void* thread(void*); + +void +ctor(void) +{ + // occupy memory where Go runtime would normally map heap + mmap((void*)0x00c000000000, 64<<10, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); + + // allocate 4K every 10us + pthread_t t; + pthread_create(&t, 0, thread, 0); +} + +static void* +thread(void *p) +{ + for(;;) { + usleep(10000); + mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + } + return 0; +} +*/ +import "C" + +import ( + "fmt" + "os" + "path/filepath" + "time" +) + +func main() { + start := time.Now() + + // ensure that we can function normally + var v [][]byte + for i := 0; i < 1000; i++ { + time.Sleep(10 * time.Microsecond) + v = append(v, make([]byte, 64<<10)) + } + + fmt.Printf("ok\t%s\t%s\n", filepath.Base(os.Args[0]), time.Since(start).Round(time.Millisecond)) +} |