blob: 0bf7aa8d8bac3b60a522a29d625bd473136cb7ed [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdlib.h>
#include <atomic>
#include <cassert>
#include <cstdarg>
#include <cstdint>
#include <cstdio>
#include <thread>
#include <lib/syslog/global.h>
#include "cutils/log.h"
#include "cutils/properties.h"
#include "cutils/threads.h"
extern "C" {
int property_get(const char* key, char* value, const char* default_value) {
return 0;
}
int __android_log_print(int priority, const char* tag, const char* format,
...) {
const char* local_tag = tag;
if (!local_tag) {
local_tag = "<NO_TAG>";
}
va_list ap;
va_start(ap, format);
switch (priority) {
case ANDROID_LOG_VERBOSE:
case ANDROID_LOG_DEBUG:
FX_LOGVF(DEBUG, local_tag, format, ap);
break;
case ANDROID_LOG_WARN:
FX_LOGVF(WARNING, local_tag, format, ap);
break;
case ANDROID_LOG_ERROR:
FX_LOGVF(ERROR, local_tag, format, ap);
break;
case ANDROID_LOG_FATAL:
FX_LOGVF(FATAL, local_tag, format, ap);
break;
case ANDROID_LOG_INFO:
default:
FX_LOGVF(INFO, local_tag, format, ap);
break;
}
return 1;
}
void __android_log_assert(const char* condition, const char* tag,
const char* format, ...) {
const char* local_tag = tag;
if (!local_tag) {
local_tag = "<NO_TAG>";
}
va_list ap;
va_start(ap, format);
FX_LOGVF(ERROR, local_tag, format, ap);
va_end(ap);
abort();
}
int sync_wait(int fd, int timeout) {
return -1;
}
void* thread_store_get(thread_store_t* store) {
return store->has_tls ? pthread_getspecific(store->tls) : nullptr;
}
void thread_store_set(thread_store_t* store,
void* value,
thread_store_destruct_t destroy) {
pthread_mutex_lock(&store->lock);
if (!store->has_tls) {
if (pthread_key_create(&store->tls, destroy) != 0) {
pthread_mutex_unlock(&store->lock);
return;
}
store->has_tls = 1;
}
pthread_mutex_unlock(&store->lock);
pthread_setspecific(store->tls, value);
}
pid_t gettid() {
static thread_local pid_t id = 0;
if (!id) {
static std::atomic<pid_t> next_thread_id{1};
id = next_thread_id++;
}
return id;
}
}