Skip to content

Commit 9643828

Browse files
committed
Fix issues
Signed-off-by: JCW <[email protected]>
1 parent ae1ef68 commit 9643828

File tree

3 files changed

+71
-66
lines changed

3 files changed

+71
-66
lines changed

include/xrpl/beast/utility/Journal.h

Lines changed: 52 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <xrpl/beast/utility/instrumentation.h>
2424

2525
#include <charconv>
26+
#include <shared_mutex>
2627
#include <source_location>
2728
#include <sstream>
2829
#include <string>
@@ -84,140 +85,140 @@ namespace detail {
8485
class SimpleJsonWriter
8586
{
8687
public:
87-
explicit SimpleJsonWriter(std::string& stream) : stream_(stream)
88+
explicit SimpleJsonWriter(std::string& buffer) : buffer_(buffer)
8889
{
8990
}
9091

9192
void
9293
startObject() const
9394
{
94-
stream_.push_back('{');
95+
buffer_.push_back('{');
9596
}
9697
void
9798
endObject() const
9899
{
99100
using namespace std::string_view_literals;
100-
stream_.pop_back();
101-
stream_.append("},"sv);
101+
buffer_.pop_back();
102+
buffer_.append("},"sv);
102103
}
103104
void
104105
writeKey(std::string_view key) const
105106
{
106107
writeString(key);
107-
stream_.back() = ':';
108+
buffer_.back() = ':';
108109
}
109110
void
110111
startArray() const
111112
{
112-
stream_.push_back('[');
113+
buffer_.push_back('[');
113114
}
114115
void
115116
endArray() const
116117
{
117118
using namespace std::string_view_literals;
118-
stream_.pop_back();
119-
stream_.append("],"sv);
119+
buffer_.pop_back();
120+
buffer_.append("],"sv);
120121
}
121122
void
122123
writeString(std::string_view str) const
123124
{
124125
using namespace std::string_view_literals;
125-
stream_.push_back('"');
126-
escape(str, stream_);
127-
stream_.append("\","sv);
126+
buffer_.push_back('"');
127+
escape(str, buffer_);
128+
buffer_.append("\","sv);
128129
}
129130
std::string_view
130131
writeInt(std::int8_t val) const
131132
{
132-
return pushNumber(val, stream_);
133+
return pushNumber(val, buffer_);
133134
}
134135
std::string_view
135136
writeInt(std::int16_t val) const
136137
{
137-
return pushNumber(val, stream_);
138+
return pushNumber(val, buffer_);
138139
}
139140
std::string_view
140141
writeInt(std::int32_t val) const
141142
{
142-
return pushNumber(val, stream_);
143+
return pushNumber(val, buffer_);
143144
}
144145
std::string_view
145146
writeInt(std::int64_t val) const
146147
{
147-
return pushNumber(val, stream_);
148+
return pushNumber(val, buffer_);
148149
}
149150
std::string_view
150151
writeUInt(std::size_t val) const
151152
{
152-
return pushNumber(val, stream_);
153+
return pushNumber(val, buffer_);
153154
}
154155
std::string_view
155156
writeUInt(std::uint8_t val) const
156157
{
157-
return pushNumber(val, stream_);
158+
return pushNumber(val, buffer_);
158159
}
159160
std::string_view
160161
writeUInt(std::uint16_t val) const
161162
{
162-
return pushNumber(val, stream_);
163+
return pushNumber(val, buffer_);
163164
}
164165
std::string_view
165166
writeUInt(std::uint32_t val) const
166167
{
167-
return pushNumber(val, stream_);
168+
return pushNumber(val, buffer_);
168169
}
169170
std::string_view
170171
writeUInt(std::uint64_t val) const
171172
{
172-
return pushNumber(val, stream_);
173+
return pushNumber(val, buffer_);
173174
}
174175
std::string_view
175176
writeDouble(double val) const
176177
{
177-
return pushNumber(val, stream_);
178+
return pushNumber(val, buffer_);
178179
}
179180
std::string_view
180181
writeBool(bool val) const
181182
{
182183
using namespace std::string_view_literals;
183184
auto str = val ? "true,"sv : "false,"sv;
184-
stream_.append(str);
185+
buffer_.append(str);
185186
return str;
186187
}
187188
void
188189
writeNull() const
189190
{
190191
using namespace std::string_view_literals;
191-
stream_.append("null,"sv);
192+
buffer_.append("null,"sv);
192193
}
193194
void
194195
writeRaw(std::string_view str) const
195196
{
196-
stream_.append(str);
197+
buffer_.append(str);
197198
}
198199

199200
[[nodiscard]] std::string_view
200201
finish()
201202
{
202-
return std::string_view{stream_.c_str(), stream_.size() - 1};
203+
return std::string_view{buffer_.c_str(), buffer_.size() - 1};
203204
}
204205

205206
private:
206207
template <typename T>
207208
static std::string_view
208-
pushNumber(T val, std::string& stream)
209+
pushNumber(T val, std::string& str)
209210
{
210211
thread_local char buffer[128];
211212
auto result = std::to_chars(std::begin(buffer), std::end(buffer), val);
212213
auto ptr = result.ptr;
213214
*ptr = ',';
214215
auto len = ptr - std::begin(buffer);
215-
stream.append(buffer, len + 1);
216+
str.append(buffer, len + 1);
216217
return {buffer, static_cast<size_t>(len)};
217218
}
218219

219220
static void
220-
escape(std::string_view str, std::string& os)
221+
escape(std::string_view str, std::string& buffer)
221222
{
222223
static constexpr char HEX[] = "0123456789ABCDEF";
223224

@@ -240,36 +241,36 @@ class SimpleJsonWriter
240241

241242
// Flush the preceding safe run in one go.
242243
if (chunk != p)
243-
os.append(chunk, p - chunk);
244+
buffer.append(chunk, p - chunk);
244245

245246
switch (c)
246247
{
247248
case '"':
248-
os.append("\\\"", 2);
249+
buffer.append("\\\"", 2);
249250
break;
250251
case '\\':
251-
os.append("\\\\", 2);
252+
buffer.append("\\\\", 2);
252253
break;
253254
case '\b':
254-
os.append("\\b", 2);
255+
buffer.append("\\b", 2);
255256
break;
256257
case '\f':
257-
os.append("\\f", 2);
258+
buffer.append("\\f", 2);
258259
break;
259260
case '\n':
260-
os.append("\\n", 2);
261+
buffer.append("\\n", 2);
261262
break;
262263
case '\r':
263-
os.append("\\r", 2);
264+
buffer.append("\\r", 2);
264265
break;
265266
case '\t':
266-
os.append("\\t", 2);
267+
buffer.append("\\t", 2);
267268
break;
268269
default: {
269270
// Other C0 controls -> \u00XX (JSON compliant)
270271
char buf[6]{
271272
'\\', 'u', '0', '0', HEX[(c >> 4) & 0xF], HEX[c & 0xF]};
272-
os.append(buf, 6);
273+
buffer.append(buf, 6);
273274
break;
274275
}
275276
}
@@ -280,10 +281,10 @@ class SimpleJsonWriter
280281

281282
// Flush trailing safe run
282283
if (chunk != p)
283-
os.append(chunk, p - chunk);
284+
buffer.append(chunk, p - chunk);
284285
}
285286

286-
std::string& stream_;
287+
std::string& buffer_;
287288
};
288289

289290
} // namespace detail
@@ -369,7 +370,7 @@ class Journal
369370
std::string m_name;
370371
std::string m_attributesJson;
371372
static std::string globalLogAttributesJson_;
372-
static std::mutex globalLogAttributesMutex_;
373+
static std::shared_mutex globalLogAttributesMutex_;
373374
static bool m_jsonLogsEnabled;
374375

