int initializeLogManager();
int redirectFD();
-int runLoggingThread();
-int hasException();
#endif /* __LOG_MANAGER_H__ */
exit(0);
}
- if (hasException()) {
- ret = write(STDERR_FILENO, "******************************************************\n", 55);
- ret = write(STDERR_FILENO, "Unhandled exception is occured. check application code\n", 55);
- ret = write(STDERR_FILENO, "******************************************************\n", 55);
- }
-
checkOnSigabrt = true;
if (sigaction(SIGABRT, &sig_abrt_old, NULL) == 0) {
if (raise(signum) < 0) {
if (initializePluginManager(mode) < 0) {
_ERR("Failed to initialize PluginManager");
}
-
- if (pluginHasLogControl()) {
- __enableLogManager = false;
- } else {
- __enableLogManager = true;
- }
-}
-
-void CoreRuntime::setLogManager(bool enable)
-{
- __enableLogManager = enable;
}
CoreRuntime::~CoreRuntime()
dispose();
}
-int CoreRuntime::initialize(bool standalone)
+int CoreRuntime::initialize(bool standalone, bool useDlog)
{
// checkInjection checks dotnet-launcher run mode
// At the moment, this mechanism is used only when the Memory Profiler is started.
return -1;
}
- if (__enableLogManager) {
+ if (useDlog && !pluginHasLogControl()) {
if (initializeLogManager() < 0) {
_ERR("Failed to initnialize LogManager");
return -1;
}
-
- if (redirectFD() < 0) {
- _ERR("Failed to redirect FD");
- return -1;
- }
-
- if (runLoggingThread() < 0) {
- _ERR("Failed to create and run logging thread to redicrect log");
- return -1;
- }
}
std::string libCoreclr(concatPath(getRuntimeDir(), "libcoreclr.so"));
return -1;
}
- if (__enableLogManager) {
- // launchpad override stdout and stderr to journalctl before launch application.
- // we have to re-override that to input pipe for logging thread.
- if (redirectFD() < 0) {
- _ERR("Failed to redirect FD");
- return -1;
- }
+ // launchpad override stdout and stderr to journalctl before launch application.
+ // we have to re-override that to input pipe for logging thread.
+ // if LogManager is not initialized, below redirectFD will return 0;
+ if (redirectFD() < 0) {
+ _ERR("Failed to redirect FD");
+ return -1;
+ }
+ // VD has their own signal handler.
+ if (!pluginHasLogControl()) {
registerSigHandler();
}
public:
CoreRuntime(const char* mode);
~CoreRuntime();
- int initialize(bool standalone);
+ int initialize(bool standalone, bool useDlog);
void dispose();
int launch(const char* appId, const char* root, const char* path, int argc, char* argv[]);
- void setLogManager(bool enable);
private:
snprintf(appId, 16, "%s", "dotnet-launcher");
appRoot = baseName(argv[1]);
- // diable log redirection to dlog.
- runtime->setLogManager(false);
-
- if (runtime->initialize(true) != 0) {
+ if (runtime->initialize(true, false) != 0) {
_ERR("Failed to initialize");
return 1;
}
}
_INFO("AUL_APPID : %s", appId);
- if (runtime->initialize(true) != 0) {
+ if (runtime->initialize(true, true) != 0) {
_ERR("Failed to initialize");
return 1;
}
}
Launchpad.onCreate = [&runtime]() {
- if (runtime->initialize(false) != 0) {
+ if (runtime->initialize(false, true) != 0) {
_ERR("Failed to initialized");
} else {
_INFO("Success to initialized");
#include "log_manager.h"
static int __pfd[2];
-static pthread_t loggingThread;
-static bool __hasException = false;
-
+static pthread_t __loggingThread;
+static bool __isInit = false;
static void *stdlog(void*)
{
- ssize_t readSize;
- char buf[1024];
-
- while ((readSize = read(__pfd[0], buf, sizeof buf - 1)) > 0) {
- if (buf[readSize - 1] == '\n') {
- --readSize;
- }
-
- buf[readSize] = 0;
+ ssize_t readSize;
+ char buf[1024];
- if (strstr(buf, "Unhandled Exception:") != NULL) {
- __hasException = true;
+ while ((readSize = read(__pfd[0], buf, sizeof buf - 1)) > 0) {
+ if (buf[readSize - 1] == '\n') {
+ --readSize;
}
- _LOGX("%s", buf);
- }
+ buf[readSize] = 0;
+
+ _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;
}
-int hasException()
-{
- return __hasException;
-}