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