]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: preparation for non-Go threads running Go code
authorRuss Cox <rsc@golang.org>
Mon, 18 Feb 2013 18:43:12 +0000 (13:43 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 18 Feb 2013 18:43:12 +0000 (13:43 -0500)
* Handle p==nil in signalstack by setting SS_DISABLE flag.
* Make minit only allocate a signal g if there's not one already.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/7323072

22 files changed:
src/pkg/runtime/os_darwin.h
src/pkg/runtime/os_freebsd.h
src/pkg/runtime/os_linux.h
src/pkg/runtime/os_netbsd.h
src/pkg/runtime/os_openbsd.h
src/pkg/runtime/signal_darwin_386.c
src/pkg/runtime/signal_darwin_amd64.c
src/pkg/runtime/signal_freebsd_386.c
src/pkg/runtime/signal_freebsd_amd64.c
src/pkg/runtime/signal_freebsd_arm.c
src/pkg/runtime/signal_linux_386.c
src/pkg/runtime/signal_linux_amd64.c
src/pkg/runtime/signal_linux_arm.c
src/pkg/runtime/signal_netbsd_386.c
src/pkg/runtime/signal_netbsd_amd64.c
src/pkg/runtime/signal_netbsd_arm.c
src/pkg/runtime/signal_openbsd_386.c
src/pkg/runtime/signal_openbsd_amd64.c
src/pkg/runtime/thread_darwin.c
src/pkg/runtime/thread_linux.c
src/pkg/runtime/thread_netbsd.c
src/pkg/runtime/thread_openbsd.c

index 83386fa94f3f78b7ecd0ff3b1c413072cd8d2bdd..5fcb717cbb21965e5029fd009d0cb3ca650d38ca 100644 (file)
@@ -5,6 +5,7 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 #define SIGHUP 1
+#define SS_DISABLE 4
 
 int32  runtime·bsdthread_create(void*, M*, G*, void(*)(void));
 int32  runtime·bsdthread_register(void);
index cb01e39e0a5c7efef2ebab7b38e2f90a1f27e82e..a37ad7cd878a4ab3eddce7c03cea38e29f50c529 100644 (file)
@@ -1,6 +1,7 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 #define SIGHUP 1
+#define SS_DISABLE 4
 
 int32  runtime·thr_new(ThrParam*, int32);
 void   runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp);
index 5ae5d24feb9c2d8d08d269df8d6ea5e8453b747e..a23fe0f735fbe0ef585a7f76be114a98280343f3 100644 (file)
@@ -5,6 +5,7 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 #define SIGHUP 1
+#define SS_DISABLE 2
 
 // Linux-specific system calls
 int32  runtime·futex(uint32*, int32, uint32, Timespec*, uint32*, uint32);
index 13a62792703a0f06a30fb442c0642a9dc97c03e9..19d72fd25493462783630de96d8459220595420c 100644 (file)
@@ -5,6 +5,7 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 #define SIGHUP 1
+#define SS_DISABLE 4
 
 #define SIG_BLOCK 1
 #define SIG_UNBLOCK 2
index 2c6f3c4e905a0dbd4bd3cd34f99b020b51afd530..a599aad05313e3df8b3a33b03f8de81a7393a41e 100644 (file)
@@ -5,6 +5,7 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 #define SIGHUP 1
+#define SS_DISABLE 4
 
 #define SIG_BLOCK 1
 #define SIG_UNBLOCK 2
