1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // 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))
- }
|