static void VMToolsLog(const gchar *domain, GLogLevelFlags level, const gchar *message, gpointer _data) { LogHandler *data = _data; if (SHOULD_LOG(level, data)) { gchar *msg; data = data->inherited ? gDefaultData : data; msg = VMToolsLogFormat(message, domain, level, data); if (data->logger != NULL) { data->logger->logfn(domain, level, msg, data->logger); } else if (gErrorData->logger != NULL) { gErrorData->logger->logfn(domain, level, msg, gErrorData->logger); } g_free(msg); } if (IS_FATAL(level)) { VMToolsLogPanic(); } }
static void VMToolsLog(const gchar *domain, GLogLevelFlags level, const gchar *message, gpointer _data) { LogHandler *data = _data; if (SHOULD_LOG(level, data)) { LogEntry *entry; data = data->inherited ? gDefaultData : data; entry = g_malloc0(sizeof(LogEntry)); if (entry) { entry->domain = domain ? g_strdup(domain) : NULL; if (domain && !entry->domain) { VMToolsLogPanic(); } entry->handler = data; entry->level = level; } if (gLogIOSuspended && data->needsFileIO) { if (gMaxCacheEntries == 0) { /* No way to log at this point, drop it */ VMToolsFreeLogEntry(entry); gDroppedLogCount++; goto exit; } entry->msg = VMToolsLogFormat(message, domain, level, data, TRUE); /* * Cache the log message */ if (!gCachedLogs) { /* * If gMaxCacheEntries > 1K, start with 1/4th size * to avoid frequent allocations */ gCachedLogs = g_ptr_array_sized_new(gMaxCacheEntries < 1024 ? gMaxCacheEntries : gMaxCacheEntries/4); if (!gCachedLogs) { VMToolsLogPanic(); } /* * Some builds use glib version 2.16.4 which does not * support g_ptr_array_set_free_func function */ } /* * We don't expect logging to be suspended for a long time, * so we can avoid putting a cap on cache size. However, we * still have a default cap of 4K messages, just to be safe. */ if (gCachedLogs->len < gMaxCacheEntries) { g_ptr_array_add(gCachedLogs, entry); } else { /* * Cache is full, drop the oldest log message. This is not * very efficient but we don't expect this to be a common * case anyway. */ LogEntry *oldest = g_ptr_array_remove_index(gCachedLogs, 0); VMToolsFreeLogEntry(oldest); gDroppedLogCount++; g_ptr_array_add(gCachedLogs, entry); } } else { entry->msg = VMToolsLogFormat(message, domain, level, data, FALSE); VMToolsLogMsg(entry, NULL); } } exit: if (IS_FATAL(level)) { VMToolsLogPanic(); } }