Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: base/logging.h

Issue 8734021: Make CHECK not print messages in official builds (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/check_example.cc ('k') | base/logging_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_LOGGING_H_ 5 #ifndef BASE_LOGGING_H_
6 #define BASE_LOGGING_H_ 6 #define BASE_LOGGING_H_
7 #pragma once 7 #pragma once
8 8
9 #include <cassert> 9 #include <cassert>
10 #include <string> 10 #include <string>
11 #include <cstring> 11 #include <cstring>
12 #include <sstream> 12 #include <sstream>
13 13
14 #include "base/base_export.h" 14 #include "base/base_export.h"
15 #include "base/basictypes.h" 15 #include "base/basictypes.h"
16 #include "base/debug/debugger.h"
16 #include "build/build_config.h" 17 #include "build/build_config.h"
17 18
18 // 19 //
19 // Optional message capabilities 20 // Optional message capabilities
20 // ----------------------------- 21 // -----------------------------
21 // Assertion failed messages and fatal errors are displayed in a dialog box 22 // Assertion failed messages and fatal errors are displayed in a dialog box
22 // before the application exits. However, running this UI creates a message 23 // before the application exits. However, running this UI creates a message
23 // loop, which causes application messages to be processed and potentially 24 // loop, which causes application messages to be processed and potentially
24 // dispatched to existing application windows. Since the application is in a 25 // dispatched to existing application windows. Since the application is in a
25 // bad state when this assertion dialog is displayed, these messages may not 26 // bad state when this assertion dialog is displayed, these messages may not
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 #define PLOG_STREAM(severity) LOG_ERRNO_STREAM(severity) 436 #define PLOG_STREAM(severity) LOG_ERRNO_STREAM(severity)
436 // TODO(tschmelcher): Should we add OSStatus logging for Mac? 437 // TODO(tschmelcher): Should we add OSStatus logging for Mac?
437 #endif 438 #endif
438 439
439 #define PLOG(severity) \ 440 #define PLOG(severity) \
440 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity)) 441 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity))
441 442
442 #define PLOG_IF(severity, condition) \ 443 #define PLOG_IF(severity, condition) \
443 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition)) 444 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition))
444 445
446 // http://crbug.com/16512 is open for a real fix for this. For now, Windows
447 // uses OFFICIAL_BUILD and other platforms use the branding flag when NDEBUG is
448 // defined.
449 #if ( defined(OS_WIN) && defined(OFFICIAL_BUILD)) || \
450 (!defined(OS_WIN) && defined(NDEBUG) && defined(GOOGLE_CHROME_BUILD))
451 #define LOGGING_IS_OFFICIAL_BUILD 1
452 #else
453 #define LOGGING_IS_OFFICIAL_BUILD 0
454 #endif
455
456 // The actual stream used isn't important.
457 #define EAT_STREAM_PARAMETERS \
458 true ? (void) 0 : ::logging::LogMessageVoidify() & LOG_STREAM(FATAL)
459
445 // CHECK dies with a fatal error if condition is not true. It is *not* 460 // CHECK dies with a fatal error if condition is not true. It is *not*
446 // controlled by NDEBUG, so the check will be executed regardless of 461 // controlled by NDEBUG, so the check will be executed regardless of
447 // compilation mode. 462 // compilation mode.
448 // 463 //
449 // We make sure CHECK et al. always evaluates their arguments, as 464 // We make sure CHECK et al. always evaluates their arguments, as
450 // doing CHECK(FunctionWithSideEffect()) is a common idiom. 465 // doing CHECK(FunctionWithSideEffect()) is a common idiom.
466
467 #if LOGGING_IS_OFFICIAL_BUILD
468
469 // Make all CHECK functions discard their log strings to reduce code
470 // bloat for official builds.
471
472 // TODO(akalin): This would be more valuable if there were some way to
473 // remove BreakDebugger() from the backtrace, perhaps by turning it
474 // into a macro (like __debugbreak() on Windows).
475 #define CHECK(condition) \
476 !(condition) ? ::base::debug::BreakDebugger() : EAT_STREAM_PARAMETERS
477
478 #define PCHECK(condition) CHECK(condition)
479
480 #define CHECK_OP(name, op, val1, val2) CHECK((val1) op (val2))
481
482 #else
483
451 #define CHECK(condition) \ 484 #define CHECK(condition) \
452 LAZY_STREAM(LOG_STREAM(FATAL), !(condition)) \ 485 LAZY_STREAM(LOG_STREAM(FATAL), !(condition)) \
453 << "Check failed: " #condition ". " 486 << "Check failed: " #condition ". "
454 487
455 #define PCHECK(condition) \ 488 #define PCHECK(condition) \
456 LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \ 489 LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \
457 << "Check failed: " #condition ". " 490 << "Check failed: " #condition ". "
458 491
492 // Helper macro for binary operators.
493 // Don't use this macro directly in your code, use CHECK_EQ et al below.
494 //
495 // TODO(akalin): Rewrite this so that constructs like if (...)
496 // CHECK_EQ(...) else { ... } work properly.
497 #define CHECK_OP(name, op, val1, val2) \
498 if (std::string* _result = \
499 logging::Check##name##Impl((val1), (val2), \
500 #val1 " " #op " " #val2)) \
501 logging::LogMessage(__FILE__, __LINE__, _result).stream()
502
503 #endif
504
459 // Build the error message string. This is separate from the "Impl" 505 // Build the error message string. This is separate from the "Impl"
460 // function template because it is not performance critical and so can 506 // function template because it is not performance critical and so can
461 // be out of line, while the "Impl" code should be inline. Caller 507 // be out of line, while the "Impl" code should be inline. Caller
462 // takes ownership of the returned string. 508 // takes ownership of the returned string.
463 template<class t1, class t2> 509 template<class t1, class t2>
464 std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) { 510 std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) {
465 std::ostringstream ss; 511 std::ostringstream ss;
466 ss << names << " (" << v1 << " vs. " << v2 << ")"; 512 ss << names << " (" << v1 << " vs. " << v2 << ")";
467 std::string* msg = new std::string(ss.str()); 513 std::string* msg = new std::string(ss.str());
468 return msg; 514 return msg;
(...skipping 12 matching lines...) Expand all
481 std::string* MakeCheckOpString<unsigned long, unsigned int>( 527 std::string* MakeCheckOpString<unsigned long, unsigned int>(
482 const unsigned long&, const unsigned int&, const char* names); 528 const unsigned long&, const unsigned int&, const char* names);
483 extern template BASE_EXPORT 529 extern template BASE_EXPORT
484 std::string* MakeCheckOpString<unsigned int, unsigned long>( 530 std::string* MakeCheckOpString<unsigned int, unsigned long>(
485 const unsigned int&, const unsigned long&, const char* names); 531 const unsigned int&, const unsigned long&, const char* names);
486 extern template BASE_EXPORT 532 extern template BASE_EXPORT
487 std::string* MakeCheckOpString<std::string, std::string>( 533 std::string* MakeCheckOpString<std::string, std::string>(
488 const std::string&, const std::string&, const char* name); 534 const std::string&, const std::string&, const char* name);
489 #endif 535 #endif
490 536
491 // Helper macro for binary operators.
492 // Don't use this macro directly in your code, use CHECK_EQ et al below.
493 //
494 // TODO(akalin): Rewrite this so that constructs like if (...)
495 // CHECK_EQ(...) else { ... } work properly.
496 #define CHECK_OP(name, op, val1, val2) \
497 if (std::string* _result = \
498 logging::Check##name##Impl((val1), (val2), \
499 #val1 " " #op " " #val2)) \
500 logging::LogMessage(__FILE__, __LINE__, _result).stream()
501
502 // Helper functions for CHECK_OP macro. 537 // Helper functions for CHECK_OP macro.
503 // The (int, int) specialization works around the issue that the compiler 538 // The (int, int) specialization works around the issue that the compiler
504 // will not instantiate the template version of the function on values of 539 // will not instantiate the template version of the function on values of
505 // unnamed enum type - see comment below. 540 // unnamed enum type - see comment below.
506 #define DEFINE_CHECK_OP_IMPL(name, op) \ 541 #define DEFINE_CHECK_OP_IMPL(name, op) \
507 template <class t1, class t2> \ 542 template <class t1, class t2> \
508 inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \ 543 inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \
509 const char* names) { \ 544 const char* names) { \
510 if (v1 op v2) return NULL; \ 545 if (v1 op v2) return NULL; \
511 else return MakeCheckOpString(v1, v2, names); \ 546 else return MakeCheckOpString(v1, v2, names); \
(...skipping 10 matching lines...) Expand all
522 DEFINE_CHECK_OP_IMPL(GT, > ) 557 DEFINE_CHECK_OP_IMPL(GT, > )
523 #undef DEFINE_CHECK_OP_IMPL 558 #undef DEFINE_CHECK_OP_IMPL
524 559
525 #define CHECK_EQ(val1, val2) CHECK_OP(EQ, ==, val1, val2) 560 #define CHECK_EQ(val1, val2) CHECK_OP(EQ, ==, val1, val2)
526 #define CHECK_NE(val1, val2) CHECK_OP(NE, !=, val1, val2) 561 #define CHECK_NE(val1, val2) CHECK_OP(NE, !=, val1, val2)
527 #define CHECK_LE(val1, val2) CHECK_OP(LE, <=, val1, val2) 562 #define CHECK_LE(val1, val2) CHECK_OP(LE, <=, val1, val2)
528 #define CHECK_LT(val1, val2) CHECK_OP(LT, < , val1, val2) 563 #define CHECK_LT(val1, val2) CHECK_OP(LT, < , val1, val2)
529 #define CHECK_GE(val1, val2) CHECK_OP(GE, >=, val1, val2) 564 #define CHECK_GE(val1, val2) CHECK_OP(GE, >=, val1, val2)
530 #define CHECK_GT(val1, val2) CHECK_OP(GT, > , val1, val2) 565 #define CHECK_GT(val1, val2) CHECK_OP(GT, > , val1, val2)
531 566
532 // http://crbug.com/16512 is open for a real fix for this. For now, Windows 567 #if LOGGING_IS_OFFICIAL_BUILD
533 // uses OFFICIAL_BUILD and other platforms use the branding flag when NDEBUG is
534 // defined.
535 #if ( defined(OS_WIN) && defined(OFFICIAL_BUILD)) || \
536 (!defined(OS_WIN) && defined(NDEBUG) && defined(GOOGLE_CHROME_BUILD))
537 // Used by unit tests.
538 #define LOGGING_IS_OFFICIAL_BUILD
539
540 // In order to have optimized code for official builds, remove DLOGs and 568 // In order to have optimized code for official builds, remove DLOGs and
541 // DCHECKs. 569 // DCHECKs.
542 #define ENABLE_DLOG 0 570 #define ENABLE_DLOG 0
543 #define ENABLE_DCHECK 0 571 #define ENABLE_DCHECK 0
544 572
545 #elif defined(NDEBUG) 573 #elif defined(NDEBUG)
546 // Otherwise, if we're a release build, remove DLOGs but not DCHECKs 574 // Otherwise, if we're a release build, remove DLOGs but not DCHECKs
547 // (since those can still be turned on via a command-line flag). 575 // (since those can still be turned on via a command-line flag).
548 #define ENABLE_DLOG 0 576 #define ENABLE_DLOG 0
549 #define ENABLE_DCHECK 1 577 #define ENABLE_DCHECK 1
(...skipping 15 matching lines...) Expand all
565 #define DVLOG_IF(verboselevel, condition) VLOG_IF(verboselevel, condition) 593 #define DVLOG_IF(verboselevel, condition) VLOG_IF(verboselevel, condition)
566 #define DVPLOG_IF(verboselevel, condition) VPLOG_IF(verboselevel, condition) 594 #define DVPLOG_IF(verboselevel, condition) VPLOG_IF(verboselevel, condition)
567 595
568 #else // ENABLE_DLOG 596 #else // ENABLE_DLOG
569 597
570 // If ENABLE_DLOG is off, we want to avoid emitting any references to 598 // If ENABLE_DLOG is off, we want to avoid emitting any references to
571 // |condition| (which may reference a variable defined only if NDEBUG 599 // |condition| (which may reference a variable defined only if NDEBUG
572 // is not defined). Contrast this with DCHECK et al., which has 600 // is not defined). Contrast this with DCHECK et al., which has
573 // different behavior. 601 // different behavior.
574 602
575 #define DLOG_EAT_STREAM_PARAMETERS \
576 true ? (void) 0 : ::logging::LogMessageVoidify() & LOG_STREAM(FATAL)
577
578 #define DLOG_IS_ON(severity) false 603 #define DLOG_IS_ON(severity) false
579 #define DLOG_IF(severity, condition) DLOG_EAT_STREAM_PARAMETERS 604 #define DLOG_IF(severity, condition) EAT_STREAM_PARAMETERS
580 #define DLOG_ASSERT(condition) DLOG_EAT_STREAM_PARAMETERS 605 #define DLOG_ASSERT(condition) EAT_STREAM_PARAMETERS
581 #define DPLOG_IF(severity, condition) DLOG_EAT_STREAM_PARAMETERS 606 #define DPLOG_IF(severity, condition) EAT_STREAM_PARAMETERS
582 #define DVLOG_IF(verboselevel, condition) DLOG_EAT_STREAM_PARAMETERS 607 #define DVLOG_IF(verboselevel, condition) EAT_STREAM_PARAMETERS
583 #define DVPLOG_IF(verboselevel, condition) DLOG_EAT_STREAM_PARAMETERS 608 #define DVPLOG_IF(verboselevel, condition) EAT_STREAM_PARAMETERS
584 609
585 #endif // ENABLE_DLOG 610 #endif // ENABLE_DLOG
586 611
587 // DEBUG_MODE is for uses like 612 // DEBUG_MODE is for uses like
588 // if (DEBUG_MODE) foo.CheckThatFoo(); 613 // if (DEBUG_MODE) foo.CheckThatFoo();
589 // instead of 614 // instead of
590 // #ifndef NDEBUG 615 // #ifndef NDEBUG
591 // foo.CheckThatFoo(); 616 // foo.CheckThatFoo();
592 // #endif 617 // #endif
593 // 618 //
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 namespace base { 980 namespace base {
956 981
957 class StringPiece; 982 class StringPiece;
958 983
959 // Allows StringPiece to be logged. 984 // Allows StringPiece to be logged.
960 BASE_EXPORT std::ostream& operator<<(std::ostream& o, const StringPiece& piece); 985 BASE_EXPORT std::ostream& operator<<(std::ostream& o, const StringPiece& piece);
961 986
962 } // namespace base 987 } // namespace base
963 988
964 #endif // BASE_LOGGING_H_ 989 #endif // BASE_LOGGING_H_
OLDNEW
« no previous file with comments | « base/check_example.cc ('k') | base/logging_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698