375376
static thread_local JsonLogContext currentJsonLogContext_;
@@ -624,14 +625,14 @@ class Journal
624625
Journal(Journal const& other, TAttributesFactory&& attributesFactory)
625626
: m_name(other.m_name), m_sink(other.m_sink)
626627
{
627-
std::string stream{other.m_attributesJson};
628-
detail::SimpleJsonWriter writer{stream};
628+
std::string buffer{other.m_attributesJson};
629+
detail::SimpleJsonWriter writer{buffer};
629630
if (other.m_attributesJson.empty())
630631
{
631632
writer.startObject();
632633
}
633634
attributesFactory(writer);
634-
m_attributesJson = std::move(stream);
635+
m_attributesJson = std::move(buffer);
635636
}
636637

637638
/** Create a journal that writes to the specified sink. */
@@ -648,11 +649,11 @@ class Journal
648649
TAttributesFactory&& attributesFactory)
649650
: m_name(name), m_sink(&sink)
650651
{
651-
std::string stream;
652-
detail::SimpleJsonWriter writer{stream};
652+
std::string buffer;
653+
detail::SimpleJsonWriter writer{buffer};
653654
writer.startObject();
654655
attributesFactory(writer);
655-
m_attributesJson = std::move(stream);
656+
m_attributesJson = std::move(buffer);
656657
}
657658

