aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/basetypes/MCLog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/basetypes/MCLog.cpp')
-rw-r--r--src/core/basetypes/MCLog.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/core/basetypes/MCLog.cpp b/src/core/basetypes/MCLog.cpp
new file mode 100644
index 00000000..ceb1b93c
--- /dev/null
+++ b/src/core/basetypes/MCLog.cpp
@@ -0,0 +1,107 @@
+#include "MCWin32.h" // should be included first.
+
+#include "MCDefines.h"
+#include "MCLog.h"
+
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+#include <time.h>
+#include <unistd.h>
+#include <sys/time.h>
+#endif
+#include <pthread.h>
+#if __APPLE__
+#include <execinfo.h>
+#endif
+
+static pid_t sPid = -1;
+int MCLogEnabled = 0;
+
+INITIALIZE(Log)
+{
+ sPid = getpid();
+}
+
+static void logInternalv(FILE * file,
+ const char * user, const char * filename, unsigned int line,
+ int dumpStack, const char * format, va_list argp);
+
+void MCLogInternal(const char * user,
+ const char * filename,
+ unsigned int line,
+ int dumpStack,
+ const char * format, ...)
+{
+ va_list argp;
+
+ va_start(argp, format);
+ logInternalv(stderr, user, filename, line, dumpStack, format, argp);
+ va_end(argp);
+}
+
+static void logInternalv(FILE * file,
+ const char * user, const char * filename, unsigned int line,
+ int dumpStack, const char * format, va_list argp)
+{
+ if (!MCLogEnabled)
+ return;
+
+ while (1) {
+ const char * p = filename;
+
+ p = strchr(filename, '/');
+ if (p == NULL) {
+ break;
+ }
+ filename = p + 1;
+ }
+
+ struct timeval tv;
+ struct tm tm_value;
+ pthread_t thread_id = pthread_self();
+
+ gettimeofday(&tv, NULL);
+ time_t timevalue_sec = tv.tv_sec;
+ localtime_r(&timevalue_sec, &tm_value);
+ fprintf(file, "%04u-%02u-%02u %02u:%02u:%02u.%03u ", tm_value.tm_year + 1900, tm_value.tm_mon + 1, tm_value.tm_mday, tm_value.tm_hour, tm_value.tm_min, tm_value.tm_sec, (int) (tv.tv_usec / 1000));
+
+#ifdef __MACH__
+ if (pthread_main_np()) {
+#else
+ if (0) {
+#endif
+ fprintf(file, "[%i:main] %s:%i: ", sPid, filename, line);
+ }
+ else {
+ unsigned long threadValue;
+#ifdef _MACH_PORT_T
+ threadValue = pthread_mach_thread_np(thread_id);
+#elif _MSC_VER
+ threadValue = (unsigned long) thread_id.p;
+#else
+ threadValue = (unsigned long) thread_id;
+#endif
+ fprintf(file, "[%i:%lx] %s:%i: ", sPid, threadValue, filename, line);
+ }
+ vfprintf(file, format, argp);
+ fprintf(file, "\n");
+
+ if (dumpStack) {
+#if __APPLE__
+ void * frame[128];
+ int frameCount;
+ int i;
+
+ fprintf(file, " ");
+ frameCount = backtrace(frame, 128);
+ for(i = 0 ; i < frameCount ; i ++) {
+ fprintf(file, " %p", frame[i]);
+ }
+ fprintf(file, "\n");
+#endif
+ // TODO: other platforms implemented needed.
+ }
+
+}