2008-12-18 16:42:28 -07:00
|
|
|
// Copyright 2009 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.
|
|
|
|
|
|
|
|
// Fixed-size object allocator. Returned memory is not zeroed.
|
|
|
|
//
|
|
|
|
// See malloc.h for overview.
|
|
|
|
|
|
|
|
#include "runtime.h"
|
2011-12-16 13:33:58 -07:00
|
|
|
#include "arch_GOARCH.h"
|
2008-12-18 16:42:28 -07:00
|
|
|
#include "malloc.h"
|
|
|
|
|
|
|
|
// Initialize f to allocate objects of the given size,
|
|
|
|
// using the allocator to obtain chunks of memory.
|
|
|
|
void
|
runtime: account for all sys memory in MemStats
Currently lots of sys allocations are not accounted in any of XxxSys,
including GC bitmap, spans table, GC roots blocks, GC finalizer blocks,
iface table, netpoll descriptors and more. Up to ~20% can unaccounted.
This change introduces 2 new stats: GCSys and OtherSys for GC metadata
and all other misc allocations, respectively.
Also ensures that all XxxSys indeed sum up to Sys. All sys memory allocation
functions require the stat for accounting, so that it's impossible to miss something.
Also fix updating of mcache_sys/inuse, they were not updated after deallocation.
test/bench/garbage/parser before:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14204928
MCacheSys 16384
BuckHashSys 1439992
after:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14188544
MCacheSys 16384
BuckHashSys 3194304
GCSys 39198688
OtherSys 3129656
Fixes #5799.
R=rsc, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/12946043
2013-09-06 14:55:40 -06:00
|
|
|
runtime·FixAlloc_Init(FixAlloc *f, uintptr size, void (*first)(void*, byte*), void *arg, uint64 *stat)
|
2008-12-18 16:42:28 -07:00
|
|
|
{
|
|
|
|
f->size = size;
|
2009-01-28 16:22:16 -07:00
|
|
|
f->first = first;
|
|
|
|
f->arg = arg;
|
2008-12-18 16:42:28 -07:00
|
|
|
f->list = nil;
|
|
|
|
f->chunk = nil;
|
|
|
|
f->nchunk = 0;
|
2010-03-29 14:06:26 -06:00
|
|
|
f->inuse = 0;
|
runtime: account for all sys memory in MemStats
Currently lots of sys allocations are not accounted in any of XxxSys,
including GC bitmap, spans table, GC roots blocks, GC finalizer blocks,
iface table, netpoll descriptors and more. Up to ~20% can unaccounted.
This change introduces 2 new stats: GCSys and OtherSys for GC metadata
and all other misc allocations, respectively.
Also ensures that all XxxSys indeed sum up to Sys. All sys memory allocation
functions require the stat for accounting, so that it's impossible to miss something.
Also fix updating of mcache_sys/inuse, they were not updated after deallocation.
test/bench/garbage/parser before:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14204928
MCacheSys 16384
BuckHashSys 1439992
after:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14188544
MCacheSys 16384
BuckHashSys 3194304
GCSys 39198688
OtherSys 3129656
Fixes #5799.
R=rsc, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/12946043
2013-09-06 14:55:40 -06:00
|
|
|
f->stat = stat;
|
2008-12-18 16:42:28 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void*
|
runtime: ,s/[a-zA-Z0-9_]+/runtime·&/g, almost
Prefix all external symbols in runtime by runtime·,
to avoid conflicts with possible symbols of the same
name in linked-in C libraries. The obvious conflicts
are printf, malloc, and free, but hide everything to
avoid future pain.
The symbols left alone are:
** known to cgo **
_cgo_free
_cgo_malloc
libcgo_thread_start
initcgo
ncgocall
** known to linker **
_rt0_$GOARCH
_rt0_$GOARCH_$GOOS
text
etext
data
end
pclntab
epclntab
symtab
esymtab
** known to C compiler **
_divv
_modv
_div64by32
etc (arch specific)
Tested on darwin/386, darwin/amd64, linux/386, linux/amd64.
Built (but not tested) for freebsd/386, freebsd/amd64, linux/arm, windows/386.
R=r, PeterGo
CC=golang-dev
https://golang.org/cl/2899041
2010-11-04 12:00:19 -06:00
|
|
|
runtime·FixAlloc_Alloc(FixAlloc *f)
|
2008-12-18 16:42:28 -07:00
|
|
|
{
|
|
|
|
void *v;
|
2013-03-14 08:10:12 -06:00
|
|
|
|
|
|
|
if(f->size == 0) {
|
|
|
|
runtime·printf("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n");
|
|
|
|
runtime·throw("runtime: internal error");
|
|
|
|
}
|
2008-12-18 16:42:28 -07:00
|
|
|
|
|
|
|
if(f->list) {
|
|
|
|
v = f->list;
|
|
|
|
f->list = *(void**)f->list;
|
2010-03-29 14:06:26 -06:00
|
|
|
f->inuse += f->size;
|
2008-12-18 16:42:28 -07:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
if(f->nchunk < f->size) {
|
runtime: account for all sys memory in MemStats
Currently lots of sys allocations are not accounted in any of XxxSys,
including GC bitmap, spans table, GC roots blocks, GC finalizer blocks,
iface table, netpoll descriptors and more. Up to ~20% can unaccounted.
This change introduces 2 new stats: GCSys and OtherSys for GC metadata
and all other misc allocations, respectively.
Also ensures that all XxxSys indeed sum up to Sys. All sys memory allocation
functions require the stat for accounting, so that it's impossible to miss something.
Also fix updating of mcache_sys/inuse, they were not updated after deallocation.
test/bench/garbage/parser before:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14204928
MCacheSys 16384
BuckHashSys 1439992
after:
Sys 670064344
HeapSys 610271232
StackSys 65536
MSpanSys 14188544
MCacheSys 16384
BuckHashSys 3194304
GCSys 39198688
OtherSys 3129656
Fixes #5799.
R=rsc, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/12946043
2013-09-06 14:55:40 -06:00
|
|
|
f->chunk = runtime·persistentalloc(FixAllocChunk, 0, f->stat);
|
2008-12-18 16:42:28 -07:00
|
|
|
f->nchunk = FixAllocChunk;
|
|
|
|
}
|
|
|
|
v = f->chunk;
|
2009-01-28 16:22:16 -07:00
|
|
|
if(f->first)
|
|
|
|
f->first(f->arg, v);
|
2008-12-18 16:42:28 -07:00
|
|
|
f->chunk += f->size;
|
|
|
|
f->nchunk -= f->size;
|
2010-03-29 14:06:26 -06:00
|
|
|
f->inuse += f->size;
|
2008-12-18 16:42:28 -07:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
runtime: ,s/[a-zA-Z0-9_]+/runtime·&/g, almost
Prefix all external symbols in runtime by runtime·,
to avoid conflicts with possible symbols of the same
name in linked-in C libraries. The obvious conflicts
are printf, malloc, and free, but hide everything to
avoid future pain.
The symbols left alone are:
** known to cgo **
_cgo_free
_cgo_malloc
libcgo_thread_start
initcgo
ncgocall
** known to linker **
_rt0_$GOARCH
_rt0_$GOARCH_$GOOS
text
etext
data
end
pclntab
epclntab
symtab
esymtab
** known to C compiler **
_divv
_modv
_div64by32
etc (arch specific)
Tested on darwin/386, darwin/amd64, linux/386, linux/amd64.
Built (but not tested) for freebsd/386, freebsd/amd64, linux/arm, windows/386.
R=r, PeterGo
CC=golang-dev
https://golang.org/cl/2899041
2010-11-04 12:00:19 -06:00
|
|
|
runtime·FixAlloc_Free(FixAlloc *f, void *p)
|
2008-12-18 16:42:28 -07:00
|
|
|
{
|
2010-03-29 14:06:26 -06:00
|
|
|
f->inuse -= f->size;
|
2008-12-18 16:42:28 -07:00
|
|
|
*(void**)p = f->list;
|
|
|
|
f->list = p;
|
|
|
|
}
|
|
|
|
|