Source file misc/cgo/testasan/main.go

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  /*
     8  #include <sys/mman.h>
     9  #include <pthread.h>
    10  #include <unistd.h>
    11  
    12  void ctor(void) __attribute__((constructor));
    13  static void* thread(void*);
    14  
    15  void
    16  ctor(void)
    17  {
    18  	// occupy memory where Go runtime would normally map heap
    19  	mmap((void*)0x00c000000000, 64<<10, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
    20  
    21  	// allocate 4K every 10us
    22  	pthread_t t;
    23  	pthread_create(&t, 0, thread, 0);
    24  }
    25  
    26  static void*
    27  thread(void *p)
    28  {
    29  	for(;;) {
    30  		usleep(10000);
    31  		mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    32  	}
    33  	return 0;
    34  }
    35  */
    36  import "C"
    37  
    38  import (
    39  	"fmt"
    40  	"os"
    41  	"path/filepath"
    42  	"time"
    43  )
    44  
    45  func main() {
    46  	start := time.Now()
    47  
    48  	// ensure that we can function normally
    49  	var v [][]byte
    50  	for i := 0; i < 1000; i++ {
    51  		time.Sleep(10 * time.Microsecond)
    52  		v = append(v, make([]byte, 64<<10))
    53  	}
    54  
    55  	fmt.Printf("ok\t%s\t%s\n", filepath.Base(os.Args[0]), time.Since(start).Round(time.Millisecond))
    56  }
    57  

View as plain text