From 81f407be3621988a791b175c88a4b7f2ca2dead5 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Thu, 25 Feb 2016 09:02:09 -0800 Subject: [PATCH] liblog: __android_log_error_write use event list library Switch to the event list library to compose the associated event. SideEffects: Instead of composing event on a stack buffer of 512 bytes in size, a PAGE is allocated temporarily. Bug: 27356456 Change-Id: Ic15a87f49385834c2287ed82c26439b2c5eb4f77 --- liblog/Android.mk | 9 ++--- liblog/log_event_write.c | 81 ++++++++++------------------------------ 2 files changed, 24 insertions(+), 66 deletions(-) diff --git a/liblog/Android.mk b/liblog/Android.mk index c7b76d87a..dd5b518e7 100644 --- a/liblog/Android.mk +++ b/liblog/Android.mk @@ -24,11 +24,10 @@ include $(CLEAR_VARS) # so make sure we do not regret hard-coding it as follows: liblog_cflags := -DLIBLOG_LOG_TAG=1005 -liblog_host_sources := logd_write.c log_event_write.c fake_log_device.c event.logtags -liblog_target_sources := logd_write.c log_event_write.c event_tag_map.c log_time.cpp log_is_loggable.c -liblog_target_sources += logprint.c -liblog_target_sources += log_read.c -liblog_target_sources += log_event_list.c +liblog_sources := logd_write.c log_event_list.c log_event_write.c +liblog_host_sources := $(liblog_sources) fake_log_device.c event.logtags +liblog_target_sources := $(liblog_sources) event_tag_map.c +liblog_target_sources += log_time.cpp log_is_loggable.c logprint.c log_read.c # Shared and static library for host # ======================================================== diff --git a/liblog/log_event_write.c b/liblog/log_event_write.c index 0bc42d548..ad42edd30 100644 --- a/liblog/log_event_write.c +++ b/liblog/log_event_write.c @@ -15,74 +15,33 @@ */ #include -#include #include -#include -#define MAX_EVENT_PAYLOAD 512 #define MAX_SUBTAG_LEN 32 -static inline void copy4LE(uint8_t *buf, size_t pos, int val) +int __android_log_error_write(int tag, const char *subTag, int32_t uid, + const char *data, uint32_t dataLen) { - buf[pos] = val & 0xFF; - buf[pos+1] = (val >> 8) & 0xFF; - buf[pos+2] = (val >> 16) & 0xFF; - buf[pos+3] = (val >> 24) & 0xFF; -} + int ret = -EINVAL; -int __android_log_error_write(int tag, const char *subTag, int32_t uid, const char *data, - uint32_t dataLen) -{ - uint8_t buf[MAX_EVENT_PAYLOAD]; - size_t pos = 0; - uint32_t subTagLen = 0; - uint32_t roomLeftForData = 0; + if (subTag && (data || !dataLen)) { + android_log_context ctx = create_android_logger(tag); - if ((subTag == NULL) || ((data == NULL) && (dataLen != 0))) return -EINVAL; - - subTagLen = strlen(subTag); - - // Truncate subtags that are too long. - subTagLen = subTagLen > MAX_SUBTAG_LEN ? MAX_SUBTAG_LEN : subTagLen; - - // Truncate dataLen if it is too long. - roomLeftForData = MAX_EVENT_PAYLOAD - - (1 + // EVENT_TYPE_LIST - 1 + // Number of elements in list - 1 + // EVENT_TYPE_STRING - sizeof(subTagLen) + - subTagLen + - 1 + // EVENT_TYPE_INT - sizeof(uid) + - 1 + // EVENT_TYPE_STRING - sizeof(dataLen)); - dataLen = dataLen > roomLeftForData ? roomLeftForData : dataLen; - - buf[pos++] = EVENT_TYPE_LIST; - buf[pos++] = 3; // Number of elements in the list (subTag, uid, data) - - // Write sub tag. - buf[pos++] = EVENT_TYPE_STRING; - copy4LE(buf, pos, subTagLen); - pos += 4; - memcpy(&buf[pos], subTag, subTagLen); - pos += subTagLen; - - // Write UID. - buf[pos++] = EVENT_TYPE_INT; - copy4LE(buf, pos, uid); - pos += 4; - - // Write data. - buf[pos++] = EVENT_TYPE_STRING; - copy4LE(buf, pos, dataLen); - pos += 4; - if (dataLen != 0) - { - memcpy(&buf[pos], data, dataLen); - pos += dataLen; + ret = -ENOMEM; + if (ctx) { + ret = android_log_write_string8_len(ctx, subTag, MAX_SUBTAG_LEN); + if (ret >= 0) { + ret = android_log_write_int32(ctx, uid); + if (ret >= 0) { + ret = android_log_write_string8_len(ctx, data, dataLen); + if (ret >= 0) { + ret = android_log_write_list(ctx, LOG_ID_EVENTS); + } + } + } + android_log_destroy(&ctx); + } } - - return __android_log_bwrite(tag, buf, pos); + return ret; }