Home | History | Annotate | Download | only in qphelper
      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 
     41 void qpPrint (const char* message)
     42 {
     43 	printRaw(MESSAGETYPE_INFO, message);
     44 }
     45 
     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 
     54 void qpPrintv (const char* format, va_list args)
     55 {
     56 	printFmt(MESSAGETYPE_INFO, format, args);
     57 }
     58 
     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 
     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 
     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 
     90 void printRaw (MessageType type, const char* message)
     91 {
     92 	__android_log_write(getLogPriority(type), "dEQP", message);
     93 }
     94 
     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 
    102 static FILE* getOutFile (MessageType type)
    103 {
    104 	if (type == MESSAGETYPE_ERROR)
    105 		return stderr;
    106 	else
    107 		return stdout;
    108 }
    109 
    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 
    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 
    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 
    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 
    174 static void exitProcess (void)
    175 {
    176 	exit(-1);
    177 }
    178 
    179 #endif
    180