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