mirror of
https://github.com/golang/go
synced 2024-11-12 09:50:21 -07:00
3b22ffc07e
With the new buildmodes c-archive and c-shared, it is possible for a cgo call to come in early in the lifecycle of a Go program. Calls before the runtime has been initialized are caught by _cgo_wait_runtime_init_done. However a call can come in after the runtime has initialized, but before the program's package init functions have finished running. To avoid this cgocallback checks m.ncgo to see if we are on a thread running Go. If not, we may be a foreign thread and it blocks until main_init is complete. Change-Id: I7a9f137fa2a40c322a0b93764261f9aa17fcf5b8 Reviewed-on: https://go-review.googlesource.com/8897 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org>
33 lines
665 B
C
33 lines
665 B
C
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
extern signed char DidInitRun();
|
|
extern signed char DidMainRun();
|
|
extern int32_t FromPkg();
|
|
|
|
int main(void) {
|
|
int32_t res;
|
|
|
|
if (!DidInitRun()) {
|
|
fprintf(stderr, "ERROR: buildmode=c-archive init should run\n");
|
|
return 2;
|
|
}
|
|
|
|
if (DidMainRun()) {
|
|
fprintf(stderr, "ERROR: buildmode=c-archive should not run main\n");
|
|
return 2;
|
|
}
|
|
|
|
res = FromPkg();
|
|
if (res != 1024) {
|
|
fprintf(stderr, "ERROR: FromPkg()=%d, want 1024\n", res);
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|