EventLog.cpp revision 85cce376cbeecb185ba485c69643bfabe72fe794
185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian/*
285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * Copyright 2013 The Android Open Source Project
385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian *
485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * you may not use this file except in compliance with the License.
685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * You may obtain a copy of the License at
785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian *
885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian *
1085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * See the License for the specific language governing permissions and
1485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian * limitations under the License.
1585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian */
1685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
1785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian#include <stdio.h>
1885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian#include <stdlib.h>
1985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian#include <cutils/log.h>
2085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian#include <utils/String8.h>
2185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
2285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian#include "EventLog.h"
2385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
2485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
2585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopiannamespace android {
2685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
2785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
2885cce376cbeecb185ba485c69643bfabe72fe794Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(EventLog)
2985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
3085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
3185cce376cbeecb185ba485c69643bfabe72fe794Mathias AgopianEventLog::EventLog() {
3285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
3385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
3485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::doLogJank(const String8& window, int32_t value) {
3585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    EventLog::TagBuffer buffer(LOGTAG_SF_JANK);
3685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.startList(2);
3785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.writeString8(window);
3885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.writeInt32(value);
3985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.endList();
4085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.log();
4185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
4285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
4385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::logJank(const String8& window, int32_t value) {
4485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    EventLog::getInstance().doLogJank(window, value);
4585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
4685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
4785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
4885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
4985cce376cbeecb185ba485c69643bfabe72fe794Mathias AgopianEventLog::TagBuffer::TagBuffer(int32_t tag)
5085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    : mPos(0), mTag(tag), mOverflow(false) {
5185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
5285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
5385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::log() {
5485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) {
5585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        ALOGW("couldn't log to binary event log: overflow.");
5685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    } else if (android_bWriteLog(mTag, mStorage, mPos) < 0) {
5785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        ALOGE("couldn't log to EventLog: %s", strerror(errno));
5885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
5985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    // purge the buffer
6085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos = 0;
6185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mOverflow = false;
6285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
6385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
6485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::startList(int8_t count) {
6585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
6685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(count);
6785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
6885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
6985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
7085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
7185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_LIST;
7285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 1] = count;
7385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
7485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
7585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
7685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::endList() {
7785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
7885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1;
7985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
8085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
8185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
8285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
8385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = '\n';
8485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
8585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
8685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
8785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeInt32(int32_t value) {
8885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
8985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(value);
9085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
9185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
9285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
9385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
9485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_INT;
9585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &value, sizeof(value));
9685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
9785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
9885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
9985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeInt64(int64_t value) {
10085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
10185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(value);
10285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
10385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
10485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
10585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
10685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_LONG;
10785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &value, sizeof(value));
10885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
10985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
11085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
11185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeString8(const String8& value) {
11285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
11385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const int32_t stringLen = value.length();
11485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(int32_t) + stringLen;
11585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
11685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
11785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
11885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
11985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_STRING;
12085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &stringLen, sizeof(int32_t));
12185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 5], value.string(), stringLen);
12285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
12385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
12485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
12585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
12685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}// namespace android
12785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
12885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
129