1facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 2facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Copyright (C) 2016 The Android Open Source Project 3facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 4facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * you may not use this file except in compliance with the License. 6facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * You may obtain a copy of the License at 7facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 8facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 10facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Unless required by applicable law or agreed to in writing, software 11facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * See the License for the specific language governing permissions and 14facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * limitations under the License. 15facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 16facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 1781321a7980903fbdb42f6bd838445c651fd7996eMark Salyzyn#include <log/log_transport.h> 1871002885325be3a0c4a0d09a6a6ad9b14531bdd7Mark Salyzyn 19facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "config_read.h" 20facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "logger.h" 21facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 222ed51d708eda64516ec79ac6397f690de38f0075Mark SalyzynLIBLOG_HIDDEN struct listnode __android_log_transport_read = { 232ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn &__android_log_transport_read, &__android_log_transport_read 242ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn}; 252ed51d708eda64516ec79ac6397f690de38f0075Mark SalyzynLIBLOG_HIDDEN struct listnode __android_log_persist_read = { 262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn &__android_log_persist_read, &__android_log_persist_read 272ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn}; 28facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 29facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic void __android_log_add_transport( 302ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct listnode* list, struct android_log_transport_read* transport) { 312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn size_t i; 32facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* Try to keep one functioning transport for each log buffer id */ 342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn for (i = LOG_ID_MIN; i < LOG_ID_MAX; i++) { 352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct android_log_transport_read* transp; 36facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (list_empty(list)) { 382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (!transport->available || ((*transport->available)(i) >= 0)) { 392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn list_add_tail(list, &transport->node); 402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return; 412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } else { 432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn read_transport_for_each(transp, list) { 442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (!transp->available) { 452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return; 46facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (((*transp->available)(i) < 0) && 482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (!transport->available || ((*transport->available)(i) >= 0))) { 492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn list_add_tail(list, &transport->node); 502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return; 512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 53facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 55facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 56facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 57facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN void __android_log_config_read() { 5881321a7980903fbdb42f6bd838445c651fd7996eMark Salyzyn if (__android_log_transport & LOGGER_LOCAL) { 592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn extern struct android_log_transport_read localLoggerRead; 6071002885325be3a0c4a0d09a6a6ad9b14531bdd7Mark Salyzyn 612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_add_transport(&__android_log_transport_read, &localLoggerRead); 622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 6371002885325be3a0c4a0d09a6a6ad9b14531bdd7Mark Salyzyn 64facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#if (FAKE_LOG_DEVICE == 0) 6581321a7980903fbdb42f6bd838445c651fd7996eMark Salyzyn if ((__android_log_transport == LOGGER_DEFAULT) || 6681321a7980903fbdb42f6bd838445c651fd7996eMark Salyzyn (__android_log_transport & LOGGER_LOGD)) { 672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn extern struct android_log_transport_read logdLoggerRead; 682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn extern struct android_log_transport_read pmsgLoggerRead; 69facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_add_transport(&__android_log_transport_read, &logdLoggerRead); 712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_add_transport(&__android_log_persist_read, &pmsgLoggerRead); 722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 73facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif 74facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 7596432fc6655fe035d0e66e593ffaf58856e1a826Mark Salyzyn 7696432fc6655fe035d0e66e593ffaf58856e1a826Mark SalyzynLIBLOG_HIDDEN void __android_log_config_read_close() { 772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct android_log_transport_read* transport; 782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn struct listnode* n; 7996432fc6655fe035d0e66e593ffaf58856e1a826Mark Salyzyn 802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn read_transport_for_each_safe(transport, n, &__android_log_transport_read) { 812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn list_remove(&transport->node); 822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn read_transport_for_each_safe(transport, n, &__android_log_persist_read) { 842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn list_remove(&transport->node); 852ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 8696432fc6655fe035d0e66e593ffaf58856e1a826Mark Salyzyn} 87