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