• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program Helper Library
3  * -------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Debug output utilities.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "qpDebugOut.h"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 
29 typedef enum MessageType_e
30 {
31 	MESSAGETYPE_INFO	= 0,
32 	MESSAGETYPE_ERROR,
33 
34 	MESSAGETYPE_LAST
35 } MessageType;
36 
37 static void		printRaw		(MessageType type, const char* msg);
38 static void		printFmt		(MessageType type, const char* fmt, va_list args);
39 static void		exitProcess		(void);
40 
qpPrint(const char * message)41 void qpPrint (const char* message)
42 {
43 	printRaw(MESSAGETYPE_INFO, message);
44 }
45 
qpPrintf(const char * format,...)46 void qpPrintf (const char* format, ...)
47 {
48 	va_list args;
49 	va_start(args, format);
50 	printFmt(MESSAGETYPE_INFO, format, args);
51 	va_end(args);
52 }
53 
qpPrintv(const char * format,va_list args)54 void qpPrintv (const char* format, va_list args)
55 {
56 	printFmt(MESSAGETYPE_INFO, format, args);
57 }
58 
qpDief(const char * format,...)59 void qpDief (const char* format, ...)
60 {
61 	va_list args;
62 	va_start(args, format);
63 	printFmt(MESSAGETYPE_ERROR, format, args);
64 	va_end(args);
65 
66 	exitProcess();
67 }
68 
qpDiev(const char * format,va_list args)69 void qpDiev (const char* format, va_list args)
70 {
71 	printFmt(MESSAGETYPE_ERROR, format, args);
72 	exitProcess();
73 }
74 
75 /* print() implementation. */
76 #if (DE_OS == DE_OS_ANDROID)
77 
78 #include <android/log.h>
79 
getLogPriority(MessageType type)80 static android_LogPriority getLogPriority (MessageType type)
81 {
82 	switch (type)
83 	{
84 		case MESSAGETYPE_INFO:	return ANDROID_LOG_INFO;
85 		case MESSAGETYPE_ERROR:	return ANDROID_LOG_FATAL;
86 		default:				return ANDROID_LOG_DEBUG;
87 	}
88 }
89 
printRaw(MessageType type,const char * message)90 void printRaw (MessageType type, const char* message)
91 {
92 	__android_log_write(getLogPriority(type), "dEQP", message);
93 }
94 
printFmt(MessageType type,const char * format,va_list args)95 void printFmt (MessageType type, const char* format, va_list args)
96 {
97 	__android_log_vprint(getLogPriority(type), "dEQP", format, args);
98 }
99 
100 #else
101 
getOutFile(MessageType type)102 static FILE* getOutFile (MessageType type)
103 {
104 	if (type == MESSAGETYPE_ERROR)
105 		return stderr;
106 	else
107 		return stdout;
108 }
109 
printRaw(MessageType type,const char * message)110 void printRaw (MessageType type, const char* message)
111 {
112 	FILE* out = getOutFile(type);
113 
114 	if (type == MESSAGETYPE_ERROR)
115 		fprintf(out, "FATAL ERROR: ");
116 
117 	fputs(message, out);
118 
119 	if (type == MESSAGETYPE_ERROR)
120 	{
121 		putc('\n', out);
122 		fflush(out);
123 	}
124 }
125 
printFmt(MessageType type,const char * format,va_list args)126 void printFmt (MessageType type, const char* format, va_list args)
127 {
128 	FILE* out = getOutFile(type);
129 
130 	if (type == MESSAGETYPE_ERROR)
131 		fprintf(out, "FATAL ERROR: ");
132 
133 	vfprintf(out, format, args);
134 
135 	if (type == MESSAGETYPE_ERROR)
136 	{
137 		putc('\n', out);
138 		fflush(out);
139 	}
140 }
141 
142 #endif
143 
144 /* exitProcess() implementation. */
145 #if (DE_OS == DE_OS_WIN32)
146 
147 #define NOMINMAX
148 #define VC_EXTRALEAN
149 #define WIN32_LEAN_AND_MEAN
150 #include <windows.h>
151 
exitProcess(void)152 static void exitProcess (void)
153 {
154 	/* Some API implementations register atexit() functions that may hang.
155 	   By using TerminateProcess() we can avoid calling any potentially hanging exit routines. */
156 	HANDLE curProc = GetCurrentProcess();
157 	TerminateProcess(curProc, -1);
158 }
159 
160 #elif (DE_OS == DE_OS_IOS)
161 
162 #include "deThread.h"
163 
exitProcess(void)164 static void exitProcess (void)
165 {
166 	/* Since tests are in the same process as execserver, we want to give it
167 	   a chance to stream complete log data before terminating. */
168 	deSleep(5000);
169 	exit(-1);
170 }
171 
172 #else
173 
exitProcess(void)174 static void exitProcess (void)
175 {
176 	exit(-1);
177 }
178 
179 #endif
180