658659
Journal&
@@ -758,25 +759,25 @@ class Journal
758759
static void
759760
resetGlobalAttributes()
760761
{
761-
std::lock_guard lock(globalLogAttributesMutex_);
762+
std::unique_lock lock(globalLogAttributesMutex_);
762763
globalLogAttributesJson_.clear();
763764
}
764765

765766
template <typename TAttributesFactory>
766767
static void
767768
addGlobalAttributes(TAttributesFactory&& factory)
768769
{
769-
std::lock_guard lock(globalLogAttributesMutex_);
770+
std::unique_lock lock(globalLogAttributesMutex_);
770771

771772
auto isEmpty = globalLogAttributesJson_.empty();
772-
std::string stream{std::move(globalLogAttributesJson_)};
773-
detail::SimpleJsonWriter writer{stream};
773+
std::string buffer{std::move(globalLogAttributesJson_)};
774+
detail::SimpleJsonWriter writer{buffer};
774775
if (isEmpty)
775776
{
776777
writer.startObject();
777778
}
778779
factory(writer);
779-
globalLogAttributesJson_ = std::move(stream);
780+
globalLogAttributesJson_ = std::move(buffer);
780781
}
781782
};
782783

src/libxrpl/beast/utility/beast_Journal.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@
2222
#include <ios>
2323
#include <ostream>
2424
#include <ranges>
25+
#include <shared_mutex>
2526
#include <string>
2627
#include <thread>
2728

2829
namespace beast {
2930

3031
std::string Journal::globalLogAttributesJson_;
31-
std::mutex Journal::globalLogAttributesMutex_;
32+
std::shared_mutex Journal::globalLogAttributesMutex_;
3233
bool Journal::m_jsonLogsEnabled = false;
3334
thread_local Journal::JsonLogContext Journal::currentJsonLogContext_{};
3435

@@ -150,13 +151,16 @@ Journal::JsonLogContext::reset(
150151
writer().endObject();
151152
}
152153

153-
if (!globalLogAttributesJson_.empty())
154154
{
155-
writer().writeKey("GlobalParams");
156-
writer().writeRaw(std::string_view{
157-
std::begin(globalLogAttributesJson_),
158-
std::end(globalLogAttributesJson_)});
159-
writer().endObject();
155+
std::shared_lock lock(globalLogAttributesMutex_);
156+
if (!globalLogAttributesJson_.empty())
157+
{
158+
writer().writeKey("GlobalParams");
159+
writer().writeRaw(std::string_view{
160+
std::begin(globalLogAttributesJson_),
161+
std::end(globalLogAttributesJson_)});
162+
writer().endObject();
163+
}
160164
}
161165

162166
writer().writeKey("MessageParams");

src/tests/libxrpl/basics/log.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -231,32 +231,32 @@ TEST_CASE("Global attributes inheritable")
231231
TEST_CASE("Test JsonWriter")
232232
{
233233
{
234-
std::string stream;
235-
beast::detail::SimpleJsonWriter writer{stream};
234+
std::string buffer;
235+
beast::detail::SimpleJsonWriter writer{buffer};
236236

237237
writer.writeString("\n");
238238
CHECK(writer.finish() == "\"\\n\"");
239239
}
240240

241241
{
242-
std::string stream;
243-
beast::detail::SimpleJsonWriter writer{stream};
242+
std::string buffer;
243+
beast::detail::SimpleJsonWriter writer{buffer};
244244

245245
writer.writeString("\t");
246246
CHECK(writer.finish() == "\"\\t\"");
247247
}
248248

249249
{
250-
std::string stream;
251-
beast::detail::SimpleJsonWriter writer{stream};
250+
std::string buffer;
251+
beast::detail::SimpleJsonWriter writer{buffer};
252252

253253
writer.writeString(std::string_view{"\0", 1});
254254
CHECK(writer.finish() == "\"\\u0000\"");
255255
}
256256

257257
{
258-
std::string stream;
259-
beast::detail::SimpleJsonWriter writer{stream};
258+
std::string buffer;
259+
beast::detail::SimpleJsonWriter writer{buffer};
260260

261261
writer.writeString("\"\\");
262262
CHECK(writer.finish() == "\"\\\"\\\\\"");

0 commit comments

Comments
 (0)