cuts working size for hello world from 6 MB to 1.2 MB.
still some work to be done, but diminishing returns.
R=r
https://golang.org/cl/165080
MLink *next;
};
-// SysAlloc obtains a large chunk of memory from the operating system,
-// typically on the order of a hundred kilobytes or a megabyte.
+// SysAlloc obtains a large chunk of zeroed memory from the
+// operating system, typically on the order of a hundred kilobytes
+// or a megabyte.
//
// SysUnused notifies the operating system that the contents
// of the memory region are no longer needed and can be reused
RefSome, // some references
RefNoPointers = 0x80000000U, // flag - no pointers here
};
-
MLink *first, *last, *v;
int32 i;
-
lock(c);
// Replenish central list if empty.
if(MSpanList_IsEmpty(&c->nonempty)) {
{
G *gp;
- // mark data+bss
- scanblock(0, data, end - data);
+ // mark data+bss.
+ // skip mheap itself, which has no interesting pointers
+ // and is mostly zeroed and would not otherwise be paged in.
+ scanblock(0, data, (byte*)&mheap - data);
+ scanblock(0, (byte*)(&mheap+1), end - (byte*)(&mheap+1));
// mark stacks
for(gp=allg; gp!=nil; gp=gp->alllink) {
// NOTE(rsc): In tcmalloc, if we've accumulated enough
// system allocations, the heap map gets entirely allocated
// in 32-bit mode. (In 64-bit mode that's not practical.)
-
if(!MHeapMap_Preallocate(&h->map, ((uintptr)v>>PageShift) - 1, (ask>>PageShift) + 2)) {
SysFree(v, ask);
return false;
p2 = m->allocator(sizeof *p2);
if(p2 == nil)
return false;
- runtime_memclr((byte*)p2, sizeof *p2);
m->p[i1] = p2;
}
p2 = m->allocator(sizeof *p2);
if(p2 == nil)
return false;
- runtime_memclr((byte*)p2, sizeof *p2);
m->p[i1] = p2;
}
p3 = m->allocator(sizeof *p3);
if(p3 == nil)
return false;
- runtime_memclr((byte*)p3, sizeof *p3);
p2->p[i2] = p3;
}
mallocinit();
goargs();
+ // For debugging:
// Allocate internal symbol table representation now,
// so that we don't need to call malloc when we crash.
- findfunc(0);
+ // findfunc(0);
sched.gomaxprocs = 1;
p = getenv("GOMAXPROCS");
#define SYMDATA ((byte*)(0x99LL<<24) + 8)
#endif
-
-// Return a pointer to a byte array containing the symbol table segment.
-void
-runtime·symdat(Slice *symtab, Slice *pclntab)
-{
- Slice *a;
- int32 *v;
-
- // TODO(rsc): Remove once TODO at top of file is done.
- if(goos != nil && strcmp((uint8*)goos, (uint8*)"nacl") == 0) {
- symtab = mal(sizeof *a);
- pclntab = mal(sizeof *a);
- FLUSH(&symtab);
- FLUSH(&pclntab);
- return;
- }
-
- v = SYMCOUNTS;
-
- a = mal(sizeof *a);
- a->len = v[0];
- a->cap = a->len;
- a->array = SYMDATA;
- symtab = a;
- FLUSH(&symtab);
-
- a = mal(sizeof *a);
- a->len = v[1];
- a->cap = a->len;
- a->array = SYMDATA + v[0];
- pclntab = a;
- FLUSH(&pclntab);
-}
-
typedef struct Sym Sym;
struct Sym
{
static byte **fname;
static int32 nfname;
+static Lock funclock;
+
static void
dofunc(Sym *sym)
{
Func *f;
int32 nf, n;
+ lock(&funclock);
if(func == nil)
buildfuncs();
+ unlock(&funclock);
+
if(nfunc == 0)
return nil;
if(addr < func[0].entry || addr >= func[nfunc].entry)