summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/proc.c')
-rw-r--r--src/pkg/runtime/proc.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 5bd92dd80..9b4e34f6f 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -434,23 +434,20 @@ matchmg(void)
// when it is just in a register (R14 on amd64).
m->alllink = allm;
allm = m;
- m->g0 = malg(8192);
m->id = sched.mcount++;
if(libcgo_thread_start != nil) {
CgoThreadStart ts;
- // pthread_create will make us a stack,
- // so free the one malg made.
- stackfree(m->g0->stack0);
- m->g0->stack0 = nil;
- m->g0->stackguard = nil;
- m->g0->stackbase = nil;
+ // pthread_create will make us a stack.
+ m->g0 = malg(-1);
ts.m = m;
ts.g = m->g0;
ts.fn = mstart;
runcgo(libcgo_thread_start, &ts);
- } else
+ } else {
+ m->g0 = malg(8192);
newosproc(m, m->g0, m->g0->stackbase, mstart);
+ }
}
mnextg(m, g);
}
@@ -682,7 +679,7 @@ oldstack(void)
mcpy(top->fp, sp, args);
}
- stackfree((byte*)g1->stackguard - StackGuard);
+ stackfree(g1->stackguard - StackGuard);
g1->stackbase = old.stackbase;
g1->stackguard = old.stackguard;
@@ -710,6 +707,7 @@ newstack(void)
frame += 1024; // for more functions, Stktop.
stk = stackalloc(frame);
+
//printf("newstack frame=%d args=%d morepc=%p morefp=%p gobuf=%p, %p newstk=%p\n", frame, args, m->morepc, m->morefp, g->sched.pc, g->sched.sp, stk);
g1 = m->curg;
@@ -746,10 +744,13 @@ malg(int32 stacksize)
byte *stk;
g = malloc(sizeof(G));
- stk = stackalloc(stacksize + StackGuard);
- g->stack0 = stk;
- g->stackguard = stk + StackGuard;
- g->stackbase = stk + StackGuard + stacksize;
+ if(stacksize >= 0) {
+ stk = stackalloc(stacksize + StackGuard);
+ g->stack0 = stk;
+ g->stackguard = stk + StackGuard;
+ g->stackbase = stk + StackGuard + stacksize - sizeof(Stktop);
+ runtime_memclr(g->stackbase, sizeof(Stktop));
+ }
return g;
}
@@ -772,7 +773,7 @@ void
void
newproc1(byte *fn, byte *argp, int32 narg, int32 nret)
{
- byte *stk, *sp;
+ byte *sp;
G *newg;
int32 siz;
@@ -792,13 +793,8 @@ newproc1(byte *fn, byte *argp, int32 narg, int32 nret)
newg->alllink = allg;
allg = newg;
}
- stk = newg->stack0;
-
- newg->stackguard = stk+StackGuard;
-
- sp = stk + 4096 - 4*8;
- newg->stackbase = sp;
+ sp = newg->stackbase;
sp -= siz;
mcpy(sp, argp, narg);