index deb16d7a60ebc42839f79b6e5c8b1da407fff7fd..132ca931b6acaee6298e573064078870078b759c 100644 (file)
@@ -125,6 +125,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 33dc9a6be5a17099c95a7c9d26aa219052f2aac3..4b7256bf43948fa7671a79e522c8db7927fc74df 100644 (file)
@@ -135,6 +135,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index f9c8f91223582fa0fd43c9ba40874949e0c6e367..254e5e27729c8285705c1942ef09b779368ed48d 100644 (file)
@@ -120,6 +120,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = (int8*)p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 475e69c1dfb7ecd78cb14d44daf6813283b6bf3e..7dbf36075b8fcea4b8f7e22a5186226c64a604c2 100644 (file)
@@ -128,6 +128,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = (int8*)p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 5b8ad5f173378c2758697949f07c1af409ffa0c7..2a0e9ac913282c924edd69407d5ee86d6a6cfbdf 100644 (file)
@@ -143,6 +143,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = (uint8*)p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 1fdb03f572963b9d7e86641460b148d65aa46c30..9b45ec3bd2e618d1f385b338d2beb0e651ccbcc6 100644 (file)
@@ -116,6 +116,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 30b12fa1be97992755d7923fb9d02ca6be79ab0f..c4e39a6ab01f6aa5624235a341e75ba32985e7f5 100644 (file)
@@ -126,6 +126,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 577ac29bfa2e3b0a48042f6f80cbdc6aa6e1a95e..b5a137c3691d551c9204b75b75c09deaff63dbc4 100644 (file)
@@ -132,6 +132,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index f788f12f55f13f96e72a0a0f89fbfd7c797f2c50..08744c42519d79fb3c2df570fae46752ea8f1556 100644 (file)
@@ -120,6 +120,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 5bdc143ad001a027eb58c240788adb737bbf85f7..46afb682ba16e3b6459bc9104ac32567e47c192f 100644 (file)
@@ -127,6 +127,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index 5dfea5ca1c39ff110b35d4c264ea06ee3eda11d0..97f62687bd68f29ffd93c1c8236e8306f76d91ba 100644 (file)
@@ -149,6 +149,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = (uint8*)p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index e1537fed825d54b984b920cf3e57e0f47f0dd2a1..516797c8d20a907dd3e5f645a28f772469d2bd31 100644 (file)
@@ -116,6 +116,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index a82d5163c6313f573438e885b58de28e15f7c92c..0d0db770b52f7445366222354831ac5b7b6b84e2 100644 (file)
@@ -125,6 +125,8 @@ runtime·signalstack(byte *p, int32 n)
        st.ss_sp = p;
        st.ss_size = n;
        st.ss_flags = 0;
+       if(p == nil)
+               st.ss_flags = SS_DISABLE;
        runtime·sigaltstack(&st, nil);
 }
 
index df1adf63e92a7cf9633733f63ea04d07fb83f89b..83c638067dd6be6830de7b4b0207672358fe1619 100644 (file)
@@ -113,7 +113,8 @@ void
 runtime·minit(void)
 {
        // Initialize signal handling.
-       m->gsignal = runtime·malg(32*1024);    // OS X wants >=8K, Linux >=2K
+       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·sigprocmask(SIG_SETMASK, &sigset_none, nil);
@@ -438,10 +439,11 @@ runtime·sigpanic(void)
        runtime·panicstring(runtime·sigtab[g->sig].name);
 }
 
-// TODO(rsc): place holder to fix build.
+#pragma textflag 7
 void
 runtime·osyield(void)
 {
+       runtime·usleep(1);
 }
 
 uintptr
index 1a7eb7240c185448a7d2ebb9a7e71246b156b019..fdd40c223e05fa8e90abbc4ba3319955923c0d71 100644 (file)
@@ -175,7 +175,8 @@ void
 runtime·minit(void)
 {
        // Initialize signal handling.
-       m->gsignal = runtime·malg(32*1024);    // OS X wants >=8K, Linux >=2K
+       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·rtsigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof(Sigset));
 }
index 21fbc588a940e40a4e9cc54e799ee709cf245d20..bbe7df6e98b790d653001e85e954ab25909cc8c6 100644 (file)
@@ -193,7 +193,8 @@ runtime·minit(void)
        m->procid = runtime·lwp_self();
 
        // Initialize signal handling
-       m->gsignal = runtime·malg(32*1024);
+       if(m->gsignal == nil)
+               m->gsignal = runtime·malg(32*1024);
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
        runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
 }
index 2900f370b7c6fdd6cf6896c1507f83ede73c7799..ce8043f016c519705b33ea466f7c07bdd966130c 100644 (file)
@@ -170,7 +170,8 @@ void
 runtime·minit(void)
 {
        // Initialize signal handling
-       m->gsignal = runtime·malg(32*1024);
+       if(m->gsignal == nil)
+               m->gsignal = runtime·malg(32*1024);
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
        runtime·sigprocmask(SIG_SETMASK, sigset_none);
 }