xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Utility/GmmLog/GmmLog.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker 
23*35ffd701SAndroid Build Coastguard Worker #include "GmmLog.h"
24*35ffd701SAndroid Build Coastguard Worker 
25*35ffd701SAndroid Build Coastguard Worker #if GMM_LOG_AVAILABLE
26*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
27*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLogger.h"
28*35ffd701SAndroid Build Coastguard Worker 
29*35ffd701SAndroid Build Coastguard Worker #if _WIN32
30*35ffd701SAndroid Build Coastguard Worker #include <process.h>
31*35ffd701SAndroid Build Coastguard Worker #include <memory>
32*35ffd701SAndroid Build Coastguard Worker #else
33*35ffd701SAndroid Build Coastguard Worker #include <stdio.h>
34*35ffd701SAndroid Build Coastguard Worker #include <sys/stat.h>
35*35ffd701SAndroid Build Coastguard Worker #include <unistd.h>
36*35ffd701SAndroid Build Coastguard Worker #include <fstream>
37*35ffd701SAndroid Build Coastguard Worker #include <linux/limits.h>
38*35ffd701SAndroid Build Coastguard Worker #endif
39*35ffd701SAndroid Build Coastguard Worker 
40*35ffd701SAndroid Build Coastguard Worker /// Logger instance shared by all of GmmLib within a process
41*35ffd701SAndroid Build Coastguard Worker #if(_DEBUG || _RELEASE_INTERNAL)
42*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger &GmmLoggerPerProc = GmmLib::Logger::CreateGmmLogSingleton();
43*35ffd701SAndroid Build Coastguard Worker #endif
44*35ffd701SAndroid Build Coastguard Worker 
45*35ffd701SAndroid Build Coastguard Worker #if _WIN32
46*35ffd701SAndroid Build Coastguard Worker namespace spdlog
47*35ffd701SAndroid Build Coastguard Worker {
48*35ffd701SAndroid Build Coastguard Worker     namespace sinks
49*35ffd701SAndroid Build Coastguard Worker     {
50*35ffd701SAndroid Build Coastguard Worker         /////////////////////////////////////////////////////////////////////////////////////
51*35ffd701SAndroid Build Coastguard Worker         /// class defines a sink which prints the messages to the debugger
52*35ffd701SAndroid Build Coastguard Worker         /////////////////////////////////////////////////////////////////////////////////////
53*35ffd701SAndroid Build Coastguard Worker         class Debugger : public sink
54*35ffd701SAndroid Build Coastguard Worker         {
log(const details::log_msg & msg)55*35ffd701SAndroid Build Coastguard Worker             void log(const details::log_msg &msg) override
56*35ffd701SAndroid Build Coastguard Worker             {
57*35ffd701SAndroid Build Coastguard Worker                 OutputDebugString(GMM_PREFIX_STR);
58*35ffd701SAndroid Build Coastguard Worker                 OutputDebugString(msg.formatted.str().c_str());
59*35ffd701SAndroid Build Coastguard Worker             }
60*35ffd701SAndroid Build Coastguard Worker 
flush()61*35ffd701SAndroid Build Coastguard Worker             void flush()
62*35ffd701SAndroid Build Coastguard Worker             {
63*35ffd701SAndroid Build Coastguard Worker             }
64*35ffd701SAndroid Build Coastguard Worker         };
65*35ffd701SAndroid Build Coastguard Worker     }
66*35ffd701SAndroid Build Coastguard Worker }
67*35ffd701SAndroid Build Coastguard Worker #endif
68*35ffd701SAndroid Build Coastguard Worker 
69*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
70*35ffd701SAndroid Build Coastguard Worker /// Initializes Gmm Logger
71*35ffd701SAndroid Build Coastguard Worker ///
72*35ffd701SAndroid Build Coastguard Worker /// @return     true if initialized successfully. false otherwise
73*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmLogInit()74*35ffd701SAndroid Build Coastguard Worker bool GmmLib::Logger::GmmLogInit()
75*35ffd701SAndroid Build Coastguard Worker {
76*35ffd701SAndroid Build Coastguard Worker     std::string LogFilePath;
77*35ffd701SAndroid Build Coastguard Worker     std::string ProcPath;
78*35ffd701SAndroid Build Coastguard Worker     std::string ProcName;
79*35ffd701SAndroid Build Coastguard Worker     int         Pid = 0;
80*35ffd701SAndroid Build Coastguard Worker 
81*35ffd701SAndroid Build Coastguard Worker // Get logging method
82*35ffd701SAndroid Build Coastguard Worker #if _WIN32
83*35ffd701SAndroid Build Coastguard Worker     uint32_t regkeyVal = 0;
84*35ffd701SAndroid Build Coastguard Worker     if(Utility::GmmUMDReadRegistryFullPath(GMM_LOG_REG_KEY_SUB_PATH, GMM_LOG_TO_FILE, &regkeyVal))
85*35ffd701SAndroid Build Coastguard Worker     {
86*35ffd701SAndroid Build Coastguard Worker         LogMethod = regkeyVal ? ToFile : ToOSLog;
87*35ffd701SAndroid Build Coastguard Worker     }
88*35ffd701SAndroid Build Coastguard Worker 
89*35ffd701SAndroid Build Coastguard Worker     if(Utility::GmmUMDReadRegistryFullPath(GMM_LOG_REG_KEY_SUB_PATH, GMM_LOG_LEVEL_REGKEY, &regkeyVal))
90*35ffd701SAndroid Build Coastguard Worker     {
91*35ffd701SAndroid Build Coastguard Worker         switch(static_cast<GmmLogLevel>(regkeyVal))
92*35ffd701SAndroid Build Coastguard Worker         {
93*35ffd701SAndroid Build Coastguard Worker             case Trace:
94*35ffd701SAndroid Build Coastguard Worker                 LogLevel = spdlog::level::trace;
95*35ffd701SAndroid Build Coastguard Worker                 break;
96*35ffd701SAndroid Build Coastguard Worker             case Info:
97*35ffd701SAndroid Build Coastguard Worker                 LogLevel = spdlog::level::info;
98*35ffd701SAndroid Build Coastguard Worker                 break;
99*35ffd701SAndroid Build Coastguard Worker             case Error:
100*35ffd701SAndroid Build Coastguard Worker                 LogLevel = spdlog::level::err;
101*35ffd701SAndroid Build Coastguard Worker                 break;
102*35ffd701SAndroid Build Coastguard Worker 	    case Critical:
103*35ffd701SAndroid Build Coastguard Worker 		LogLevel = spdlog::level::critical;
104*35ffd701SAndroid Build Coastguard Worker                 break;
105*35ffd701SAndroid Build Coastguard Worker             case Off:
106*35ffd701SAndroid Build Coastguard Worker             default:
107*35ffd701SAndroid Build Coastguard Worker                 LogLevel = spdlog::level::off;
108*35ffd701SAndroid Build Coastguard Worker                 break;
109*35ffd701SAndroid Build Coastguard Worker 	}
110*35ffd701SAndroid Build Coastguard Worker     }
111*35ffd701SAndroid Build Coastguard Worker 
112*35ffd701SAndroid Build Coastguard Worker #endif
113*35ffd701SAndroid Build Coastguard Worker     if(LogLevel == spdlog::level::off)
114*35ffd701SAndroid Build Coastguard Worker     {
115*35ffd701SAndroid Build Coastguard Worker         return false;
116*35ffd701SAndroid Build Coastguard Worker     }
117*35ffd701SAndroid Build Coastguard Worker 
118*35ffd701SAndroid Build Coastguard Worker     try
119*35ffd701SAndroid Build Coastguard Worker     {
120*35ffd701SAndroid Build Coastguard Worker         if(LogMethod == ToFile)
121*35ffd701SAndroid Build Coastguard Worker         {
122*35ffd701SAndroid Build Coastguard Worker // Get process name
123*35ffd701SAndroid Build Coastguard Worker #if _WIN32
124*35ffd701SAndroid Build Coastguard Worker             TCHAR ProcPathTChar[MAX_PATH];
125*35ffd701SAndroid Build Coastguard Worker             GetModuleFileName(NULL, ProcPathTChar, MAX_PATH);
126*35ffd701SAndroid Build Coastguard Worker             ProcPath = std::string(ProcPathTChar);
127*35ffd701SAndroid Build Coastguard Worker 
128*35ffd701SAndroid Build Coastguard Worker             size_t PosOfLastSlash = ProcPath.find_last_of("\\") + 1;
129*35ffd701SAndroid Build Coastguard Worker             size_t PosOfLastDot   = ProcPath.find_last_of(".");
130*35ffd701SAndroid Build Coastguard Worker 
131*35ffd701SAndroid Build Coastguard Worker             if(PosOfLastDot <= PosOfLastSlash || PosOfLastDot >= ProcPath.length() || PosOfLastSlash >= ProcPath.length())
132*35ffd701SAndroid Build Coastguard Worker             {
133*35ffd701SAndroid Build Coastguard Worker                 ProcName = GMM_UNKNOWN_PROCESS;
134*35ffd701SAndroid Build Coastguard Worker             }
135*35ffd701SAndroid Build Coastguard Worker             else
136*35ffd701SAndroid Build Coastguard Worker             {
137*35ffd701SAndroid Build Coastguard Worker                 ProcName = ProcPath.substr(PosOfLastSlash, PosOfLastDot - PosOfLastSlash);
138*35ffd701SAndroid Build Coastguard Worker             }
139*35ffd701SAndroid Build Coastguard Worker #else
140*35ffd701SAndroid Build Coastguard Worker             ProcPath = "Unknown_Proc_Path";
141*35ffd701SAndroid Build Coastguard Worker             ProcName = GMM_UNKNOWN_PROCESS;
142*35ffd701SAndroid Build Coastguard Worker 
143*35ffd701SAndroid Build Coastguard Worker             std::ifstream file;
144*35ffd701SAndroid Build Coastguard Worker             file.open("/proc/self/cmdline");
145*35ffd701SAndroid Build Coastguard Worker             if(file.is_open())
146*35ffd701SAndroid Build Coastguard Worker             {
147*35ffd701SAndroid Build Coastguard Worker                 // Get process name
148*35ffd701SAndroid Build Coastguard Worker                 getline(file, ProcPath);
149*35ffd701SAndroid Build Coastguard Worker 
150*35ffd701SAndroid Build Coastguard Worker                 size_t PosOfLastSlash = ProcPath.find_last_of("/") + 1;
151*35ffd701SAndroid Build Coastguard Worker                 if(PosOfLastSlash >= ProcPath.length())
152*35ffd701SAndroid Build Coastguard Worker                 {
153*35ffd701SAndroid Build Coastguard Worker                     ProcName = GMM_UNKNOWN_PROCESS;
154*35ffd701SAndroid Build Coastguard Worker                 }
155*35ffd701SAndroid Build Coastguard Worker                 else
156*35ffd701SAndroid Build Coastguard Worker                 {
157*35ffd701SAndroid Build Coastguard Worker                     // "length-1" to remove null character
158*35ffd701SAndroid Build Coastguard Worker                     ProcName = ProcPath.substr(PosOfLastSlash, ProcPath.length() - 1);
159*35ffd701SAndroid Build Coastguard Worker                 }
160*35ffd701SAndroid Build Coastguard Worker 
161*35ffd701SAndroid Build Coastguard Worker                 file.close();
162*35ffd701SAndroid Build Coastguard Worker             }
163*35ffd701SAndroid Build Coastguard Worker 
164*35ffd701SAndroid Build Coastguard Worker #endif
165*35ffd701SAndroid Build Coastguard Worker 
166*35ffd701SAndroid Build Coastguard Worker // Get process ID
167*35ffd701SAndroid Build Coastguard Worker #if _WIN32
168*35ffd701SAndroid Build Coastguard Worker             Pid = _getpid();
169*35ffd701SAndroid Build Coastguard Worker #else
170*35ffd701SAndroid Build Coastguard Worker             Pid = getpid();
171*35ffd701SAndroid Build Coastguard Worker #endif
172*35ffd701SAndroid Build Coastguard Worker             std::string PidStr = std::to_string(Pid);
173*35ffd701SAndroid Build Coastguard Worker 
174*35ffd701SAndroid Build Coastguard Worker             // TODO: Multiple GmmLib instance can be running in the same process. In that case, the file name will be
175*35ffd701SAndroid Build Coastguard Worker             // the same for two instances. Figure out a way to differentiate between the two instances.
176*35ffd701SAndroid Build Coastguard Worker #if _WIN32
177*35ffd701SAndroid Build Coastguard Worker 	    LogFilePath = std::string("c:\\") + std::string(GMM_LOG_FILENAME) + "_" + ProcName + "_" + PidStr;
178*35ffd701SAndroid Build Coastguard Worker #else
179*35ffd701SAndroid Build Coastguard Worker 	    LogFilePath = std::string(".//") + std::string(GMM_LOG_FILENAME) + "" + ProcName + "_" + PidStr;
180*35ffd701SAndroid Build Coastguard Worker #endif
181*35ffd701SAndroid Build Coastguard Worker             // Create logger
182*35ffd701SAndroid Build Coastguard Worker             SpdLogger = spdlog::rotating_logger_mt(GMM_LOGGER_NAME,
183*35ffd701SAndroid Build Coastguard Worker                                                    LogFilePath,
184*35ffd701SAndroid Build Coastguard Worker                                                    GMM_LOG_FILE_SIZE,
185*35ffd701SAndroid Build Coastguard Worker                                                    GMM_ROTATE_FILE_NUMBER);
186*35ffd701SAndroid Build Coastguard Worker 
187*35ffd701SAndroid Build Coastguard Worker             // Log process path
188*35ffd701SAndroid Build Coastguard Worker             SpdLogger->set_pattern("Process path: %v");
189*35ffd701SAndroid Build Coastguard Worker             SpdLogger->info(ProcPath.c_str());
190*35ffd701SAndroid Build Coastguard Worker         }
191*35ffd701SAndroid Build Coastguard Worker         else
192*35ffd701SAndroid Build Coastguard Worker         {
193*35ffd701SAndroid Build Coastguard Worker #if defined(_WIN32)
194*35ffd701SAndroid Build Coastguard Worker             // Log to debugger
195*35ffd701SAndroid Build Coastguard Worker             auto debugger_sink = std::make_shared<spdlog::sinks::Debugger>();
196*35ffd701SAndroid Build Coastguard Worker             SpdLogger          = std::make_shared<spdlog::logger>(GMM_LOGGER_NAME, debugger_sink);
197*35ffd701SAndroid Build Coastguard Worker #elif defined(__ANDROID__)
198*35ffd701SAndroid Build Coastguard Worker             // Log to logcat
199*35ffd701SAndroid Build Coastguard Worker             SpdLogger   = spdlog::android_logger(GMM_LOGGER_NAME, GMM_LOG_TAG);
200*35ffd701SAndroid Build Coastguard Worker #elif defined(__linux__)
201*35ffd701SAndroid Build Coastguard Worker             // Log to syslog
202*35ffd701SAndroid Build Coastguard Worker             SpdLogger = spdlog::syslog_logger(GMM_LOGGER_NAME, GMM_LOG_TAG, 1 /*Log Pid*/);
203*35ffd701SAndroid Build Coastguard Worker #else
204*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(0);
205*35ffd701SAndroid Build Coastguard Worker             return false;
206*35ffd701SAndroid Build Coastguard Worker #endif
207*35ffd701SAndroid Build Coastguard Worker         }
208*35ffd701SAndroid Build Coastguard Worker     }
209*35ffd701SAndroid Build Coastguard Worker     catch(const spdlog::spdlog_ex &ex)
210*35ffd701SAndroid Build Coastguard Worker     {
211*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0);
212*35ffd701SAndroid Build Coastguard Worker         return false;
213*35ffd701SAndroid Build Coastguard Worker     }
214*35ffd701SAndroid Build Coastguard Worker 
215*35ffd701SAndroid Build Coastguard Worker     // Set log level
216*35ffd701SAndroid Build Coastguard Worker     SpdLogger->set_level(LogLevel);
217*35ffd701SAndroid Build Coastguard Worker     // Set log pattern
218*35ffd701SAndroid Build Coastguard Worker     SpdLogger->set_pattern("[%T.%e] [Thread %t] [%l] %v"); // [Time] [Thread id] [Log Level] [Text to Log]
219*35ffd701SAndroid Build Coastguard Worker 
220*35ffd701SAndroid Build Coastguard Worker     return true;
221*35ffd701SAndroid Build Coastguard Worker }
222*35ffd701SAndroid Build Coastguard Worker 
223*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
224*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger constructor
225*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Logger()226*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger::Logger()
227*35ffd701SAndroid Build Coastguard Worker     : LogMethod(ToOSLog),
228*35ffd701SAndroid Build Coastguard Worker       LogLevel(spdlog::level::off)
229*35ffd701SAndroid Build Coastguard Worker {
230*35ffd701SAndroid Build Coastguard Worker     if(!GmmLogInit())
231*35ffd701SAndroid Build Coastguard Worker     {
232*35ffd701SAndroid Build Coastguard Worker         spdlog::set_level(spdlog::level::off);
233*35ffd701SAndroid Build Coastguard Worker     }
234*35ffd701SAndroid Build Coastguard Worker }
235*35ffd701SAndroid Build Coastguard Worker 
236*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
237*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger Destructor
238*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
~Logger()239*35ffd701SAndroid Build Coastguard Worker GmmLib::Logger::~Logger()
240*35ffd701SAndroid Build Coastguard Worker {
241*35ffd701SAndroid Build Coastguard Worker     if(SpdLogger)
242*35ffd701SAndroid Build Coastguard Worker     {
243*35ffd701SAndroid Build Coastguard Worker         SpdLogger->flush();
244*35ffd701SAndroid Build Coastguard Worker     }
245*35ffd701SAndroid Build Coastguard Worker }
246*35ffd701SAndroid Build Coastguard Worker 
247*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
248*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger C wrappers
249*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
250*35ffd701SAndroid Build Coastguard Worker #if !_WIN32
251*35ffd701SAndroid Build Coastguard Worker // Linux/Android replacement for MS version of _vscprintf
vscprintf_lin(const char * msg,va_list args)252*35ffd701SAndroid Build Coastguard Worker inline int vscprintf_lin(const char *msg, va_list args)
253*35ffd701SAndroid Build Coastguard Worker {
254*35ffd701SAndroid Build Coastguard Worker     char    c;
255*35ffd701SAndroid Build Coastguard Worker     va_list args_cpy;
256*35ffd701SAndroid Build Coastguard Worker 
257*35ffd701SAndroid Build Coastguard Worker     // Copy `args' to prevent internal pointer modification from vsnprintf
258*35ffd701SAndroid Build Coastguard Worker     va_copy(args_cpy, args);
259*35ffd701SAndroid Build Coastguard Worker     int len = vsnprintf(&c, 1, msg, args_cpy);
260*35ffd701SAndroid Build Coastguard Worker     va_end(args_cpy);
261*35ffd701SAndroid Build Coastguard Worker     return len;
262*35ffd701SAndroid Build Coastguard Worker }
263*35ffd701SAndroid Build Coastguard Worker #endif
264*35ffd701SAndroid Build Coastguard Worker 
265*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
266*35ffd701SAndroid Build Coastguard Worker /// Gmm Logger C wrapper for GMM_LOG_* Macros
267*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmLibLogging(GmmLogLevel Level,const char * str,...)268*35ffd701SAndroid Build Coastguard Worker extern "C" void GMM_STDCALL GmmLibLogging(GmmLogLevel Level, const char *str, ...)
269*35ffd701SAndroid Build Coastguard Worker {
270*35ffd701SAndroid Build Coastguard Worker    va_list args;
271*35ffd701SAndroid Build Coastguard Worker 
272*35ffd701SAndroid Build Coastguard Worker     if(GmmLoggerPerProc.SpdLogger)
273*35ffd701SAndroid Build Coastguard Worker     {
274*35ffd701SAndroid Build Coastguard Worker         va_start(args, str);
275*35ffd701SAndroid Build Coastguard Worker 
276*35ffd701SAndroid Build Coastguard Worker #if _WIN32
277*35ffd701SAndroid Build Coastguard Worker         const size_t length = _vscprintf(str, args);
278*35ffd701SAndroid Build Coastguard Worker #else
279*35ffd701SAndroid Build Coastguard Worker         const size_t length = vscprintf_lin(str, args);
280*35ffd701SAndroid Build Coastguard Worker #endif
281*35ffd701SAndroid Build Coastguard Worker 
282*35ffd701SAndroid Build Coastguard Worker         char *temp = new char[length + 1];
283*35ffd701SAndroid Build Coastguard Worker 
284*35ffd701SAndroid Build Coastguard Worker         if(temp)
285*35ffd701SAndroid Build Coastguard Worker         {
286*35ffd701SAndroid Build Coastguard Worker 
287*35ffd701SAndroid Build Coastguard Worker #if _WIN32
288*35ffd701SAndroid Build Coastguard Worker             vsprintf_s(temp, length + 1, str, args);
289*35ffd701SAndroid Build Coastguard Worker #else
290*35ffd701SAndroid Build Coastguard Worker             vsnprintf(temp, length + 1, str, args);
291*35ffd701SAndroid Build Coastguard Worker #endif
292*35ffd701SAndroid Build Coastguard Worker 
293*35ffd701SAndroid Build Coastguard Worker             switch(Level)
294*35ffd701SAndroid Build Coastguard Worker             {
295*35ffd701SAndroid Build Coastguard Worker                 case Trace:
296*35ffd701SAndroid Build Coastguard Worker                     // Set log level to trace if we want trace msges to be printed
297*35ffd701SAndroid Build Coastguard Worker                     //GmmLoggerPerProc.SpdLogger->set_level(spdlog::level::trace);
298*35ffd701SAndroid Build Coastguard Worker                     GmmLoggerPerProc.SpdLogger->trace(temp);
299*35ffd701SAndroid Build Coastguard Worker                     break;
300*35ffd701SAndroid Build Coastguard Worker                 case Info:
301*35ffd701SAndroid Build Coastguard Worker                     // Set log level to info if we want info msges to be printed
302*35ffd701SAndroid Build Coastguard Worker                     //GmmLoggerPerProc.SpdLogger->set_level(spdlog::level::info);
303*35ffd701SAndroid Build Coastguard Worker                     GmmLoggerPerProc.SpdLogger->info(temp);
304*35ffd701SAndroid Build Coastguard Worker                     break;
305*35ffd701SAndroid Build Coastguard Worker                 case Error:
306*35ffd701SAndroid Build Coastguard Worker                     GmmLoggerPerProc.SpdLogger->critical(temp);
307*35ffd701SAndroid Build Coastguard Worker                     break;
308*35ffd701SAndroid Build Coastguard Worker                 default:
309*35ffd701SAndroid Build Coastguard Worker                     break;
310*35ffd701SAndroid Build Coastguard Worker             }
311*35ffd701SAndroid Build Coastguard Worker 
312*35ffd701SAndroid Build Coastguard Worker             delete[] temp;
313*35ffd701SAndroid Build Coastguard Worker         }
314*35ffd701SAndroid Build Coastguard Worker     }
315*35ffd701SAndroid Build Coastguard Worker 
316*35ffd701SAndroid Build Coastguard Worker     va_end(args);
317*35ffd701SAndroid Build Coastguard Worker }
318*35ffd701SAndroid Build Coastguard Worker 
319*35ffd701SAndroid Build Coastguard Worker #endif //#if GMM_LOG_AVAILABLE
320