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
346547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid EventLog::doLogFrameDurations(const String8& window,
356547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis        const int32_t* durations, size_t numDurations) {
366547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    EventLog::TagBuffer buffer(LOGTAG_SF_FRAME_DUR);
376547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    buffer.startList(1 + numDurations);
3885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.writeString8(window);
396547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    for (size_t i = 0; i < numDurations; i++) {
406547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis        buffer.writeInt32(durations[i]);
416547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    }
4285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.endList();
4385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    buffer.log();
4485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
4585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid EventLog::logFrameDurations(const String8& window,
476547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis        const int32_t* durations, size_t numDurations) {
486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis    EventLog::getInstance().doLogFrameDurations(window, durations,
496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis            numDurations);
5085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
5185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
5285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
5385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
5485cce376cbeecb185ba485c69643bfabe72fe794Mathias AgopianEventLog::TagBuffer::TagBuffer(int32_t tag)
5585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    : mPos(0), mTag(tag), mOverflow(false) {
5685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
5785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
5885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::log() {
5985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) {
6085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        ALOGW("couldn't log to binary event log: overflow.");
6185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    } else if (android_bWriteLog(mTag, mStorage, mPos) < 0) {
6285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        ALOGE("couldn't log to EventLog: %s", strerror(errno));
6385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
6485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    // purge the buffer
6585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos = 0;
6685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mOverflow = false;
6785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
6885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
6985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::startList(int8_t count) {
7085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
7185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(count);
7285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
7385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
7485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
7585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
7685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_LIST;
7785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 1] = count;
7885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
7985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
8085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
8185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::endList() {
8285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
8385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1;
8485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
8585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
8685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
8785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
8885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = '\n';
8985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
9085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
9185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
9285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeInt32(int32_t value) {
9385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
9485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(value);
9585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
9685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
9785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
9885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
9985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_INT;
10085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &value, sizeof(value));
10185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
10285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
10385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
10485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeInt64(int64_t value) {
10585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
10685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(value);
10785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
10885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
10985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
11085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
11185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_LONG;
11285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &value, sizeof(value));
11385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
11485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
11585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
11685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopianvoid EventLog::TagBuffer::writeString8(const String8& value) {
11785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mOverflow) return;
11885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const int32_t stringLen = value.length();
11985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    const size_t needed = 1 + sizeof(int32_t) + stringLen;
12085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    if (mPos + needed > STORAGE_MAX_SIZE) {
12185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        mOverflow = true;
12285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian        return;
12385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    }
12485cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mStorage[mPos + 0] = EVENT_TYPE_STRING;
12585cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 1], &stringLen, sizeof(int32_t));
12685cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    memcpy(&mStorage[mPos + 5], value.string(), stringLen);
12785cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian    mPos += needed;
12885cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}
12985cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
13085cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
13185cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian}// namespace android
13285cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian
13385cce376cbeecb185ba485c69643bfabe72fe794Mathias Agopian// ---------------------------------------------------------------------------
134