summaryrefslogtreecommitdiff
path: root/absl/base
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2023-07-13 13:05:05 -0700
committerGravatar Copybara-Service <copybara-worker@google.com>2023-07-13 13:05:57 -0700
commitc16a2f43206b0235d49d4f6155f285a4d4939c58 (patch)
tree1e9931334ce46bdbaba59ef12585924d843df24f /absl/base
parentb8ebbc2ecadb64239dc0767b55296ab9c4510b0f (diff)
Use new emscripten_errn to avoid copying strings.
PiperOrigin-RevId: 547895328 Change-Id: If5da952604415fa6ed2402052f80add6c4b7dfb3
Diffstat (limited to 'absl/base')
-rw-r--r--absl/base/internal/raw_logging.cc27
1 files changed, 16 insertions, 11 deletions
diff --git a/absl/base/internal/raw_logging.cc b/absl/base/internal/raw_logging.cc
index c866d957..4c922ccf 100644
--- a/absl/base/internal/raw_logging.cc
+++ b/absl/base/internal/raw_logging.cc
@@ -206,27 +206,32 @@ void DefaultInternalLog(absl::LogSeverity severity, const char* file, int line,
} // namespace
void AsyncSignalSafeWriteError(const char* s, size_t len) {
+ if (!len) return;
absl::base_internal::ErrnoSaver errno_saver;
#if defined(__EMSCRIPTEN__)
// In WebAssembly, bypass filesystem emulation via fwrite.
- // TODO(b/282811932): Avoid this copy if these emscripten functions can
- // be updated to accept size directly.
+ if (s[len - 1] == '\n') {
+ // Skip a trailing newline character as emscripten_errn adds one itself.
+ len--;
+ }
+ // emscripten_errn was introduced in 3.1.41 but broken in standalone mode
+ // until 3.1.43.
+#if ABSL_INTERNAL_EMSCRIPTEN_VERSION >= 3001043
+ emscripten_errn(s, len);
+#else
char buf[kLogBufSize];
if (len >= kLogBufSize) {
len = kLogBufSize - 1;
- size_t trunc_len = sizeof(kTruncated) - 2;
- strncpy(buf + len - trunc_len, kTruncated, trunc_len);
+ constexpr size_t trunc_len = sizeof(kTruncated) - 2;
+ memcpy(buf + len - trunc_len, kTruncated, trunc_len);
buf[len] = '\0';
len -= trunc_len;
- } else if (len && s[len - 1] == '\n') {
- len--;
- }
- strncpy(buf, s, len);
- if (len) {
+ } else {
buf[len] = '\0';
- // Skip a trailing newline character as emscripten_err adds one itself.
- _emscripten_err(buf);
}
+ memcpy(buf, s, len);
+ _emscripten_err(buf);
+#endif
#elif defined(ABSL_HAVE_SYSCALL_WRITE)
// We prefer calling write via `syscall` to minimize the risk of libc doing
// something "helpful".