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