xref: /aosp_15_r20/external/aws-crt-java/src/native/logging.c (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1 /**
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  * SPDX-License-Identifier: Apache-2.0.
4  */
5 
6 #include <aws/common/logging.h>
7 
8 #include "crt.h"
9 #include "java_class_ids.h"
10 #include "logging.h"
11 
12 /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
13 #if UINTPTR_MAX == 0xffffffff
14 #    if defined(_MSC_VER)
15 #        pragma warning(push)
16 #        pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
17 #    else
18 #        pragma GCC diagnostic push
19 #        pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
20 #        pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
21 #    endif
22 #endif
23 
24 #if _MSC_VER
25 #    pragma warning(disable : 4204) /* non-constant aggregate initializer */
26 #endif
27 
28 JNIEXPORT
Java_software_amazon_awssdk_crt_Log_log(JNIEnv * env,jclass jni_class,jint jni_level,jint jni_subject,jstring jni_logstring)29 void JNICALL Java_software_amazon_awssdk_crt_Log_log(
30     JNIEnv *env,
31     jclass jni_class,
32     jint jni_level,
33     jint jni_subject,
34     jstring jni_logstring) {
35     (void)jni_class;
36     aws_cache_jni_ids(env);
37 
38     const char *raw_string = (*env)->GetStringUTFChars(env, jni_logstring, NULL);
39     AWS_LOGF((enum aws_log_level)jni_level, jni_subject, "%s", raw_string);
40     (*env)->ReleaseStringUTFChars(env, jni_logstring, raw_string);
41 }
42 
43 static struct aws_logger s_logger;
44 static bool s_initialized_logger = false;
45 
46 extern int g_memory_tracing;
47 
s_aws_init_logging_internal(JNIEnv * env,struct aws_logger_standard_options * options)48 static void s_aws_init_logging_internal(JNIEnv *env, struct aws_logger_standard_options *options) {
49     /* Clean up logger, in case it was already initialized */
50     aws_jni_cleanup_logging();
51 
52     /* NOT using aws_jni_get_allocator to avoid trace leak outside the test */
53     struct aws_allocator *allocator = aws_default_allocator();
54 
55     if (g_memory_tracing == 0) {
56         if (aws_logger_init_standard(&s_logger, allocator, options)) {
57             aws_jni_throw_runtime_exception(env, "Failed to initialize standard logger");
58             return;
59         }
60     } else {
61         if (aws_logger_init_noalloc(&s_logger, allocator, options)) {
62             aws_jni_throw_runtime_exception(env, "Failed to initialize no-alloc logger");
63             return;
64         }
65     }
66 
67     aws_logger_set(&s_logger);
68     s_initialized_logger = true;
69 }
70 
71 JNIEXPORT
Java_software_amazon_awssdk_crt_Log_initLoggingToStdout(JNIEnv * env,jclass jni_crt_class,jint level)72 void JNICALL Java_software_amazon_awssdk_crt_Log_initLoggingToStdout(JNIEnv *env, jclass jni_crt_class, jint level) {
73     (void)jni_crt_class;
74     aws_cache_jni_ids(env);
75 
76     struct aws_logger_standard_options log_options = {.level = level, .file = stdout};
77 
78     s_aws_init_logging_internal(env, &log_options);
79 }
80 
81 JNIEXPORT
Java_software_amazon_awssdk_crt_Log_initLoggingToStderr(JNIEnv * env,jclass jni_crt_class,jint level)82 void JNICALL Java_software_amazon_awssdk_crt_Log_initLoggingToStderr(JNIEnv *env, jclass jni_crt_class, jint level) {
83     (void)jni_crt_class;
84     aws_cache_jni_ids(env);
85 
86     struct aws_logger_standard_options log_options = {.level = level, .file = stderr};
87 
88     s_aws_init_logging_internal(env, &log_options);
89 }
90 
91 JNIEXPORT
Java_software_amazon_awssdk_crt_Log_initLoggingToFile(JNIEnv * env,jclass jni_crt_class,jint level,jstring jni_filename)92 void JNICALL Java_software_amazon_awssdk_crt_Log_initLoggingToFile(
93     JNIEnv *env,
94     jclass jni_crt_class,
95     jint level,
96     jstring jni_filename) {
97     (void)jni_crt_class;
98     aws_cache_jni_ids(env);
99 
100     const char *filename = (*env)->GetStringUTFChars(env, jni_filename, NULL);
101     struct aws_logger_standard_options log_options = {.level = level, .filename = filename};
102     s_aws_init_logging_internal(env, &log_options);
103     (*env)->ReleaseStringUTFChars(env, jni_filename, filename);
104 }
105 
aws_jni_cleanup_logging(void)106 void aws_jni_cleanup_logging(void) {
107     if (aws_logger_get() == &s_logger) {
108         aws_logger_set(NULL);
109     }
110 
111     if (s_initialized_logger) {
112         aws_logger_clean_up(&s_logger);
113         s_initialized_logger = false;
114     }
115 }
116 
117 #if UINTPTR_MAX == 0xffffffff
118 #    if defined(_MSC_VER)
119 #        pragma warning(pop)
120 #    else
121 #        pragma GCC diagnostic pop
122 #    endif
123 #endif
124