• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

realm / realm-core / 1786

28 Oct 2023 12:35PM UTC coverage: 91.562% (-0.02%) from 91.582%
1786

push

Evergreen

web-flow
Improve configurations for sanitized builds (#6911)

* Refactor sanitizer flags for different build types:

** Enable address sanitizer for msvc
** Allow to build with sanitizer for diffent optimized build (also Debug)
** Make RelASAN, RelTSAN, RelUSAN, RelUSAN just shortcuts for half-optimized builds

* Fix usage of moved object for fuzz tester
* Check asan/tsan on macos x64/arm64
* Check asan with msvc 2019
* Remove Jenkins sanitized builders replaced by evergreen configs
* Work-around stack-use-after-scope with msvc2019 and mpark
* Fix crash on check with staled ColKeys
* fix a buffer overrun in a test
* fix a race in async_open_realm test util
* Add some logger related test fixes
* Work around catch2 limmitation with not thread safe asserts and TSAN races
* Run multiprocesses tests under sanitizers
* add assert for an error reported by undefined sanitizer
* Workaround uv scheduler main thread only constraint for callbacks called from non main thread and requesting a realm

---------

Co-authored-by: James Stone <james.stone@mongodb.com>

94310 of 173648 branches covered (0.0%)

54 of 63 new or added lines in 15 files covered. (85.71%)

2212 existing lines in 52 files now uncovered.

230602 of 251853 relevant lines covered (91.56%)

6943670.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.36
/src/realm/util/logger.cpp
1
/*************************************************************************
2
 *
3
 * Copyright 2016 Realm Inc.
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 **************************************************************************/
18

19
#include <realm/util/logger.hpp>
20

21
#include <iostream>
22
#include <mutex>
23

24
namespace realm::util {
25

26
namespace {
27
auto& s_logger_mutex = *new std::mutex;
28
std::shared_ptr<util::Logger> s_default_logger;
29
std::atomic<Logger::Level> s_default_level = Logger::Level::info;
30
} // anonymous namespace
31

32
void Logger::set_default_logger(std::shared_ptr<util::Logger> logger) noexcept
33
{
12✔
34
    std::lock_guard lock(s_logger_mutex);
12✔
35
    s_default_logger = logger;
12✔
36
}
12✔
37

38
std::shared_ptr<util::Logger>& Logger::get_default_logger() noexcept
39
{
185,007✔
40
    std::lock_guard lock(s_logger_mutex);
185,007✔
41
    if (!s_default_logger) {
185,007✔
42
        s_default_logger = std::make_shared<StderrLogger>();
30✔
43
        s_default_logger->set_level_threshold(s_default_level);
30✔
44
    }
30✔
45

91,380✔
46
    return s_default_logger;
185,007✔
47
}
185,007✔
48

49
void Logger::set_default_level_threshold(Level level) noexcept
50
{
38,979✔
51
    std::lock_guard lock(s_logger_mutex);
38,979✔
52
    s_default_level = level;
38,979✔
53
    if (s_default_logger)
38,979✔
54
        s_default_logger->set_level_threshold(level);
38,964✔
55
}
38,979✔
56

57
Logger::Level Logger::get_default_level_threshold() noexcept
58
{
534✔
59
    return s_default_level.load(std::memory_order_relaxed);
534✔
60
}
534✔
61

62
const char* Logger::get_level_prefix(Level level) noexcept
63
{
2,261,145✔
64
    switch (level) {
2,261,145✔
65
        case Level::off:
✔
66
            [[fallthrough]];
×
67
        case Level::all:
✔
68
            [[fallthrough]];
×
69
        case Level::trace:
92,058✔
70
            [[fallthrough]];
92,058✔
71
        case Level::debug:
1,585,602✔
72
            [[fallthrough]];
1,585,602✔
73
        case Level::detail:
1,930,314✔
74
            [[fallthrough]];
1,930,314✔
75
        case Level::info:
2,238,120✔
76
            break;
2,238,120✔
77
        case Level::warn:
948,372✔
78
            return "WARNING: ";
22,572✔
79
        case Level::error:
937,164✔
80
            return "ERROR: ";
474✔
81
        case Level::fatal:
936,924✔
82
            return "FATAL: ";
×
83
    }
2,238,099✔
84
    return "";
2,238,099✔
85
}
2,238,099✔
86

87
const std::string_view Logger::level_to_string(Level level) noexcept
88
{
22,284✔
89
    switch (level) {
22,284✔
90
        case Logger::Level::all:
6✔
91
            return "all";
6✔
92
        case Logger::Level::trace:
6✔
93
            return "trace";
6✔
94
        case Logger::Level::debug:
18,291✔
95
            return "debug";
18,291✔
96
        case Logger::Level::detail:
6✔
97
            return "detail";
6✔
98
        case Logger::Level::info:
2,913✔
99
            return "info";
2,913✔
100
        case Logger::Level::warn:
6✔
101
            return "warn";
6✔
102
        case Logger::Level::error:
6✔
103
            return "error";
6✔
104
        case Logger::Level::fatal:
6✔
105
            return "fatal";
6✔
106
        case Logger::Level::off:
1,044✔
107
            return "off";
1,044✔
108
    }
×
109
    REALM_ASSERT(false);
×
110
    return "";
×
111
}
×
112

113
void StderrLogger::do_log(Level level, const std::string& message)
114
{
2,120,478✔
115
    static Mutex mutex;
2,120,478✔
116
    LockGuard l(mutex);
2,120,478✔
117
    // std::cerr is unbuffered, so no need to flush
1,028,259✔
118
    std::cerr << get_level_prefix(level) << message << '\n'; // Throws
2,120,478✔
119
}
2,120,478✔
120

121
void StreamLogger::do_log(Level level, const std::string& message)
122
{
140,655✔
123
    m_out << get_level_prefix(level) << message << std::endl; // Throws
140,655✔
124
}
140,655✔
125

126
void ThreadSafeLogger::do_log(Level level, const std::string& message)
127
{
472,737✔
128
    LockGuard l(m_mutex);
472,737✔
129
    Logger::do_log(*m_base_logger_ptr, level, message); // Throws
472,737✔
130
}
472,737✔
131

132
void PrefixLogger::do_log(Level level, const std::string& message)
133
{
455,247✔
134
    Logger::do_log(m_chained_logger, level, m_prefix + message); // Throws
455,247✔
135
}
455,247✔
136

137
void LocalThresholdLogger::do_log(Logger::Level level, std::string const& message)
UNCOV
138
{
×
UNCOV
139
    Logger::do_log(*m_chained_logger, level, message); // Throws
×
UNCOV
140
}
×
141
} // namespace realm::util
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc