diff options
Diffstat (limited to 'src/pkg/runtime/mcache.c')
-rw-r--r-- | src/pkg/runtime/mcache.c | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/src/pkg/runtime/mcache.c b/src/pkg/runtime/mcache.c deleted file mode 100644 index e40621186..000000000 --- a/src/pkg/runtime/mcache.c +++ /dev/null @@ -1,133 +0,0 @@ -// 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. - -// Per-thread (in Go, per-M) malloc cache for small objects. -// -// See malloc.h for an overview. - -#include "runtime.h" -#include "malloc.h" - -void* -runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed) -{ - MCacheList *l; - MLink *first, *v; - int32 n; - - // Allocate from list. - l = &c->list[sizeclass]; - if(l->list == nil) { - // Replenish using central lists. - n = runtime·MCentral_AllocList(&runtime·mheap.central[sizeclass], - runtime·class_to_transfercount[sizeclass], &first); - if(n == 0) - runtime·throw("out of memory"); - l->list = first; - l->nlist = n; - c->size += n*size; - } - v = l->list; - l->list = v->next; - l->nlist--; - if(l->nlist < l->nlistmin) - l->nlistmin = l->nlist; - c->size -= size; - - // v is zeroed except for the link pointer - // that we used above; zero that. - v->next = nil; - if(zeroed) { - // block is zeroed iff second word is zero ... - if(size > sizeof(uintptr) && ((uintptr*)v)[1] != 0) - runtime·memclr((byte*)v, size); - else { - // ... except for the link pointer - // that we used above; zero that. - v->next = nil; - } - } - c->local_alloc += size; - c->local_objects++; - return v; -} - -// Take n elements off l and return them to the central free list. -static void -ReleaseN(MCache *c, MCacheList *l, int32 n, int32 sizeclass) -{ - MLink *first, **lp; - int32 i; - - // Cut off first n elements. - first = l->list; - lp = &l->list; - for(i=0; i<n; i++) - lp = &(*lp)->next; - l->list = *lp; - *lp = nil; - l->nlist -= n; - if(l->nlist < l->nlistmin) - l->nlistmin = l->nlist; - c->size -= n*runtime·class_to_size[sizeclass]; - - // Return them to central free list. - runtime·MCentral_FreeList(&runtime·mheap.central[sizeclass], n, first); -} - -void -runtime·MCache_Free(MCache *c, void *v, int32 sizeclass, uintptr size) -{ - int32 i, n; - MCacheList *l; - MLink *p; - - // Put back on list. - l = &c->list[sizeclass]; - p = v; - p->next = l->list; - l->list = p; - l->nlist++; - c->size += size; - c->local_alloc -= size; - c->local_objects--; - - if(l->nlist >= MaxMCacheListLen) { - // Release a chunk back. - ReleaseN(c, l, runtime·class_to_transfercount[sizeclass], sizeclass); - } - - if(c->size >= MaxMCacheSize) { - // Scavenge. - for(i=0; i<NumSizeClasses; i++) { - l = &c->list[i]; - n = l->nlistmin; - - // n is the minimum number of elements we've seen on - // the list since the last scavenge. If n > 0, it means that - // we could have gotten by with n fewer elements - // without needing to consult the central free list. - // Move toward that situation by releasing n/2 of them. - if(n > 0) { - if(n > 1) - n /= 2; - ReleaseN(c, l, n, i); - } - l->nlistmin = l->nlist; - } - } -} - -void -runtime·MCache_ReleaseAll(MCache *c) -{ - int32 i; - MCacheList *l; - - for(i=0; i<NumSizeClasses; i++) { - l = &c->list[i]; - ReleaseN(c, l, l->nlist, i); - l->nlistmin = 0; - } -} |