Speedup for WLog_* macros, cache the log pointer
authorArmin Novak <armin.novak@gmail.com>
Sun, 15 Sep 2019 07:59:31 +0000 (09:59 +0200)
committerArmin Novak <armin.novak@gmail.com>
Sun, 15 Sep 2019 08:04:36 +0000 (10:04 +0200)
WLog_Get(tag) is quite expensive if called repeatedly.
With this patch the pointer is cached on first call.

winpr/include/winpr/wlog.h

index 1acb9e7..1f1c12d 100644 (file)
@@ -110,6 +110,8 @@ WINPR_API BOOL WLog_PrintMessageVA(wLog* log, DWORD type, DWORD level,
                                    DWORD line,
                                    const char* file, const char* function, va_list args);
 
+WINPR_API wLog* WLog_GetRoot(void);
+WINPR_API wLog* WLog_Get(LPCSTR name);
 WINPR_API DWORD WLog_GetLogLevel(wLog* log);
 WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
 
@@ -121,6 +123,14 @@ WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
                } \
        } while (0)
 
+#define WLog_Print_tag(_tag, _log_level, ...) \
+    do { \
+        static  wLog* _log_cached_ptr = NULL; \
+        if (!_log_cached_ptr) \
+            _log_cached_ptr = WLog_Get(_tag); \
+        WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \
+    } while (0)
+
 #define WLog_PrintVA(_log, _log_level, _args) \
        do { \
                if (WLog_IsLevelActive(_log, _log_level)) { \
@@ -153,13 +163,13 @@ WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
                } \
        } while (0)
 
-#define WLog_LVL(tag, lvl, ...) WLog_Print(WLog_Get(tag), lvl, __VA_ARGS__)
-#define WLog_VRB(tag, ...) WLog_Print(WLog_Get(tag), WLOG_TRACE, __VA_ARGS__)
-#define WLog_DBG(tag, ...) WLog_Print(WLog_Get(tag), WLOG_DEBUG, __VA_ARGS__)
-#define WLog_INFO(tag, ...) WLog_Print(WLog_Get(tag), WLOG_INFO, __VA_ARGS__)
-#define WLog_WARN(tag, ...) WLog_Print(WLog_Get(tag), WLOG_WARN, __VA_ARGS__)
-#define WLog_ERR(tag, ...) WLog_Print(WLog_Get(tag), WLOG_ERROR, __VA_ARGS__)
-#define WLog_FATAL(tag, ...) WLog_Print(WLog_Get(tag), WLOG_FATAL, __VA_ARGS__)
+#define WLog_LVL(tag, lvl, ...) WLog_Print_tag(tag, lvl, __VA_ARGS__)
+#define WLog_VRB(tag, ...) WLog_Print_tag(tag, WLOG_TRACE, __VA_ARGS__)
+#define WLog_DBG(tag, ...) WLog_Print_tag(tag, WLOG_DEBUG, __VA_ARGS__)
+#define WLog_INFO(tag, ...) WLog_Print_tag(tag, WLOG_INFO, __VA_ARGS__)
+#define WLog_WARN(tag, ...) WLog_Print_tag(tag, WLOG_WARN, __VA_ARGS__)
+#define WLog_ERR(tag, ...) WLog_Print_tag(tag, WLOG_ERROR, __VA_ARGS__)
+#define WLog_FATAL(tag, ...) WLog_Print_tag(tag, WLOG_FATAL, __VA_ARGS__)
 
 WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
 WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
@@ -176,9 +186,6 @@ WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log);
 WINPR_API BOOL WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout,
         const char* format);
 
-WINPR_API wLog* WLog_GetRoot(void);
-WINPR_API wLog* WLog_Get(LPCSTR name);
-
 /** Deprecated */
 WINPR_API WINPR_DEPRECATED(BOOL WLog_Init(void));
 /** Deprecated */