Support for architecture-specific assemblies in a folder named runtimes (#276)
[platform/core/dotnet/launcher.git] / NativeLauncher / util / log_manager.cc
index 2268389..72f48cd 100644 (file)
 #include "log_manager.h"
 
 static int __pfd[2];
-static pthread_t loggingThread;
+static pthread_t __loggingThread;
+static bool __isInit = false;
 
 static void *stdlog(void*)
 {
-    ssize_t readSize;
-    char buf[1024];
+       ssize_t readSize;
+       char buf[1024];
 
-    while ((readSize = read(__pfd[0], buf, sizeof buf - 1)) > 0) {
-        if (buf[readSize - 1] == '\n') {
-            --readSize;
-        }
+       while ((readSize = read(__pfd[0], buf, sizeof buf - 1)) > 0) {
+               if (buf[readSize - 1] == '\n') {
+                       --readSize;
+               }
 
-        buf[readSize] = 0;
+               buf[readSize] = 0;
 
-        _LOGX("%s", buf);
-    }
+               _LOGX("%s", buf);
+       }
 
        close(__pfd[0]);
        close(__pfd[1]);
 
-    return 0;
+       return 0;
 }
 
 int initializeLogManager()
 {
-    if (setvbuf(stdout, NULL, _IOLBF, 0) < 0) {
+       __isInit = true;
+
+       if (setvbuf(stdout, NULL, _IOLBF, 0) < 0) {
                _ERR("fail to make stdout line-buffered");
                return -1;
-    }
+       }
 
-    if (setvbuf(stderr, NULL, _IONBF, 0) < 0) {
+       if (setvbuf(stderr, NULL, _IONBF, 0) < 0) {
                _ERR("make stderr unbuffered");
                return -1;
        }
 
-    /* create the pipe and redirect stdout and stderr */
-    if (pipe(__pfd) < 0) {
+       /* create the pipe and redirect stdout and stderr */
+       if (pipe(__pfd) < 0) {
                _ERR("fail to create pipe for logging");
                return -1;
-    }
+       }
+
+       /* redirect stdout and stderr */
+       if (redirectFD() < 0) {
+               return -1;
+       }
+
+       /* spawn the logging thread */
+       if (pthread_create(&__loggingThread, 0, stdlog, 0) != 0) {
+               _ERR("fail to create pthread");
+               return -1;
+       }
+
+       if (pthread_detach(__loggingThread) != 0) {
+               _ERR("fail to detach pthread");
+               return -1;
+       }
 
        return 0;
 }
 
+// launchpad override stdout and stderr to journalctl before launch application.
+// So, even though fd redirection is done in initializeLogManager, we do it again before launch.
+// if LogManager is not initialized, it will return 0;
 int redirectFD()
 {
+       if (!__isInit)
+               return 0;
+
        if (__pfd[1] < 0) {
                _ERR("fail to create pipe for logging");
                return -1;
        }
-    // stdout
-    if (dup2(__pfd[1], 1) == -1) {
+
+       // stdout
+       if (dup2(__pfd[1], 1) == -1) {
                _ERR("fail to duplicate fd to stdout");
                return -1;
-    }
-
-    // stderr
-    if (dup2(__pfd[1], 2) == -1) {
-               _ERR("fail to duplicate fd to stderr");
-               return-1;
        }
 
-       return 0;
-}
-
-int runLoggingThread()
-{
-    /* spawn the logging thread */
-    if (pthread_create(&loggingThread, 0, stdlog, 0) != 0) {
-               _ERR("fail to create pthread");
-        return -1;
-    }
-
-    if (pthread_detach(loggingThread) != 0) {
-               _ERR("fail to detach pthread");
+       // stderr
+       if (dup2(__pfd[1], 2) == -1) {
+               _ERR("fail to duplicate fd to stderr");
                return -1;
        }
 
-    return 0;
+       return 0;
 }
-