github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/misc/cgo/testasan/main.go (about)

     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  	"time"
    40  )
    41  
    42  func main() {
    43  	// ensure that we can function normally
    44  	var v [][]byte
    45  	for i := 0; i < 1000; i++ {
    46  		time.Sleep(10 * time.Microsecond)
    47  		v = append(v, make([]byte, 64<<10))
    48  	}
    49  }