1
0
mirror of https://github.com/golang/go synced 2024-11-13 19:10:22 -07:00

runtime: split minit() to mpreinit() and minit()

mpreinit() is called on the parent thread and with mcache (can allocate memory),
minit() is called on the child thread and can not allocate memory.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7389043
This commit is contained in:
Dmitriy Vyukov 2013-02-21 16:24:38 +04:00
parent c53fab969c
commit a0955a2aa2
9 changed files with 69 additions and 13 deletions

View File

@ -370,6 +370,8 @@ mcommoninit(M *mp)
runtime·callers(1, mp->createstack, nelem(mp->createstack)); runtime·callers(1, mp->createstack, nelem(mp->createstack));
runtime·mpreinit(mp);
// Add to runtime·allm so garbage collector doesn't free m // Add to runtime·allm so garbage collector doesn't free m
// when it is just in a register or thread-local storage. // when it is just in a register or thread-local storage.
mp->alllink = runtime·allm; mp->alllink = runtime·allm;

View File

@ -660,6 +660,7 @@ int32 runtime·atoi(byte*);
void runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void)); void runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void));
G* runtime·malg(int32); G* runtime·malg(int32);
void runtime·asminit(void); void runtime·asminit(void);
void runtime·mpreinit(M*);
void runtime·minit(void); void runtime·minit(void);
void runtime·unminit(void); void runtime·unminit(void);
void runtime·signalstack(byte*, int32); void runtime·signalstack(byte*, int32);

View File

@ -109,12 +109,19 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
mp->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
// Initialize signal handling. // Initialize signal handling.
if(m->gsignal == nil)
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil); runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);

View File

@ -121,11 +121,19 @@ runtime·goenvs(void)
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
mp->gsignal = runtime·malg(32*1024);
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
// Initialize signal handling // Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
runtime·sigprocmask(&sigset_none, nil); runtime·sigprocmask(&sigset_none, nil);
} }

View File

@ -171,12 +171,19 @@ runtime·goenvs(void)
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
mp->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
// Initialize signal handling. // Initialize signal handling.
if(m->gsignal == nil)
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
runtime·rtsigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof(Sigset)); runtime·rtsigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof(Sigset));
} }

View File

@ -187,14 +187,21 @@ runtime·goenvs(void)
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
mp->gsignal = runtime·malg(32*1024);
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
m->procid = runtime·lwp_self(); m->procid = runtime·lwp_self();
// Initialize signal handling // Initialize signal handling
if(m->gsignal == nil)
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil); runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
} }

View File

@ -166,12 +166,19 @@ runtime·goenvs(void)
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
mp->gsignal = runtime·malg(32*1024);
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
// Initialize signal handling // Initialize signal handling
if(m->gsignal == nil)
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
runtime·sigprocmask(SIG_SETMASK, sigset_none); runtime·sigprocmask(SIG_SETMASK, sigset_none);
} }

View File

@ -11,13 +11,21 @@ extern SigTab runtime·sigtab[];
int32 runtime·postnote(int32, int8*); int32 runtime·postnote(int32, int8*);
// Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
// Initialize stack and goroutine for note handling.
mp->gsignal = runtime·malg(32*1024);
mp->notesig = (int8*)runtime·malloc(ERRMAX*sizeof(int8));
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {
// Initialize stack and goroutine for note handling.
m->gsignal = runtime·malg(32*1024);
m->notesig = (int8*)runtime·malloc(ERRMAX*sizeof(int8));
// Mask all SSE floating-point exceptions // Mask all SSE floating-point exceptions
// when running on the 64-bit kernel. // when running on the 64-bit kernel.
runtime·setfpmasks(); runtime·setfpmasks();

View File

@ -206,6 +206,15 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
} }
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
void
runtime·mpreinit(M *mp)
{
USED(mp);
}
// Called to initialize a new m (including the bootstrap m).
// Called on the new thread, can not allocate memory.
void void
runtime·minit(void) runtime·minit(void)
{ {