runtime: make NumGoroutine wait for system goroutines to register

In libgo system goroutines register themselves after they start.
That means that there is a small race between the goroutine being
seen by the scheduler and the scheduler knowing that the goroutine
is a system goroutine. That in turn means that runtime.NumGoroutines
can overestimate the number of goroutines at times.

This patch fixes the overestimate by counting the number of system
goroutines waiting to start, and pausing NumGoroutines until those
goroutines have all registered.

This is kind of a lot of mechanism for this not very important
problem, but I couldn't think of a better approach.

The test for this is TestNumGoroutine in runtime/proc_test.go.
The test is not currently run, but it will be soon.

Change-Id: I1f162f0d5ce0c72b55aadec735ff6d8a4e8f5a25
Reviewed-on: https://go-review.googlesource.com/46457
Reviewed-by: Than McIntosh <thanm@google.com>
5 files changed