aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime/go-main.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-11-28 05:45:49 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-11-28 05:45:49 +0000
commit737087cbc8393b1a95a871b15a917872f1328c6b (patch)
treeaf256a0152425084325ad100d75615322c726b8a /libgo/runtime/go-main.c
parenta01207c473dcab88eb0ac769d2d9c68d7c9e0588 (diff)
downloadgcc-737087cbc8393b1a95a871b15a917872f1328c6b.zip
gcc-737087cbc8393b1a95a871b15a917872f1328c6b.tar.gz
gcc-737087cbc8393b1a95a871b15a917872f1328c6b.tar.bz2
runtime: Multiplex goroutines onto OS threads.
From-SVN: r181772
Diffstat (limited to 'libgo/runtime/go-main.c')
-rw-r--r--libgo/runtime/go-main.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/libgo/runtime/go-main.c b/libgo/runtime/go-main.c
index 6fa6a1f..8047eae 100644
--- a/libgo/runtime/go-main.c
+++ b/libgo/runtime/go-main.c
@@ -8,6 +8,7 @@
#include <stdlib.h>
#include <time.h>
+#include <unistd.h>
#ifdef HAVE_FPU_CONTROL_H
#include <fpu_control.h>
@@ -15,7 +16,6 @@
#include "go-alloc.h"
#include "array.h"
-#include "go-signal.h"
#include "go-string.h"
#include "runtime.h"
@@ -36,36 +36,39 @@ extern char **environ;
extern void __go_init_main (void);
extern void real_main (void) asm ("main.main");
+static void mainstart (void *);
+
/* The main function. */
int
main (int argc, char **argv)
{
+ runtime_initsig (0);
runtime_args (argc, (byte **) argv);
-
- m = &runtime_m0;
- g = &runtime_g0;
- m->curg = g;
- g->m = m;
- runtime_mallocinit ();
- __go_gc_goroutine_init (&argc);
-
- runtime_osinit();
- runtime_goargs();
- runtime_goenvs();
-
- __initsig ();
+ runtime_osinit ();
+ runtime_schedinit ();
#if defined(HAVE_SRANDOM)
srandom ((unsigned int) time (NULL));
#else
srand ((unsigned int) time (NULL));
#endif
+
+ __go_go (mainstart, NULL);
+ runtime_mstart (runtime_m ());
+ abort ();
+}
+
+static void
+mainstart (void *arg __attribute__ ((unused)))
+{
__go_init_main ();
- __go_enable_gc ();
+ mstats.enablegc = 1;
real_main ();
- return 0;
+ runtime_exit (0);
+
+ abort ();
}