1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker *
5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker */
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Worker #include "log.h"
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard Worker #ifdef __ANDROID__
12*523fa7a6SAndroid Build Coastguard Worker
13*523fa7a6SAndroid Build Coastguard Worker #include <android/log.h>
14*523fa7a6SAndroid Build Coastguard Worker #include <functional>
15*523fa7a6SAndroid Build Coastguard Worker #include <mutex>
16*523fa7a6SAndroid Build Coastguard Worker #include <sstream>
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker using executorch::extension::log_entry;
19*523fa7a6SAndroid Build Coastguard Worker
20*523fa7a6SAndroid Build Coastguard Worker // Number of entries to store in the in-memory log buffer.
21*523fa7a6SAndroid Build Coastguard Worker const size_t log_buffer_length = 16;
22*523fa7a6SAndroid Build Coastguard Worker
23*523fa7a6SAndroid Build Coastguard Worker namespace {
24*523fa7a6SAndroid Build Coastguard Worker std::vector<log_entry> log_buffer_;
25*523fa7a6SAndroid Build Coastguard Worker std::mutex log_buffer_mutex_;
26*523fa7a6SAndroid Build Coastguard Worker } // namespace
27*523fa7a6SAndroid Build Coastguard Worker
28*523fa7a6SAndroid Build Coastguard Worker // For Android, write to logcat
et_pal_emit_log_message(et_timestamp_t timestamp,et_pal_log_level_t level,const char * filename,const char * function,size_t line,const char * message,size_t length)29*523fa7a6SAndroid Build Coastguard Worker void et_pal_emit_log_message(
30*523fa7a6SAndroid Build Coastguard Worker et_timestamp_t timestamp,
31*523fa7a6SAndroid Build Coastguard Worker et_pal_log_level_t level,
32*523fa7a6SAndroid Build Coastguard Worker const char* filename,
33*523fa7a6SAndroid Build Coastguard Worker const char* function,
34*523fa7a6SAndroid Build Coastguard Worker size_t line,
35*523fa7a6SAndroid Build Coastguard Worker const char* message,
36*523fa7a6SAndroid Build Coastguard Worker size_t length) {
37*523fa7a6SAndroid Build Coastguard Worker std::lock_guard<std::mutex> guard(log_buffer_mutex_);
38*523fa7a6SAndroid Build Coastguard Worker
39*523fa7a6SAndroid Build Coastguard Worker while (log_buffer_.size() >= log_buffer_length) {
40*523fa7a6SAndroid Build Coastguard Worker log_buffer_.erase(log_buffer_.begin());
41*523fa7a6SAndroid Build Coastguard Worker }
42*523fa7a6SAndroid Build Coastguard Worker
43*523fa7a6SAndroid Build Coastguard Worker log_buffer_.emplace_back(
44*523fa7a6SAndroid Build Coastguard Worker timestamp, level, filename, function, line, message, length);
45*523fa7a6SAndroid Build Coastguard Worker
46*523fa7a6SAndroid Build Coastguard Worker int android_log_level = ANDROID_LOG_UNKNOWN;
47*523fa7a6SAndroid Build Coastguard Worker if (level == 'D') {
48*523fa7a6SAndroid Build Coastguard Worker android_log_level = ANDROID_LOG_DEBUG;
49*523fa7a6SAndroid Build Coastguard Worker } else if (level == 'I') {
50*523fa7a6SAndroid Build Coastguard Worker android_log_level = ANDROID_LOG_INFO;
51*523fa7a6SAndroid Build Coastguard Worker } else if (level == 'E') {
52*523fa7a6SAndroid Build Coastguard Worker android_log_level = ANDROID_LOG_ERROR;
53*523fa7a6SAndroid Build Coastguard Worker } else if (level == 'F') {
54*523fa7a6SAndroid Build Coastguard Worker android_log_level = ANDROID_LOG_FATAL;
55*523fa7a6SAndroid Build Coastguard Worker }
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Worker __android_log_print(android_log_level, "ExecuTorch", "%s", message);
58*523fa7a6SAndroid Build Coastguard Worker }
59*523fa7a6SAndroid Build Coastguard Worker
60*523fa7a6SAndroid Build Coastguard Worker namespace executorch::extension {
61*523fa7a6SAndroid Build Coastguard Worker
access_log_buffer(std::function<void (std::vector<log_entry> &)> accessor)62*523fa7a6SAndroid Build Coastguard Worker void access_log_buffer(std::function<void(std::vector<log_entry>&)> accessor) {
63*523fa7a6SAndroid Build Coastguard Worker std::lock_guard<std::mutex> guard(log_buffer_mutex_);
64*523fa7a6SAndroid Build Coastguard Worker accessor(log_buffer_);
65*523fa7a6SAndroid Build Coastguard Worker }
66*523fa7a6SAndroid Build Coastguard Worker
67*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch::extension
68*523fa7a6SAndroid Build Coastguard Worker
69*523fa7a6SAndroid Build Coastguard Worker #endif
70