OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [go.test/] [test/] [mallocrand.go] - Blame information for rev 700

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 700 jeremybenn
// $G $D/$F.go && $L $F.$A && ./$A.out
2
 
3
// Copyright 2009 The Go Authors. All rights reserved.
4
// Use of this source code is governed by a BSD-style
5
// license that can be found in the LICENSE file.
6
 
7
// Random malloc test.
8
 
9
package main
10
 
11
import (
12
        "flag"
13
        "math/rand"
14
        "runtime"
15
        "unsafe"
16
)
17
 
18
var chatty = flag.Bool("v", false, "chatty")
19
 
20
var footprint uint64
21
var allocated uint64
22
 
23
func bigger() {
24
        memstats := new(runtime.MemStats)
25
        runtime.ReadMemStats(memstats)
26
        if f := memstats.Sys; footprint < f {
27
                footprint = f
28
                if *chatty {
29
                        println("Footprint", footprint, " for ", allocated)
30
                }
31
                if footprint > 1e9 {
32
                        println("too big")
33
                        panic("fail")
34
                }
35
        }
36
}
37
 
38
// Prime the data structures by allocating one of
39
// each block in order.  After this, there should be
40
// little reason to ask for more memory from the OS.
41
func prime() {
42
        for i := 0; i < 16; i++ {
43
                b := runtime.Alloc(1 << uint(i))
44
                runtime.Free(b)
45
        }
46
        for i := uintptr(0); i < 256; i++ {
47
                b := runtime.Alloc(i << 12)
48
                runtime.Free(b)
49
        }
50
}
51
 
52
func memset(b *byte, c byte, n uintptr) {
53
        np := uintptr(n)
54
        for i := uintptr(0); i < np; i++ {
55
                *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(b)) + i)) = c
56
        }
57
}
58
 
59
func main() {
60
        flag.Parse()
61
        //      prime()
62
        var blocks [1]struct {
63
                base *byte
64
                siz  uintptr
65
        }
66
        for i := 0; i < 1<<10; i++ {
67
                if i%(1<<10) == 0 && *chatty {
68
                        println(i)
69
                }
70
                b := rand.Int() % len(blocks)
71
                if blocks[b].base != nil {
72
                        //      println("Free", blocks[b].siz, blocks[b].base)
73
                        runtime.Free(blocks[b].base)
74
                        blocks[b].base = nil
75
                        allocated -= uint64(blocks[b].siz)
76
                        continue
77
                }
78
                siz := uintptr(rand.Int() >> (11 + rand.Uint32()%20))
79
                base := runtime.Alloc(siz)
80
                //      ptr := uintptr(syscall.BytePtr(base))+uintptr(siz/2)
81
                //      obj, size, ref, ok := allocator.find(ptr)
82
                //      if obj != base || *ref != 0 || !ok {
83
                //              println("find", siz, obj, ref, ok)
84
                //              panic("fail")
85
                //      }
86
                blocks[b].base = base
87
                blocks[b].siz = siz
88
                allocated += uint64(siz)
89
                //      println("Alloc", siz, base)
90
                memset(base, 0xbb, siz)
91
                bigger()
92
        }
93
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.