ref: 1d3644a1684bd191f3a36568d94c2587c2d9f24f
parent: e610ffaf1b7847e82c18a1b9c687cdd7676f86c2
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Apr 10 19:11:25 EDT 2020
cc, ?l: fix gethunk() to actually grow allocation the compilers and linkers use ther own memory allocator. free memory is between hunk and hunk+nhunk. allocation works by checking if nhunk is bigger or equal to the amount needed, and if not, repeatedly call gethunk() until there is. after that, the allocated amount is added from hunk and subtracted from nhunk by the user. the problem was when the needed amount was bigger than the default NHUNK size gethunk() allocates per call. gethunk() would not actually grow nhunk, but instead just set hunk and nhunk variables to the last allocated block. this resulted in a infinite loop of calls to gethunk() until sbrk() would hit the maximum size for the BSS segment. this change makes gethunk() actually grow the hunk space, increasing nhunk, and only updating hunk when nhunk was previously zero. we assume that mysbrk() retuns increasing addresses and that the space between the previous hunk+nhunk and the new block base returned by mysbrk() is usable.
--- a/sys/src/cmd/1l/obj.c
+++ b/sys/src/cmd/1l/obj.c
@@ -1099,8 +1099,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/2l/obj.c
+++ b/sys/src/cmd/2l/obj.c
@@ -1121,8 +1121,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/5l/obj.c
+++ b/sys/src/cmd/5l/obj.c
@@ -1152,8 +1152,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/6l/obj.c
+++ b/sys/src/cmd/6l/obj.c
@@ -1222,8 +1222,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/7l/obj.c
+++ b/sys/src/cmd/7l/obj.c
@@ -1178,8 +1178,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/8l/obj.c
+++ b/sys/src/cmd/8l/obj.c
@@ -1196,8 +1196,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -862,7 +862,10 @@
yyerror("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}
--- a/sys/src/cmd/kl/l.h
+++ b/sys/src/cmd/kl/l.h
@@ -241,7 +241,7 @@
EXTERN long staticgen;
EXTERN Prog* textp;
EXTERN long textsize;
-EXTERN uintptr tothunk;
+EXTERN uintptr thunk;
EXTERN char xcmp[C_NCLASS][C_NCLASS];
EXTERN int version;
EXTERN Prog zprg;
--- a/sys/src/cmd/kl/obj.c
+++ b/sys/src/cmd/kl/obj.c
@@ -194,7 +194,7 @@
out:
if(debug['v']) {
Bprint(&bso, "%5.2f cpu time\n", cputime());
- Bprint(&bso, "%zud memory used\n", tothunk);
+ Bprint(&bso, "%zud memory used\n", thunk);
Bprint(&bso, "%d sizeof adr\n", sizeof(Adr));
Bprint(&bso, "%d sizeof prog\n", sizeof(Prog));
}
@@ -983,9 +983,9 @@
long nh;
nh = NHUNK;
- if(tothunk >= 5L*NHUNK) {
+ if(thunk >= 5L*NHUNK) {
nh = 5L*NHUNK;
- if(tothunk >= 25L*NHUNK)
+ if(thunk >= 25L*NHUNK)
nh = 25L*NHUNK;
}
h = mysbrk(nh);
@@ -993,10 +993,12 @@
diag("out of memory");
errorexit();
}
-
- hunk = h;
- nhunk = nh;
- tothunk += nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
+ thunk += nh;
}
void
--- a/sys/src/cmd/ql/l.h
+++ b/sys/src/cmd/ql/l.h
@@ -234,7 +234,7 @@
EXTERN long staticgen;
EXTERN Prog* textp;
EXTERN long textsize;
-EXTERN uintptr tothunk;
+EXTERN uintptr thunk;
EXTERN char xcmp[C_NCLASS][C_NCLASS];
EXTERN int version;
EXTERN Prog zprg;
--- a/sys/src/cmd/ql/obj.c
+++ b/sys/src/cmd/ql/obj.c
@@ -273,7 +273,7 @@
out:
if(debug['v']) {
Bprint(&bso, "%5.2f cpu time\n", cputime());
- Bprint(&bso, "%zud memory used\n", tothunk);
+ Bprint(&bso, "%zud memory used\n", thunk);
Bprint(&bso, "%d sizeof adr\n", sizeof(Adr));
Bprint(&bso, "%d sizeof prog\n", sizeof(Prog));
}
@@ -1117,9 +1117,9 @@
long nh;
nh = NHUNK;
- if(tothunk >= 5L*NHUNK) {
+ if(thunk >= 5L*NHUNK) {
nh = 5L*NHUNK;
- if(tothunk >= 25L*NHUNK)
+ if(thunk >= 25L*NHUNK)
nh = 25L*NHUNK;
}
h = mysbrk(nh);
@@ -1127,10 +1127,12 @@
diag("out of memory");
errorexit();
}
-
- hunk = h;
- nhunk = nh;
- tothunk += nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
+ thunk += nh;
}
void
--- a/sys/src/cmd/vl/obj.c
+++ b/sys/src/cmd/vl/obj.c
@@ -1075,8 +1075,11 @@
diag("out of memory");
errorexit();
}
- hunk = h;
- nhunk = nh;
+ if(nhunk == 0)
+ hunk = h;
+ else
+ nh += (h - hunk) - nhunk;
+ nhunk += nh;
thunk += nh;
}