Make klog_fd thread-safe and make klog_init a no-op.

I'll come back and remove klog_init when I've removed other calls to it.

Change-Id: Iad7fd26d853b4ddc54e9abd44516b6f138cbbfcb
Test: booted N9, looked at "adb shell dmesg" output.
diff --git a/libcutils/Android.mk b/libcutils/Android.mk
index e29c9ad..c830182 100644
--- a/libcutils/Android.mk
+++ b/libcutils/Android.mk
@@ -95,7 +95,7 @@
         android_reboot.c \
         ashmem-dev.c \
         debugger.c \
-        klog.c \
+        klog.cpp \
         partition_utils.c \
         properties.c \
         qtaguid.c \
diff --git a/libcutils/klog.c b/libcutils/klog.cpp
similarity index 78%
rename from libcutils/klog.c
rename to libcutils/klog.cpp
index 7402903..11ebf88 100644
--- a/libcutils/klog.c
+++ b/libcutils/klog.cpp
@@ -26,7 +26,6 @@
 
 #include <cutils/klog.h>
 
-static int klog_fd = -1;
 static int klog_level = KLOG_DEFAULT_LEVEL;
 
 int klog_get_level(void) {
@@ -38,31 +37,33 @@
 }
 
 void klog_init(void) {
-    if (klog_fd >= 0) return; /* Already initialized */
+}
 
-    klog_fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC);
-    if (klog_fd >= 0) {
-        return;
+static int __open_klog(void) {
+    int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC);
+    if (fd == -1) {
+        static const char* name = "/dev/__kmsg__";
+        if (mknod(name, S_IFCHR | 0600, (1 << 8) | 11) == 0) {
+            fd = open(name, O_WRONLY | O_CLOEXEC);
+            unlink(name);
+        }
     }
-
-    static const char* name = "/dev/__kmsg__";
-    if (mknod(name, S_IFCHR | 0600, (1 << 8) | 11) == 0) {
-        klog_fd = open(name, O_WRONLY | O_CLOEXEC);
-        unlink(name);
-    }
+    return fd;
 }
 
 #define LOG_BUF_MAX 512
 
 void klog_writev(int level, const struct iovec* iov, int iov_count) {
     if (level > klog_level) return;
-    if (klog_fd < 0) klog_init();
-    if (klog_fd < 0) return;
+
+    static int klog_fd = __open_klog();
+    if (klog_fd == -1) return;
     TEMP_FAILURE_RETRY(writev(klog_fd, iov, iov_count));
 }
 
 void klog_write(int level, const char* fmt, ...) {
     if (level > klog_level) return;
+
     char buf[LOG_BUF_MAX];
     va_list ap;
     va_start(ap, fmt);