Merge "Add a function to pass byte array to the log context."

This commit is contained in:
yaochen 2018-12-07 03:11:02 +00:00 committed by Gerrit Code Review
commit 0db6f49cad
2 changed files with 53 additions and 1 deletions

View file

@ -26,7 +26,7 @@ void reset_log_context(android_log_context ctx);
int write_to_logger(android_log_context context, log_id_t id); int write_to_logger(android_log_context context, log_id_t id);
void note_log_drop(); void note_log_drop();
void stats_log_close(); void stats_log_close();
int android_log_write_char_array(android_log_context ctx, const char* value, size_t len);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
@ -244,6 +244,14 @@ class stats_event_list {
return ret >= 0; return ret >= 0;
} }
bool AppendCharArray(const char* value, size_t len) {
int retval = android_log_write_char_array(ctx, value, len);
if (retval < 0) {
ret = retval;
}
return ret >= 0;
}
android_log_list_element read() { return android_log_read_next(ctx); } android_log_list_element read() { return android_log_read_next(ctx); }
android_log_list_element peek() { return android_log_peek_next(ctx); } android_log_list_element peek() { return android_log_peek_next(ctx); }
}; };

View file

@ -193,3 +193,47 @@ static int __write_to_statsd_init(struct iovec* vec, size_t nr) {
errno = save_errno; errno = save_errno;
return ret; return ret;
} }
static inline void copy4LE(uint8_t* buf, uint32_t val) {
buf[0] = val & 0xFF;
buf[1] = (val >> 8) & 0xFF;
buf[2] = (val >> 16) & 0xFF;
buf[3] = (val >> 24) & 0xFF;
}
// Note: this function differs from android_log_write_string8_len in that the length passed in
// should be treated as actual length and not max length.
int android_log_write_char_array(android_log_context ctx, const char* value, size_t actual_len) {
size_t needed;
ssize_t len = actual_len;
android_log_context_internal* context;
context = (android_log_context_internal*)ctx;
if (!context || (kAndroidLoggerWrite != context->read_write_flag)) {
return -EBADF;
}
if (context->overflow) {
return -EIO;
}
if (!value) {
value = "";
len = 0;
}
needed = sizeof(uint8_t) + sizeof(int32_t) + len;
if ((context->pos + needed) > MAX_EVENT_PAYLOAD) {
/* Truncate string for delivery */
len = MAX_EVENT_PAYLOAD - context->pos - 1 - sizeof(int32_t);
if (len <= 0) {
context->overflow = true;
return -EIO;
}
}
context->count[context->list_nest_depth]++;
context->storage[context->pos + 0] = EVENT_TYPE_STRING;
copy4LE(&context->storage[context->pos + 1], len);
if (len) {
memcpy(&context->storage[context->pos + 5], value, len);
}
context->pos += needed;
return len;
}