David Reveman | 74e99bb | 2019-02-15 18:47:25 -0500 | [diff] [blame] | 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 "cutils/log.h" |
| 15 | #include "cutils/properties.h" |
| 16 | #include "cutils/threads.h" |
| 17 | |
| 18 | extern "C" { |
| 19 | |
| 20 | int property_get(const char* key, char* value, const char* default_value) { |
| 21 | return 0; |
| 22 | } |
| 23 | |
| 24 | int __android_log_print(int priority, const char* tag, const char* format, |
| 25 | ...) { |
| 26 | if (priority == ANDROID_LOG_VERBOSE || priority == ANDROID_LOG_DEBUG) { |
| 27 | return 1; |
| 28 | } |
| 29 | const char* local_tag = tag; |
| 30 | if (!local_tag) { |
| 31 | local_tag = "<NO_TAG>"; |
| 32 | } |
| 33 | printf("%d %s ", priority, local_tag); |
| 34 | va_list ap; |
| 35 | va_start(ap, format); |
| 36 | vprintf(format, ap); |
| 37 | va_end(ap); |
| 38 | printf("\n"); |
| 39 | return 1; |
| 40 | } |
| 41 | |
| 42 | void __android_log_assert(const char* condition, const char* tag, |
| 43 | const char* format, ...) { |
| 44 | const char* local_tag = tag; |
| 45 | if (!local_tag) { |
| 46 | local_tag = "<NO_TAG>"; |
| 47 | } |
| 48 | printf("__android_log_assert: condition: %s tag: %s ", condition, local_tag); |
| 49 | if (format) { |
| 50 | va_list ap; |
| 51 | va_start(ap, format); |
| 52 | vprintf(format, ap); |
| 53 | va_end(ap); |
| 54 | } |
| 55 | printf("\n"); |
| 56 | |
| 57 | assert(0); |
| 58 | exit(-1); |
| 59 | } |
| 60 | |
| 61 | int sync_wait(int fd, int timeout) { |
| 62 | return -1; |
| 63 | } |
| 64 | |
| 65 | void* thread_store_get(thread_store_t* store) { |
| 66 | return store->has_tls ? pthread_getspecific(store->tls) : nullptr; |
| 67 | } |
| 68 | |
| 69 | void thread_store_set(thread_store_t* store, |
| 70 | void* value, |
| 71 | thread_store_destruct_t destroy) { |
| 72 | pthread_mutex_lock(&store->lock); |
| 73 | if (!store->has_tls) { |
| 74 | if (pthread_key_create(&store->tls, destroy) != 0) { |
| 75 | pthread_mutex_unlock(&store->lock); |
| 76 | return; |
| 77 | } |
| 78 | store->has_tls = 1; |
| 79 | } |
| 80 | pthread_mutex_unlock(&store->lock); |
| 81 | pthread_setspecific(store->tls, value); |
| 82 | } |
| 83 | |
| 84 | pid_t gettid() { |
| 85 | static thread_local pid_t id = 0; |
| 86 | if (!id) { |
| 87 | static std::atomic<pid_t> next_thread_id{1}; |
| 88 | id = next_thread_id++; |
| 89 | } |
| 90 | return id; |
| 91 | } |
| 92 | |
| 93 | } |