diff options
author | Russ Cox <rsc@golang.org> | 2010-02-03 16:31:34 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-02-03 16:31:34 -0800 |
commit | 3732daa8e7c635ba306dd923a4342650524320df (patch) | |
tree | 31d454f4c7a1d0189ddbd9b1e771c8716655dc72 /src/pkg/runtime/extern.go | |
parent | 9c681e46bfdf7a2745d2df35412592e8c13e0fce (diff) | |
download | golang-3732daa8e7c635ba306dd923a4342650524320df.tar.gz |
finalizers; merge package malloc into package runtime
R=r, cw
CC=golang-dev
http://codereview.appspot.com/198085
Diffstat (limited to 'src/pkg/runtime/extern.go')
-rw-r--r-- | src/pkg/runtime/extern.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/pkg/runtime/extern.go b/src/pkg/runtime/extern.go index 85b165922..53b86b764 100644 --- a/src/pkg/runtime/extern.go +++ b/src/pkg/runtime/extern.go @@ -70,3 +70,71 @@ func Signame(sig int32) string // Siginit enables receipt of signals via Sigrecv. It should typically // be called during initialization. func Siginit() + +// MemStats holds statistics about the memory system. +// The statistics are only approximate, as they are not interlocked on update. +var MemStats struct { + Alloc uint64 + Sys uint64 + Stacks uint64 + InusePages uint64 + NextGC uint64 + Lookups uint64 + Mallocs uint64 + EnableGC bool +} + +// Alloc allocates a block of the given size. +// FOR TESTING AND DEBUGGING ONLY. +func Alloc(uintptr) *byte + +// Free frees the block starting at the given pointer. +// FOR TESTING AND DEBUGGING ONLY. +func Free(*byte) + +// Lookup returns the base and size of the block containing the given pointer. +// FOR TESTING AND DEBUGGING ONLY. +func Lookup(*byte) (*byte, uintptr) + +// GC runs a garbage collection. +func GC() + +// SetFinalizer sets the finalizer associated with x to f. +// When the garbage collector finds an unreachable block +// with an associated finalizer, it clears the association and creates +// a new goroutine running f(x). Creating the new goroutine makes +// x reachable again, but now without an associated finalizer. +// Assuming that SetFinalizer is not called again, the next time +// the garbage collector sees that x is unreachable, it will free x. +// +// SetFinalizer(x, nil) clears any finalizer associated with f. +// +// The argument x must be a pointer to an object allocated by +// calling new or by taking the address of a composite literal. +// The argument f must be a function that takes a single argument +// of x's type and returns no arguments. If either of these is not +// true, SetFinalizer aborts the program. +// +// Finalizers are run in dependency order: if A points at B, both have +// finalizers, and they are otherwise unreachable, only the finalizer +// for A runs; once A is freed, the finalizer for B can run. +// If a cyclic structure includes a block with a finalizer, that +// cycle is not guaranteed to be garbage collected and the finalizer +// is not guaranteed to run, because there is no ordering that +// respects the dependencies. +// +// The finalizer for x is scheduled to run at some arbitrary time after +// x becomes unreachable. +// There is no guarantee that finalizers will run before a program exits, +// so typically they are useful only for releasing non-memory resources +// associated with an object during a long-running program. +// For example, an os.File object could use a finalizer to close the +// associated operating system file descriptor when a program discards +// an os.File without calling Close, but it would be a mistake +// to depend on a finalizer to flush an in-memory I/O buffer such as a +// bufio.Writer, because the buffer would not be flushed at program exit. +// +// TODO(rsc): make os.File use SetFinalizer +// TODO(rsc): allow f to have (ignored) return values +// +func SetFinalizer(x, f interface{}) |