| package cgotest |
| |
| /* |
| void lockOSThreadCallback(void); |
| inline static void lockOSThreadC(void) |
| { |
| lockOSThreadCallback(); |
| } |
| int usleep(unsigned usec); |
| */ |
| import "C" |
| |
| import ( |
| "runtime" |
| "testing" |
| ) |
| |
| func init() { |
| // Same as test3775 but run during init so that |
| // there are two levels of internal runtime lock |
| // (1 for init, 1 for cgo). |
| // This would have been broken by CL 11663043. |
| C.lockOSThreadC() |
| } |
| |
| func test3775(t *testing.T) { |
| // Used to panic because of the UnlockOSThread below. |
| C.lockOSThreadC() |
| } |
| |
| //export lockOSThreadCallback |
| func lockOSThreadCallback() { |
| runtime.LockOSThread() |
| runtime.UnlockOSThread() |
| go C.usleep(10000) |
| runtime.Gosched() |
| } |