logging.h revision 8d768a954b101a9532f980253ac46be2c53aba11
142ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes/* 242ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * Copyright (C) 2011 The Android Open Source Project 342ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * 442ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 542ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * you may not use this file except in compliance with the License. 642ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * You may obtain a copy of the License at 742ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * 842ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 942ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * 1042ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * Unless required by applicable law or agreed to in writing, software 1142ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 1242ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1342ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * See the License for the specific language governing permissions and 1442ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes * limitations under the License. 1542ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes */ 166c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 176b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro#ifndef ART_SRC_LOGGING_H_ 186b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro#define ART_SRC_LOGGING_H_ 196c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 20eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#include <cerrno> 21eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#include <cstring> 226c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#include <iostream> // NOLINT 23eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#include <sstream> 24eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#include "log_severity.h" 25eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#include "macros.h" 266c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 276c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define CHECK(x) \ 28eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes if (!(x)) \ 29710a0cbb4b0af03ce8651ed7936437c73250045eElliott Hughes LogMessage(__FILE__, __LINE__, FATAL, -1).stream() \ 30710a0cbb4b0af03ce8651ed7936437c73250045eElliott Hughes << "Check failed: " #x << " " 31eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes 321f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_OP(LHS, RHS, OP) \ 331f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes do { \ 341f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes typeof (LHS) _lhs = (LHS); \ 351f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes typeof (RHS) _rhs = (RHS); \ 361f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes if (!(_lhs OP _rhs)) { \ 371f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes LogMessage(__FILE__, __LINE__, FATAL, -1).stream() \ 381f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes << "Check failed: " << #LHS << " " << #OP << " " << #RHS \ 391f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes << " (" #LHS "=" << _lhs << ", " #RHS "=" << _rhs << ")"; \ 401f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } \ 411f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes } while (false) 421f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes 431f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_EQ(x, y) CHECK_OP(x, y, ==) 441f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_NE(x, y) CHECK_OP(x, y, !=) 451f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_LE(x, y) CHECK_OP(x, y, <=) 461f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_LT(x, y) CHECK_OP(x, y, <) 471f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_GE(x, y) CHECK_OP(x, y, >=) 481f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_GT(x, y) CHECK_OP(x, y, >) 49eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes 50eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define CHECK_STROP(s1, s2, sense) \ 51eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes do { \ 52eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes if ((strcmp(s1, s2) == 0) != sense) { \ 53eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes LOG(FATAL) << "Check failed: " \ 54eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes << "\"" << s1 << "\"" \ 55eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes << (sense ? " == " : " != ") \ 56eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes << "\"" << s2 << "\""; \ 57eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes } \ 58eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes } while (false) 596c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 601f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_STREQ(s1, s2) CHECK_STROP(s1, s2, true) 611f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes#define CHECK_STRNE(s1, s2) CHECK_STROP(s1, s2, false) 621f359b08f5ad33ae72e4073b86a9257fe1ed11e5Elliott Hughes 638d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes#define CHECK_PTHREAD_CALL(call, args, what) \ 648d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes do { \ 658d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes int rc = call args; \ 668d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes if (rc != 0) { \ 678d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes errno = rc; \ 688d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes PLOG(FATAL) << # call << " failed for " << what; \ 698d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes } \ 708d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes } while (false) 718d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes 726c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#ifndef NDEBUG 736c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 746c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK(x) CHECK(x) 756c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_EQ(x, y) CHECK_EQ(x, y) 766c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_NE(x, y) CHECK_NE(x, y) 776c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_LE(x, y) CHECK_LE(x, y) 786c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_LT(x, y) CHECK_LT(x, y) 796c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_GE(x, y) CHECK_GE(x, y) 806c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_GT(x, y) CHECK_GT(x, y) 81eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define DCHECK_STREQ(s1, s2) CHECK_STREQ(s1, s2) 82eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define DCHECK_STRNE(s1, s2) CHECK_STRNE(s1, s2) 836c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 846c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#else // NDEBUG 856c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 866c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK(condition) \ 876c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 886c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK(condition) 896c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 906c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_EQ(val1, val2) \ 916c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 926c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_EQ(val1, val2) 936c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 946c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_NE(val1, val2) \ 956c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 966c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_NE(val1, val2) 976c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 986c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_LE(val1, val2) \ 996c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 1006c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_LE(val1, val2) 1016c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1026c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_LT(val1, val2) \ 1036c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 1046c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_LT(val1, val2) 1056c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1066c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_GE(val1, val2) \ 1076c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 1086c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_GE(val1, val2) 1096c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1106c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_GT(val1, val2) \ 1116c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 1126c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_GT(val1, val2) 1136c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1146c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define DCHECK_STREQ(str1, str2) \ 1156c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro while (false) \ 1166c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro CHECK_STREQ(str1, str2) 1176c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 118eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define DCHECK_STRNE(str1, str2) \ 119eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes while (false) \ 120eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes CHECK_STRNE(str1, str2) 121eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes 1226c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#endif 1236c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 124eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define LOG(severity) LogMessage(__FILE__, __LINE__, severity, -1).stream() 125eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes#define PLOG(severity) LogMessage(__FILE__, __LINE__, severity, errno).stream() 126eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes 1276c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro#define LG LOG(INFO) 1286c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1298d768a954b101a9532f980253ac46be2c53aba11Elliott Hughes#define UNIMPLEMENTED(level) LOG(level) << __PRETTY_FUNCTION__ << " unimplemented " 13053b61314370c49354ed6f8d616d6a9a182410fc1Elliott Hughes 1316c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiroclass LogMessage { 1326c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro public: 133eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes LogMessage(const char* file, int line, LogSeverity severity, int error); 134eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes ~LogMessage(); 135eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes std::ostream& stream(); 1366c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1376c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro private: 13842ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes void LogLine(const char*); 13942ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes 140eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes std::stringstream buffer_; 141ffe6736397d17457188727510f0a2953f69a383aElliott Hughes const char* file_; 14242ee14279065352a4b9a3e8028d02c567e847d05Elliott Hughes int line_number_; 143eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes LogSeverity severity_; 144eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes int errno_; 145eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes 146eb4f614f2eb53b92ebd416fa418f550861655887Elliott Hughes DISALLOW_COPY_AND_ASSIGN(LogMessage); 1476c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro}; 1486c21dc1bcafd83e90daa42a27dacd285278f3667Carl Shapiro 1496b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro#endif // ART_SRC_LOGGING_H_ 150