]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: replace fprintf(stderr, ...) with fatalf(...) for linux/android
authorDavid Crawshaw <david.crawshaw@zentus.com>
Fri, 4 Jul 2014 01:04:48 +0000 (21:04 -0400)
committerDavid Crawshaw <david.crawshaw@zentus.com>
Fri, 4 Jul 2014 01:04:48 +0000 (21:04 -0400)
Both stdout and stderr are sent to /dev/null in android
apps. Introducing fatalf allows android to implement its
own copy that sends fatal errors to __android_log_print.

LGTM=minux, dave
R=minux, dave
CC=golang-codereviews
https://golang.org/cl/108400045

src/pkg/runtime/cgo/gcc_android.c [new file with mode: 0644]
src/pkg/runtime/cgo/gcc_android_arm.c
src/pkg/runtime/cgo/gcc_fatalf.c [new file with mode: 0644]
src/pkg/runtime/cgo/gcc_linux_386.c
src/pkg/runtime/cgo/gcc_linux_amd64.c
src/pkg/runtime/cgo/gcc_linux_arm.c
src/pkg/runtime/cgo/libcgo.h

diff --git a/src/pkg/runtime/cgo/gcc_android.c b/src/pkg/runtime/cgo/gcc_android.c
new file mode 100644 (file)
index 0000000..be27725
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2014 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 <stdarg.h>
+#include <android/log.h>
+#include "libcgo.h"
+
+void
+fatalf(const char* format, ...)
+{
+       va_list ap;
+
+       // Write to both stderr and logcat.
+       //
+       // When running from an .apk, /dev/stderr and /dev/stdout
+       // redirect to /dev/null. And when running a test binary
+       // via adb shell, it's easy to miss logcat.
+
+       fprintf(stderr, "runtime/cgo: ");
+       va_start(ap, format);
+       vfprintf(stderr, format, ap);
+       va_end(ap);
+       fprintf(stderr, "\n");
+
+       va_start(ap, format);
+       __android_log_vprint(ANDROID_LOG_FATAL, "runtime/cgo", format, ap);
+       va_end(ap);
+
+       abort();
+}
index 58b5fc4a36667b139c50db48025973d1f5bcb56e..07f7e72e3d08ce071444a65b2e74e29795aeae7f 100644 (file)
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#include <android/log.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
@@ -28,9 +27,7 @@ inittls(void **tlsg, void **tlsbase)
 
        err = pthread_key_create(&k, nil);
        if(err != 0) {
-               fprintf(stderr, "runtime/cgo: pthread_key_create failed: %d\n", err);
-               __android_log_print(ANDROID_LOG_FATAL, "runtime/cgo", "pthread_key_create failed: %d", err);
-               abort();
+               fatalf("pthread_key_create failed: %d", err);
        }
        pthread_setspecific(k, (void*)magic1);
        for (i=0; i<PTHREAD_KEYS_MAX; i++) {
@@ -40,9 +37,7 @@ inittls(void **tlsg, void **tlsbase)
                        return;
                }
        }
-       fprintf(stderr, "runtime/cgo: could not find pthread key\n");
-       __android_log_print(ANDROID_LOG_FATAL, "runtime/cgo", "could not find pthread key");
-       abort();
+       fatalf("could not find pthread key");
 }
 
 void (*x_cgo_inittls)(void **tlsg, void **tlsbase) = inittls;
diff --git a/src/pkg/runtime/cgo/gcc_fatalf.c b/src/pkg/runtime/cgo/gcc_fatalf.c
new file mode 100644 (file)
index 0000000..21c1acf
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2014 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.
+
+// +build !android,linux
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "libcgo.h"
+
+void
+fatalf(const char* format, ...)
+{
+       va_list ap;
+
+       fprintf(stderr, "runtime/cgo: ");
+       va_start(ap, format);
+       vfprintf(stderr, format, ap);
+       va_end(ap);
+       fprintf(stderr, "\n");
+       abort();
+}
index 5b282c9b8e0f3e0a43b5de809c6851e8e4808643..82b156cbb01ac8df5f58ecb7cb4591e816b19273 100644 (file)
@@ -49,8 +49,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
        pthread_sigmask(SIG_SETMASK, &oset, nil);
 
        if (err != 0) {
-               fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
-               abort();
+               fatalf("pthread_create failed: %s", strerror(err));
        }
 }
 
index 19ca580b7f0e216d3d88494ff30b31e19bd31f22..fdbf51c254a50cce64017e43ea856b2184d43c34 100644 (file)
@@ -44,8 +44,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
        pthread_sigmask(SIG_SETMASK, &oset, nil);
 
        if (err != 0) {
-               fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
-               abort();
+               fatalf("pthread_create failed: %s", strerror(err));
        }
 }
 
index 95c8e16a25453326cd197ec3329b53cfa1b49ef5..ef16d2341ace4c4481812a67c9ff3e2625ac7dc4 100644 (file)
@@ -9,6 +9,7 @@
 
 static void *threadentry(void*);
 
+void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
 void (*setg_gcc)(void*);
 
 void
@@ -36,8 +37,7 @@ _cgo_sys_thread_start(ThreadStart *ts)
        pthread_sigmask(SIG_SETMASK, &oset, nil);
 
        if (err != 0) {
-               fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
-               abort();
+               fatalf("pthread_create failed: %s", strerror(err));
        }
 }
 
@@ -62,8 +62,6 @@ threadentry(void *v)
        return nil;
 }
 
-void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
-
 void
 x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
 {
index 251fb4c68ebc0bafe06146c623a48aa9ac0083ea..799af05ead4316ce1507b68542f55465c7597c4d 100644 (file)
@@ -58,3 +58,8 @@ void crosscall_amd64(void (*fn)(void));
  * Call fn in the 8c world.
  */
 void crosscall_386(void (*fn)(void));
+
+/*
+ * Prints error then calls abort. For linux and android.
+ */
+void fatalf(const char* format, ...);