upas/fs: remove unused segbrk memory allocator
This commit is contained in:
parent
8417787f99
commit
75bca30647
1 changed files with 0 additions and 164 deletions
|
@ -1,164 +0,0 @@
|
|||
#include "common.h"
|
||||
#include <libsec.h>
|
||||
#include "dat.h"
|
||||
|
||||
/*
|
||||
* unnatural acts with virtual memory
|
||||
*/
|
||||
|
||||
typedef struct{
|
||||
int ref;
|
||||
char *va;
|
||||
long sz;
|
||||
}S;
|
||||
|
||||
static S s[15]; /* 386 only gives 4 */
|
||||
static int nstab = nelem(s);
|
||||
static long ssem = 1;
|
||||
//static ulong thresh = 10*1024*1024;
|
||||
static ulong thresh = 1024;
|
||||
|
||||
void*
|
||||
segmalloc(ulong sz)
|
||||
{
|
||||
int i, j;
|
||||
void *va;
|
||||
|
||||
if(sz < thresh)
|
||||
return emalloc(sz);
|
||||
semacquire(&ssem, 1);
|
||||
for(i = 0; i < nstab; i++)
|
||||
if(s[i].ref == 0)
|
||||
goto found;
|
||||
notfound:
|
||||
/* errstr not informative; assume we hit seg limit */
|
||||
for(j = nstab - 1; j >= i; j--)
|
||||
if(s[j].ref)
|
||||
break;
|
||||
nstab = j;
|
||||
semrelease(&ssem, 1);
|
||||
return emalloc(sz);
|
||||
found:
|
||||
/*
|
||||
* the system doesn't leave any room for expansion
|
||||
*/
|
||||
va = segattach(SG_CEXEC, "memory", 0, sz + sz/10 + 4096);
|
||||
if(va == 0)
|
||||
goto notfound;
|
||||
s[i].ref++;
|
||||
s[i].va = va;
|
||||
s[i].sz = sz;
|
||||
semrelease(&ssem, 1);
|
||||
memset(va, 0, sz);
|
||||
return va;
|
||||
}
|
||||
|
||||
void
|
||||
segmfree(void *va)
|
||||
{
|
||||
char *a;
|
||||
int i;
|
||||
|
||||
a = va;
|
||||
for(i = 0; i < nstab; i++)
|
||||
if(s[i].va == a)
|
||||
goto found;
|
||||
free(va);
|
||||
return;
|
||||
found:
|
||||
semacquire(&ssem, 1);
|
||||
s[i].ref--;
|
||||
s[i].va = 0;
|
||||
s[i].sz = 0;
|
||||
semrelease(&ssem, 1);
|
||||
}
|
||||
|
||||
void*
|
||||
segreallocfixup(int i, ulong sz)
|
||||
{
|
||||
char buf[ERRMAX];
|
||||
void *va, *ova;
|
||||
|
||||
rerrstr(buf, sizeof buf);
|
||||
if(strstr(buf, "segments overlap") == 0)
|
||||
sysfatal("segibrk: %r");
|
||||
va = segattach(SG_CEXEC, "memory", 0, sz);
|
||||
if(va == 0)
|
||||
sysfatal("segattach: %r");
|
||||
ova = s[i].va;
|
||||
fprint(2, "fix memcpy(%p, %p, %lud)\n", va, ova, s[i].sz);
|
||||
memcpy(va, ova, s[i].sz);
|
||||
s[i].va = va;
|
||||
s[i].sz = sz;
|
||||
segdetach(ova);
|
||||
return va;
|
||||
}
|
||||
|
||||
void*
|
||||
segrealloc(void *va, ulong sz)
|
||||
{
|
||||
char *a;
|
||||
int i;
|
||||
ulong sz0;
|
||||
|
||||
fprint(2, "segrealloc %p %lud\n", va, sz);
|
||||
if(va == 0)
|
||||
return segmalloc(sz);
|
||||
a = va;
|
||||
for(i = 0; i < nstab; i++)
|
||||
if(s[i].va == a)
|
||||
goto found;
|
||||
if(sz >= thresh)
|
||||
if(a = segmalloc(sz)){
|
||||
sz0 = msize(va);
|
||||
memcpy(a, va, sz0);
|
||||
fprint(2, "memset(%p, 0, %lud)\n", a + sz0, sz - sz0);
|
||||
memset(a + sz0, 0, sz - sz0);
|
||||
return a;
|
||||
}
|
||||
return realloc(va, sz);
|
||||
found:
|
||||
sz0 = s[i].sz;
|
||||
fprint(2, "segbrk(%p, %p)\n", s[i].va, s[i].va + sz);
|
||||
va = segbrk(s[i].va, s[i].va + sz);
|
||||
if(va == (void*)-1 || va < end)
|
||||
return segreallocfixup(i, sz);
|
||||
a = va;
|
||||
if(sz > sz0)
|
||||
{
|
||||
fprint(2, "memset(%p, 0, %lud)\n", a + sz0, sz - sz0);
|
||||
memset(a + sz0, 0, sz - sz0);
|
||||
}
|
||||
s[i].va = va;
|
||||
s[i].sz = sz;
|
||||
return va;
|
||||
}
|
||||
|
||||
void*
|
||||
emalloc(ulong n)
|
||||
{
|
||||
void *p;
|
||||
fprint(2, "emalloc %lud\n", n);
|
||||
p = mallocz(n, 1);
|
||||
if(!p)
|
||||
sysfatal("malloc %lud: %r", n);
|
||||
setmalloctag(p, getcallerpc(&n));
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
char *p;
|
||||
int i;
|
||||
ulong sz;
|
||||
|
||||
p = 0;
|
||||
for(i = 0; i < 6; i++){
|
||||
sz = i*512;
|
||||
p = segrealloc(p, sz);
|
||||
memset(p, 0, sz);
|
||||
}
|
||||
segmfree(p);
|
||||
exits("");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue