Skip to content

Commit c16a2f4

Browse files
Abseil Teamcopybara-github
authored andcommitted
Use new emscripten_errn to avoid copying strings.
PiperOrigin-RevId: 547895328 Change-Id: If5da952604415fa6ed2402052f80add6c4b7dfb3
1 parent b8ebbc2 commit c16a2f4

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

absl/base/internal/raw_logging.cc

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -206,27 +206,32 @@ void DefaultInternalLog(absl::LogSeverity severity, const char* file, int line,
206206
} // namespace
207207

208208
void AsyncSignalSafeWriteError(const char* s, size_t len) {
209+
if (!len) return;
209210
absl::base_internal::ErrnoSaver errno_saver;
210211
#if defined(__EMSCRIPTEN__)
211212
// In WebAssembly, bypass filesystem emulation via fwrite.
212-
// TODO(b/282811932): Avoid this copy if these emscripten functions can
213-
// be updated to accept size directly.
213+
if (s[len - 1] == '\n') {
214+
// Skip a trailing newline character as emscripten_errn adds one itself.
215+
len--;
216+
}
217+
// emscripten_errn was introduced in 3.1.41 but broken in standalone mode
218+
// until 3.1.43.
219+
#if ABSL_INTERNAL_EMSCRIPTEN_VERSION >= 3001043
220+
emscripten_errn(s, len);
221+
#else
214222
char buf[kLogBufSize];
215223
if (len >= kLogBufSize) {
216224
len = kLogBufSize - 1;
217-
size_t trunc_len = sizeof(kTruncated) - 2;
218-
strncpy(buf + len - trunc_len, kTruncated, trunc_len);
225+
constexpr size_t trunc_len = sizeof(kTruncated) - 2;
226+
memcpy(buf + len - trunc_len, kTruncated, trunc_len);
219227
buf[len] = '\0';
220228
len -= trunc_len;
221-
} else if (len && s[len - 1] == '\n') {
222-
len--;
223-
}
224-
strncpy(buf, s, len);
225-
if (len) {
229+
} else {
226230
buf[len] = '\0';
227-
// Skip a trailing newline character as emscripten_err adds one itself.
228-
_emscripten_err(buf);
229231
}
232+
memcpy(buf, s, len);
233+
_emscripten_err(buf);
234+
#endif
230235
#elif defined(ABSL_HAVE_SYSCALL_WRITE)
231236
// We prefer calling write via `syscall` to minimize the risk of libc doing
232237
// something "helpful".

absl/log/internal/globals.cc

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <atomic>
1818
#include <cstdio>
19+
1920
#if defined(__EMSCRIPTEN__)
2021
#include <emscripten/console.h>
2122
#endif
@@ -25,6 +26,7 @@
2526
#include "absl/base/internal/raw_logging.h"
2627
#include "absl/base/log_severity.h"
2728
#include "absl/strings/string_view.h"
29+
#include "absl/strings/strip.h"
2830
#include "absl/time/time.h"
2931

3032
namespace absl {
@@ -58,16 +60,19 @@ void SetInitialized() {
5860
}
5961

6062
void WriteToStderr(absl::string_view message, absl::LogSeverity severity) {
63+
if (message.empty()) return;
6164
#if defined(__EMSCRIPTEN__)
6265
// In WebAssembly, bypass filesystem emulation via fwrite.
63-
// TODO(b/282811932): Avoid this copy if these emscripten functions can
64-
// be updated to accept size directly.
65-
std::string null_terminated_message(message);
66-
if (!null_terminated_message.empty() &&
67-
null_terminated_message.back() == '\n') {
68-
null_terminated_message.pop_back();
69-
}
66+
// Skip a trailing newline character as emscripten_errn adds one itself.
67+
const auto message_minus_newline = absl::StripSuffix(message, "\n");
68+
// emscripten_errn was introduced in 3.1.41 but broken in standalone mode
69+
// until 3.1.43.
70+
#if ABSL_INTERNAL_EMSCRIPTEN_VERSION >= 3001043
71+
emscripten_errn(message_minus_newline.data(), message_minus_newline.size());
72+
#else
73+
std::string null_terminated_message(message_minus_newline);
7074
_emscripten_err(null_terminated_message.c_str());
75+
#endif
7176
#else
7277
// Avoid using std::cerr from this module since we may get called during
7378
// exit code, and cerr may be partially or fully destroyed by then.

0 commit comments

Comments
 (0)