summaryrefslogtreecommitdiffstats
path: root/misc/cgo/testasan/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'misc/cgo/testasan/main.go')
-rw-r--r--misc/cgo/testasan/main.go56
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))
+}