Implement some basic logging for windows

This commit is contained in:
jp9000 2014-04-14 04:02:11 -07:00
parent 1388b749c9
commit fa490fa8c4
5 changed files with 53 additions and 24 deletions

View File

@ -26,7 +26,7 @@ static inline bool check_path(const char* data, const char *path,
dstr_copy(output, path);
dstr_cat(output, data);
blog(LOG_INFO, "Attempting path: %s\n", output->array);
blog(LOG_DEBUG, "Attempting path: %s\n", output->array);
return os_file_exists(output->array);
}

View File

@ -27,10 +27,12 @@ static int log_output_level = LOG_DEBUG;
static int log_output_level = LOG_INFO;
#endif
static int crashing = 0;
static int crashing = 0;
static void *log_param = NULL;
static void *crash_param = NULL;
static void def_log_handler(int log_level, const char *format,
va_list args)
va_list args, void *param)
{
char out[4096];
vsnprintf(out, sizeof(out), format, args);
@ -57,6 +59,8 @@ static void def_log_handler(int log_level, const char *format,
fflush(stderr);
}
}
UNUSED_PARAMETER(param);
}
#ifdef _MSC_VER
@ -65,24 +69,35 @@ static void def_log_handler(int log_level, const char *format,
#define NORETURN __attribute__((noreturn))
#endif
NORETURN static void def_crash_handler(const char *format, va_list args)
NORETURN static void def_crash_handler(const char *format, va_list args,
void *param)
{
vfprintf(stderr, format, args);
exit(0);
UNUSED_PARAMETER(param);
}
static void (*log_handler)(int log_level, const char *, va_list) =
static void (*log_handler)(int log_level, const char *, va_list, void *) =
def_log_handler;
static void (*crash_handler)(const char *, va_list) = def_crash_handler;
static void (*crash_handler)(const char *, va_list, void *) = def_crash_handler;
void base_set_log_handler(
void (*handler)(int log_level, const char *, va_list))
void (*handler)(int log_level, const char *, va_list, void *),
void *param)
{
if (!handler)
handler = def_log_handler;
log_param = param;
log_handler = handler;
}
void base_set_crash_handler(void (*handler)(const char *, va_list))
void base_set_crash_handler(
void (*handler)(const char *, va_list, void *),
void *param)
{
crash_param = param;
crash_handler = handler;
}
@ -97,13 +112,13 @@ void bcrash(const char *format, ...)
crashing = 1;
va_start(args, format);
crash_handler(format, args);
crash_handler(format, args, crash_param);
va_end(args);
}
void blogva(int log_level, const char *format, va_list args)
{
log_handler(log_level, format, args);
log_handler(log_level, format, args, log_param);
}
void blog(int log_level, const char *format, ...)
@ -111,6 +126,6 @@ void blog(int log_level, const char *format, ...)
va_list args;
va_start(args, format);
log_handler(log_level, format, args);
blogva(log_level, format, args);
va_end(args);
}

View File

@ -59,8 +59,11 @@ enum {
};
EXPORT void base_set_log_handler(
void (*handler)(int log_level, const char *, va_list));
EXPORT void base_set_crash_handler(void (*handler)(const char *, va_list));
void (*handler)(int log_level, const char *, va_list, void *),
void *param);
EXPORT void base_set_crash_handler(
void (*handler)(const char *, va_list, void *),
void *param);
EXPORT void blogva(int log_level, const char *format, va_list args);

View File

@ -29,29 +29,29 @@
#include "platform.hpp"
#ifdef _WIN32
#include <fstream>
#include <windows.h>
#endif
using namespace std;
static void do_log(int log_level, const char *msg, va_list args)
{
#ifdef _WIN32
static void do_log(int log_level, const char *msg, va_list args, void *param)
{
fstream &logFile = *static_cast<fstream*>(param);
char bla[4096];
vsnprintf(bla, 4095, msg, args);
OutputDebugStringA(bla);
OutputDebugStringA("\n");
if (log_level <= LOG_INFO)
logFile << bla << endl;
if (log_level <= LOG_ERROR && IsDebuggerPresent())
__debugbreak();
#else
vprintf(msg, args);
printf("\n");
UNUSED_PARAMETER(log_level);
#endif
}
#endif
bool OBSApp::InitGlobalConfigDefaults()
{
@ -220,7 +220,15 @@ int main(int argc, char *argv[])
int ret = -1;
QCoreApplication::addLibraryPath(".");
#ifdef _WIN32
base_set_log_handler(do_log);
char *logPath = os_get_config_path("obs-studio/log.txt");
fstream logFile;
logFile.open(logPath, ios_base::in | ios_base::out | ios_base::trunc,
_SH_DENYNO);
bfree(logPath);
if (logFile.is_open())
base_set_log_handler(do_log, &logFile);
#endif
try {
@ -234,5 +242,6 @@ int main(int argc, char *argv[])
}
blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs());
base_set_log_handler(nullptr, nullptr);
return ret;
}

View File

@ -51,7 +51,7 @@ static LRESULT CALLBACK sceneProc(HWND hwnd, UINT message, WPARAM wParam,
return 0;
}
static void do_log(int log_level, const char *msg, va_list args)
static void do_log(int log_level, const char *msg, va_list args, void *param)
{
char bla[4096];
vsnprintf(bla, 4095, msg, args);
@ -61,6 +61,8 @@ static void do_log(int log_level, const char *msg, va_list args)
if (log_level <= LOG_WARNING)
__debugbreak();
UNUSED_PARAMETER(param);
}
static void CreateOBS(HWND hwnd)
@ -122,7 +124,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine,
int numCmd)
{
HWND hwnd = NULL;
base_set_log_handler(do_log);
base_set_log_handler(do_log, nullptr);
try {
hwnd = CreateTestWindow(instance);