16f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten/* 26f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Copyright (C) 2013 The Android Open Source Project 36f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * 46f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 56f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * you may not use this file except in compliance with the License. 66f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * You may obtain a copy of the License at 76f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * 86f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 96f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * 106f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Unless required by applicable law or agreed to in writing, software 116f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 126f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * See the License for the specific language governing permissions and 146f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * limitations under the License. 156f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten */ 166f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 176f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#define LOG_TAG "MediaLog" 186f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten//#define LOG_NDEBUG 0 196f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 206f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <sys/mman.h> 216f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <utils/Log.h> 22bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten#include <binder/PermissionCache.h> 236f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <media/nbaio/NBLog.h> 246f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <private/android_filesystem_config.h> 256f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include "MediaLogService.h" 266f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 276f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastennamespace android { 286f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 296f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenvoid MediaLogService::registerWriter(const sp<IMemory>& shared, size_t size, const char *name) 306f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{ 316f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten if (IPCThreadState::self()->getCallingUid() != AID_MEDIA || shared == 0 || 326f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten size < kMinSize || size > kMaxSize || name == NULL || 336f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten shared->size() < NBLog::Timeline::sharedSize(size)) { 346f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten return; 356f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 366f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten sp<NBLog::Reader> reader(new NBLog::Reader(size, shared)); 376f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten NamedReader namedReader(reader, name); 386f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten Mutex::Autolock _l(mLock); 396f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten mNamedReaders.add(namedReader); 406f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten} 416f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 426f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenvoid MediaLogService::unregisterWriter(const sp<IMemory>& shared) 436f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{ 446f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten if (IPCThreadState::self()->getCallingUid() != AID_MEDIA || shared == 0) { 456f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten return; 466f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 476f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten Mutex::Autolock _l(mLock); 486f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten for (size_t i = 0; i < mNamedReaders.size(); ) { 496f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten if (mNamedReaders[i].reader()->isIMemory(shared)) { 506f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten mNamedReaders.removeAt(i); 516f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } else { 526f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten i++; 536f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 546f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 556f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten} 566f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 570f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenstatus_t MediaLogService::dump(int fd, const Vector<String16>& args __unused) 586f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{ 59bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten // FIXME merge with similar but not identical code at services/audioflinger/ServiceUtilities.cpp 60bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten static const String16 sDump("android.permission.DUMP"); 61bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten if (!(IPCThreadState::self()->getCallingUid() == AID_MEDIA || 62bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten PermissionCache::checkCallingPermission(sDump))) { 638b5f642eb2364ea7fe46a5b3af51b48b58f12183Elliott Hughes dprintf(fd, "Permission Denial: can't dump media.log from pid=%d, uid=%d\n", 645ea77ae380a7ad9268fdbda1d7d3aa14b5839065Glenn Kasten IPCThreadState::self()->getCallingPid(), 655ea77ae380a7ad9268fdbda1d7d3aa14b5839065Glenn Kasten IPCThreadState::self()->getCallingUid()); 66bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten return NO_ERROR; 67bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten } 68bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten 696f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten Vector<NamedReader> namedReaders; 706f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten { 716f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten Mutex::Autolock _l(mLock); 726f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten namedReaders = mNamedReaders; 736f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 746f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten for (size_t i = 0; i < namedReaders.size(); i++) { 756f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten const NamedReader& namedReader = namedReaders[i]; 766f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten if (fd >= 0) { 778b5f642eb2364ea7fe46a5b3af51b48b58f12183Elliott Hughes dprintf(fd, "\n%s:\n", namedReader.name()); 786f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } else { 796f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten ALOGI("%s:", namedReader.name()); 806f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 816f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten namedReader.reader()->dump(fd, 0 /*indent*/); 826f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten } 836f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten return NO_ERROR; 846f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten} 856f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 866f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenstatus_t MediaLogService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, 876f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten uint32_t flags) 886f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{ 896f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten return BnMediaLogService::onTransact(code, data, reply, flags); 906f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten} 916f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten 926f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten} // namespace android 93