| // Copyright 2015 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. |
| |
| //go:build ignore |
| |
| // |
| // This build tag means that "go build" does not build this file. Use "go run |
| // manual_test_program.go" to run it. |
| // |
| // You will also need to change "debug = false" to "debug = true" in mmap_*.go. |
| |
| package main |
| |
| import ( |
| "log" |
| "math/rand" |
| "time" |
| |
| "golang.org/x/exp/mmap" |
| ) |
| |
| var garbage []byte |
| |
| func main() { |
| // If you replace "manual_test_program.go" with the name of an empty (zero |
| // sized) file (and set "const debug = true") then you will not necessarily |
| // see two "munmap log messages", since some operating systems will not |
| // allow a zero sized mapping so there is no need for a finalizer to unmap. |
| const filename = "manual_test_program.go" |
| |
| for _, explicitClose := range []bool{false, true} { |
| r, err := mmap.Open(filename) |
| if err != nil { |
| log.Fatalf("Open: %v", err) |
| } |
| println("Open succeeded; Len =", r.Len()) |
| if explicitClose { |
| r.Close() |
| } else { |
| // Leak the *mmap.ReaderAt returned by mmap.Open. The finalizer |
| // should pick it up, if finalizers run at all. |
| } |
| } |
| |
| println("Finished all explicit Close calls.") |
| println("Creating and collecting garbage.") |
| println("Look for two munmap log messages.") |
| println("Hit Ctrl-C to exit.") |
| |
| rng := rand.New(rand.NewSource(1)) |
| now := time.Now() |
| for { |
| garbage = make([]byte, rng.Intn(1<<20)) |
| if time.Since(now) > 1*time.Second { |
| now = time.Now() |
| print(".") |
| } |
| } |
| } |