1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stdlib.h>
6
7 #include <atomic>
8 #include <cassert>
9 #include <cstdarg>
10 #include <cstdint>
11 #include <cstdio>
12 #include <thread>
13
14 #include <lib/syslog/global.h>
15
16 #include "cutils/log.h"
17 #include "cutils/properties.h"
18 #include "cutils/threads.h"
19
20 extern "C" {
21
property_get(const char * key,char * value,const char * default_value)22 int property_get(const char* key, char* value, const char* default_value) {
23 return 0;
24 }
25
__android_log_print(int priority,const char * tag,const char * format,...)26 int __android_log_print(int priority, const char* tag, const char* format,
27 ...) {
28 if (priority == ANDROID_LOG_VERBOSE || priority == ANDROID_LOG_DEBUG) {
29 return 1;
30 }
31 const char* local_tag = tag;
32 if (!local_tag) {
33 local_tag = "<NO_TAG>";
34 }
35 va_list ap;
36 va_start(ap, format);
37 switch (priority) {
38 case ANDROID_LOG_WARN:
39 FX_LOGVF(WARNING, local_tag, format, ap);
40 break;
41 case ANDROID_LOG_ERROR:
42 case ANDROID_LOG_FATAL:
43 FX_LOGVF(ERROR, local_tag, format, ap);
44 break;
45 case ANDROID_LOG_INFO:
46 default:
47 FX_LOGVF(INFO, local_tag, format, ap);
48 break;
49 }
50 return 1;
51 }
52
__android_log_assert(const char * condition,const char * tag,const char * format,...)53 void __android_log_assert(const char* condition, const char* tag,
54 const char* format, ...) {
55 const char* local_tag = tag;
56 if (!local_tag) {
57 local_tag = "<NO_TAG>";
58 }
59 va_list ap;
60 va_start(ap, format);
61 FX_LOGVF(ERROR, local_tag, format, ap);
62 va_end(ap);
63
64 abort();
65 }
66
sync_wait(int fd,int timeout)67 int sync_wait(int fd, int timeout) {
68 return -1;
69 }
70
thread_store_get(thread_store_t * store)71 void* thread_store_get(thread_store_t* store) {
72 return store->has_tls ? pthread_getspecific(store->tls) : nullptr;
73 }
74
thread_store_set(thread_store_t * store,void * value,thread_store_destruct_t destroy)75 void thread_store_set(thread_store_t* store,
76 void* value,
77 thread_store_destruct_t destroy) {
78 pthread_mutex_lock(&store->lock);
79 if (!store->has_tls) {
80 if (pthread_key_create(&store->tls, destroy) != 0) {
81 pthread_mutex_unlock(&store->lock);
82 return;
83 }
84 store->has_tls = 1;
85 }
86 pthread_mutex_unlock(&store->lock);
87 pthread_setspecific(store->tls, value);
88 }
89
gettid()90 pid_t gettid() {
91 static thread_local pid_t id = 0;
92 if (!id) {
93 static std::atomic<pid_t> next_thread_id{1};
94 id = next_thread_id++;
95 }
96 return id;
97 }
98
99 }
100